>From 836f7a0174727bc9d39619d01c24f0d8048f8a7d Mon Sep 17 00:00:00 2001
From: Nicholas Bellinger
Date: Thu, 23 Oct 2008 06:59:20 -0700
Subject: [PATCH] [LIO-Target/ConfigFS]: Added iSCSI Initiator Node ACL READ-ONLY Parameters

Added static struct config_item_type lio_target_nacl_param_cit that lives under

/sys/kernel/config/target/iscsi/$TIQN/$TPGT/acl/$INITIATOR_ACL/param

These configfs attributes are READ-ONLY and are the parameters defined as
having a "session wide" scope. These parameters represent the iSCSI Nexus
(eg: Session) context's parameters.

For Traditional iSCSI (RFC-3260) there is only "TargetAlias" parameter that is
legal to be exchanged after during iSCSI full feature phase from iSCSI Target
side's perspective in a "session wide" scope.

Sending "TargetAlias" while the iSCSI SessionType=Normal nexus is active is
on the TODO list, and the current configfs attrib is to do with LIO-Target is:

/sys/kernel/config/target/iscsi/$IQN/$TPGT/param/TargetAlias

Signed-off-by: Nicholas A. Bellinger
---
drivers/lio-core/iscsi_target_configfs.c | 100 +++++++++++++++++++++++++++++-
drivers/lio-core/iscsi_target_core.h | 1 +
2 files changed, 98 insertions(+), 3 deletions(-)

diff --git a/drivers/lio-core/iscsi_target_configfs.c b/drivers/lio-core/iscsi_target_configfs.c
index 016ebad..fa3b6a0 100644
--- a/drivers/lio-core/iscsi_target_configfs.c
+++ b/drivers/lio-core/iscsi_target_configfs.c
@@ -818,6 +818,98 @@ static struct config_item_type lio_target_nacl_attrib_cit = {

// End items for lio_target_nacl_attrib_cit

+// Start items for lio_target_nacl_param_cit
+
+#define DEF_NACL_PARAM(name) \
+static ssize_t lio_target_show_nacl_param_##name ( \
+ struct iscsi_node_acl_s *nacl, \
+ char *page) \
+{ \
+ iscsi_session_t *sess; \
+ ssize_t rb; \
+ \
+ spin_lock_bh(&nacl->nacl_sess_lock); \
+ if (!(sess = nacl->nacl_sess)) { \
+ rb = snprintf(page, PAGE_SIZE, \
+ "No Active iSCSI Session\n"); \
+ } else { \
+ rb = snprintf(page, PAGE_SIZE, "%u\n", \
+ (u32)SESS_OPS(sess)->name); \
+ } \
+ spin_unlock_bh(&nacl->nacl_sess_lock); \
+ \
+ return(rb); \
+}
+
+CONFIGFS_EATTR_STRUCT(iscsi_nacl_param, iscsi_node_acl_s);
+#define NACL_PARAM_ATTR(_name) \
+static struct iscsi_nacl_param_attribute iscsi_nacl_param_##_name = \
+ __CONFIGFS_EATTR_RO(_name, \
+ lio_target_show_nacl_param_##_name); \
+
+DEF_NACL_PARAM(MaxConnections);
+NACL_PARAM_ATTR(MaxConnections);
+
+DEF_NACL_PARAM(InitialR2T);
+NACL_PARAM_ATTR(InitialR2T);
+
+DEF_NACL_PARAM(ImmediateData);
+NACL_PARAM_ATTR(ImmediateData);
+
+DEF_NACL_PARAM(MaxBurstLength);
+NACL_PARAM_ATTR(MaxBurstLength);
+
+DEF_NACL_PARAM(FirstBurstLength);
+NACL_PARAM_ATTR(FirstBurstLength);
+
+DEF_NACL_PARAM(DefaultTime2Wait);
+NACL_PARAM_ATTR(DefaultTime2Wait);
+
+DEF_NACL_PARAM(DefaultTime2Retain);
+NACL_PARAM_ATTR(DefaultTime2Retain);
+
+DEF_NACL_PARAM(MaxOutstandingR2T);
+NACL_PARAM_ATTR(MaxOutstandingR2T);
+
+DEF_NACL_PARAM(DataPDUInOrder);
+NACL_PARAM_ATTR(DataPDUInOrder);
+
+DEF_NACL_PARAM(DataSequenceInOrder);
+NACL_PARAM_ATTR(DataSequenceInOrder);
+
+DEF_NACL_PARAM(ErrorRecoveryLevel);
+NACL_PARAM_ATTR(ErrorRecoveryLevel);
+
+CONFIGFS_EATTR_OPS_RO(iscsi_nacl_param, iscsi_node_acl_s, acl_param_group);
+
+static struct configfs_attribute *lio_target_nacl_param_attrs[] = {
+ &iscsi_nacl_param_MaxConnections.attr,
+ &iscsi_nacl_param_InitialR2T.attr,
+ &iscsi_nacl_param_ImmediateData.attr,
+ &iscsi_nacl_param_MaxBurstLength.attr,
+ &iscsi_nacl_param_FirstBurstLength.attr,
+ &iscsi_nacl_param_DefaultTime2Wait.attr,
+ &iscsi_nacl_param_DefaultTime2Retain.attr,
+ &iscsi_nacl_param_MaxOutstandingR2T.attr,
+ &iscsi_nacl_param_DataPDUInOrder.attr,
+ &iscsi_nacl_param_DataSequenceInOrder.attr,
+ &iscsi_nacl_param_ErrorRecoveryLevel.attr,
+ NULL,
+};
+
+static struct configfs_item_operations lio_target_nacl_param_ops = {
+ .show_attribute = iscsi_nacl_param_attr_show,
+ .store_attribute = NULL,
+};
+
+static struct config_item_type lio_target_nacl_param_cit = {
+ .ct_item_ops = &lio_target_nacl_param_ops,
+ .ct_attrs = lio_target_nacl_param_attrs,
+ .ct_owner = THIS_MODULE,
+};
+
+// End items for lio_target_nacl_param_cit
+
// Start items for lio_target_initiator_cit

static int lio_target_initiator_lacl_link (struct config_item *lun_acl_ci, struct config_item *lun_ci)
@@ -1391,14 +1483,16 @@ static struct config_group *lio_target_call_addnodetotpg (
/*
* Create the default groups for iscsi_node_acl_t
*/
- if (!(nacl_cg->default_groups = kzalloc(sizeof(struct config_group) * 2,
+ if (!(nacl_cg->default_groups = kzalloc(sizeof(struct config_group) * 3,
GFP_KERNEL)))
goto node_out;

config_group_init_type_name(&acl->acl_group, name, &lio_target_initiator_cit);
+ config_group_init_type_name(&acl->acl_param_group, "param", &lio_target_nacl_param_cit);
config_group_init_type_name(&nattr->acl_attrib_group, "attrib", &lio_target_nacl_attrib_cit);
- nacl_cg->default_groups[0] = &nattr->acl_attrib_group;
- nacl_cg->default_groups[1] = NULL;
+ nacl_cg->default_groups[0] = &acl->acl_param_group;
+ nacl_cg->default_groups[1] = &nattr->acl_attrib_group;
+ nacl_cg->default_groups[2] = NULL;

printk("LIO_Target_ConfigFS: REGISTER -> %s TPGT: %hu Initiator: %s CmdSN Depth: %u\n",
config_item_name(tiqn_ci), tpgt, name, acl->queue_depth);
diff --git a/drivers/lio-core/iscsi_target_core.h b/drivers/lio-core/iscsi_target_core.h
index fea0597..1324de7 100644
--- a/drivers/lio-core/iscsi_target_core.h
+++ b/drivers/lio-core/iscsi_target_core.h
@@ -1209,6 +1209,7 @@ typedef struct iscsi_node_acl_s {
iscsi_node_attrib_t node_attrib;
iscsi_session_t *nacl_sess;
struct config_group acl_group;
+ struct config_group acl_param_group;
struct iscsi_portal_group_s *tpg;
struct iscsi_node_acl_s *next;
struct iscsi_node_acl_s *prev;
--
1.5.4.1



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/