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