[stgt] [PATCH] When iSNS is turned of deregister all targets at once

Chandra Seetharaman sekharan at us.ibm.com
Mon Aug 16 23:13:31 CEST 2010


iSNS spec(RFC 4141) Section 5.6.5.4:

Upon receiving the DevDereg,the iSNS server removes all objects identified
by the Operating Attribute(s), and all subordinate objects that are solely
dependent on those identified objects. For example, removal of a Network Entity
also results in removal of all associated Portal, Portal Group,Storage Node,
and FC Device objects associated with that Network Entity.

This patch takes advantage of the above mentioned feature to deregister
all defined targets at once when isns is turned Off by the user by deregistering
the entity.

Signed-Off-By: Chandra Seetharaman <sekharan at us.ibm.com>
---
 usr/iscsi/isns.c |   44 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 41 insertions(+), 3 deletions(-)

Index: tgt-469b574/usr/iscsi/isns.c
===================================================================
--- tgt-469b574.orig/usr/iscsi/isns.c
+++ tgt-469b574/usr/iscsi/isns.c
@@ -999,6 +999,39 @@ int isns_init(void)
 	return 0;
 }
 
+int isns_eid_deregister(void)
+{
+	char buf[4096];
+	uint16_t flags, length = 0;
+	struct isns_hdr *hdr = (struct isns_hdr *) buf;
+	struct isns_tlv *tlv;
+	struct iscsi_target *target;
+	int err;
+
+	if (!isns_fd)
+		if (isns_connect() < 0)
+			return 0;
+
+	memset(buf, 0, sizeof(buf));
+	tlv = (struct isns_tlv *) hdr->pdu;
+
+	target = list_first_entry(&iscsi_targets_list,
+				struct iscsi_target, tlist);
+	length += isns_tlv_set_string(&tlv, ISNS_ATTR_ISCSI_NAME,
+					tgt_targetname(target->tid));
+	length += isns_tlv_set(&tlv, 0, 0, 0);
+	length += isns_tlv_set_string(&tlv, ISNS_ATTR_ENTITY_IDENTIFIER,
+					      eid);
+	flags = ISNS_FLAG_CLIENT | ISNS_FLAG_LAST_PDU | ISNS_FLAG_FIRST_PDU;
+	isns_hdr_init(hdr, ISNS_FUNC_DEV_DEREG, length, flags,
+		      ++transaction, 0);
+
+	err = write(isns_fd, buf, length + sizeof(struct isns_hdr));
+	if (err < 0)
+		eprintf("%d %m\n", length);
+
+	return 0;
+}
 void isns_exit(void)
 {
 	struct iscsi_target *target;
@@ -1006,8 +1039,13 @@ void isns_exit(void)
 	if (!use_isns)
 		return;
 
-	list_for_each_entry(target, &iscsi_targets_list, tlist)
-		isns_target_deregister(tgt_targetname(target->tid));
+	if (num_targets) {
+		del_work(&timeout_work);
+		list_for_each_entry(target, &iscsi_targets_list, tlist)
+			free_all_acl(target);
+
+		isns_eid_deregister();
+	}
 
 	if (isns_fd) {
 		tgt_event_del(isns_fd);
@@ -1022,7 +1060,7 @@ void isns_exit(void)
 		close(scn_fd);
 	}
 
-	use_isns = isns_fd = scn_listen_fd = scn_fd = 0;
+	num_targets = use_isns = isns_fd = scn_listen_fd = scn_fd = 0;
 	free(rxbuf);
 }
 


--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list