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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 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@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux SCSI]     [Linux RAID]     [Linux Clusters]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]

  Powered by Linux