[PATCH] iscsi-target: show information about connected initiators at the TPG level

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

 



When a TPG is configured in demo mode (generate_node_acls=1), there is
no way to retrieve the list of initiators that are connected to the
target.

This patch introduces an "info" entry at the TPG level to provide
basic information about the connected initiators: name, alias, IP
address and protocol.

Signed-off-by: Christophe Vu-Brugier <cvubrugier@xxxxxxxx>
---

 Below is the content of a sample "info" entry when two initiators
 are connected to a target.

 # cat /sys/kernel/config/target/iscsi/$IQN/tpgt_1/info
 InitiatorName: iqn.1993-08.org.debian:01:341d1cb55857
 InitiatorAlias: debian
 CID #0: 192.168.8.135 TCP

 InitiatorName: iqn.1991-05.com.microsoft:win7
 InitiatorAlias: 
 CID #1: 192.168.8.124 TCP

 drivers/target/iscsi/iscsi_target_configfs.c | 53 ++++++++++++++++++++++++++++
 include/target/target_core_fabric_configfs.h |  4 +++
 2 files changed, 57 insertions(+)

diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
index fd14525..59999f3 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -1396,8 +1396,61 @@ out:
 
 TF_TPG_BASE_ATTR(lio_target, enable, S_IRUGO | S_IWUSR);
 
+static ssize_t lio_target_tpg_show_info(
+	struct se_portal_group *se_tpg,
+	char *page)
+{
+	struct se_node_acl *se_nacl, *se_nacl_tmp;
+	struct se_session *se_sess;
+	struct iscsi_session *sess;
+	struct iscsi_conn *conn;
+	bool first_entry = true;
+	ssize_t rb = 0;
+
+	list_for_each_entry_safe(se_nacl, se_nacl_tmp, &se_tpg->acl_node_list,
+				 acl_list) {
+		spin_lock_bh(&se_nacl->nacl_sess_lock);
+
+		se_sess = se_nacl->nacl_sess;
+		if (!se_sess) {
+			spin_unlock_bh(&se_nacl->nacl_sess_lock);
+			continue;
+		}
+
+		if (first_entry)
+			first_entry = false;
+		else
+			rb += sprintf(page+rb, "\n");
+
+		sess = se_sess->fabric_sess_ptr;
+
+		if (sess->sess_ops->InitiatorName)
+			rb += sprintf(page+rb, "InitiatorName: %s\n",
+				      sess->sess_ops->InitiatorName);
+		if (sess->sess_ops->InitiatorAlias)
+			rb += sprintf(page+rb, "InitiatorAlias: %s\n",
+				      sess->sess_ops->InitiatorAlias);
+
+		spin_lock(&sess->conn_lock);
+		list_for_each_entry(conn, &sess->sess_conn_list, conn_list) {
+			rb += sprintf(page+rb, "CID #%hu: %s %s\n",
+				      conn->cid, conn->login_ip,
+				      (conn->network_transport == ISCSI_TCP) ?
+				      "TCP" : "SCTP");
+		}
+		spin_unlock(&sess->conn_lock);
+
+		spin_unlock_bh(&se_nacl->nacl_sess_lock);
+	}
+
+	return rb;
+}
+
+TF_TPG_BASE_ATTR_RO(lio_target, info);
+
 static struct configfs_attribute *lio_target_tpg_attrs[] = {
 	&lio_target_tpg_enable.attr,
+	&lio_target_tpg_info.attr,
 	NULL,
 };
 
diff --git a/include/target/target_core_fabric_configfs.h b/include/target/target_core_fabric_configfs.h
index b32a149..9f4394f 100644
--- a/include/target/target_core_fabric_configfs.h
+++ b/include/target/target_core_fabric_configfs.h
@@ -89,6 +89,10 @@ static struct target_fabric_tpg_attribute _fabric##_tpg_##_name =	\
 	_fabric##_tpg_show_##_name,					\
 	_fabric##_tpg_store_##_name);
 
+#define TF_TPG_BASE_ATTR_RO(_fabric, _name)				\
+static struct target_fabric_tpg_attribute _fabric##_tpg_##_name =	\
+	__CONFIGFS_EATTR_RO(_name,					\
+	_fabric##_tpg_show_##_name);
 
 CONFIGFS_EATTR_STRUCT(target_fabric_wwn, target_fabric_configfs);
 #define TF_WWN_ATTR(_fabric, _name, _mode)				\
-- 
1.8.4.rc3

--
To unsubscribe from this list: send the line "unsubscribe target-devel" 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]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux