From: Vladislav B. <vs...@vl...> - 2011-08-09 01:27:11
|
Hi, Bag...@em..., on 08/08/2011 12:47 PM wrote: > Hi All, > > My name is kumar,i am a developer and basically using the iscsi-scst 2.0.0 > stack with mutli target configuration. On my experimentation when I register > the stack to an external microsoft(2008) isns server. The server is discovering > only one iscsi target (though my config has many). > > When i back traced the issue,i am able to figured out that the isns device > registeration is having a problem.The DevAttributeReg request from iscsi-scst is > failing with a response code "source unknown" from the Microsoft isns server. > > Issue: > ------------ > The DevRegAttribute is sending a different Source Attribute (ISCSI name) which > represents the Storage Node for each target. So Microsoft isns server considers > the last request as the storage node and doesn't discover the previous targets. > > Root Cause > ---------------- > Function ISNS_FUNC_DEV_ATTR_REG > > Target A > Source attribute > ISCSI-Name = <IQN A Name> > Operating Attribute > ISCSI-Name = <IQN A Name> > Flags > Replace Access = 1 > > Target B > Source attribute > ISCSI-Name = <IQN B Name> > Operating Attribute > ISCSI-Name = <IQN B Name> > Replace Access = 1 > > So as per the request format Microsoft isns Server always takes the last target > as the source node. and register the same. Hence it doesn't discover the > targets other than last one. The Source Attribute has to be fixed for all targets. It > would be better if we use the first target iscsi name (rather than the last target > iscsi name) as source attribute iscsi name to represent the storage node. > > Patch > ------- > > +diff -Naur iscsi-scst-2.0.0-3461.old/usr/isns.c iscsi-scst-2.0.0-3461/usr/isns.c > +--- iscsi-scst-2.0.0-3461.old/usr/isns.c 2011-04-14 23:13:04.000000000 -0400 > ++++ iscsi-scst-2.0.0-3461/usr/isns.c 2011-08-03 09:40:04.000000000 -0400 > +@@ -502,7 +502,7 @@ > + tlv = (struct isns_tlv *)hdr->pdu; > + max_buf = sizeof(buf) - offsetof(struct isns_hdr, pdu); > + > +- target = list_entry(targets_list.q_back, struct target, tlist); > ++ target = list_entry(targets_list.q_forw, struct target, tlist); > + > + err = isns_tlv_set(&tlv, max_buf - length, ISNS_ATTR_ISCSI_NAME, > + strlen(target->name) + 1, target->name); > > > Please let me know your inputs on the above issue. It looks reasonable, but it's rather a workaround. For instance, what would happen, if the first target was removed? Therefore, I'd suggest instead to create a new sysfs attribute isns_entity_name and by default set it in the name of the first registered target, if isns_entity_name was not yet manually set using sysfs before. Then we will have persistent iSNS entity name in all circumstances as required. Thanks, Vlad |