Some feedback I've gotten from users is that initiator access config could be easier. The way other storage vendors have addressed this is to support initiator groups; the admin adds initiator WWNs to the group, and then LUN mappings can be assigned for the entire group at once. Instead of changing ktarget's configfs interface, I propose we keep the configfs interface per-wwn but modify targetcli to support modifying multiple initiators at once. targetcli could certainly keep its own list of which hosts are in its "groups", but one nice feature of the current implementation is *all* info is tracked in configfs. This patch adds a 'tag' parameter to nodeacl configfs for iscsi. It is not used internally, but allows user utilities to stick just enough info in configfs to simulate NodeACL aliases and groups. targetcli or other user tool could group nodeacls by tag, and then apply a config change to all nodeacls with a given tag. Code tested to work, although userspace pieces still to be implemented. Signed-off-by: Andy Grover <agrover@xxxxxxxxxx> --- drivers/target/iscsi/iscsi_target_configfs.c | 35 ++++++++++++++++++++++++++ drivers/target/target_core_tpg.c | 31 +++++++++++++++++++++++ include/target/target_core_base.h | 1 + include/target/target_core_fabric.h | 2 + 4 files changed, 69 insertions(+), 0 deletions(-) diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index 542641c..489f5b5 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c @@ -754,9 +754,44 @@ static ssize_t lio_target_nacl_store_cmdsn_depth( TF_NACL_BASE_ATTR(lio_target, cmdsn_depth, S_IRUGO | S_IWUSR); +static ssize_t lio_target_nacl_show_tag( + struct se_node_acl *se_nacl, + char *page) +{ + struct se_portal_group *se_tpg = se_nacl->se_tpg; + int ret; + + spin_lock_irq(&se_tpg->acl_node_lock); + ret = snprintf(page, PAGE_SIZE, "%s", se_nacl->acl_tag); + spin_unlock_irq(&se_tpg->acl_node_lock); + + return ret; +} + +static ssize_t lio_target_nacl_store_tag( + struct se_node_acl *se_nacl, + const char *page, + size_t count) +{ + struct se_portal_group *se_tpg = se_nacl->se_tpg; + struct iscsi_portal_group *tpg = container_of(se_tpg, + struct iscsi_portal_group, tpg_se_tpg); + int ret; + + ret = core_tpg_set_initiator_node_tag(&tpg->tpg_se_tpg, + se_nacl, page); + + if (ret < 0) + return ret; + return count; +} + +TF_NACL_BASE_ATTR(lio_target, tag, S_IRUGO | S_IWUSR); + static struct configfs_attribute *lio_target_initiator_attrs[] = { &lio_target_nacl_info.attr, &lio_target_nacl_cmdsn_depth.attr, + &lio_target_nacl_tag.attr, NULL, }; diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c index d84cc0a..1e131a9 100644 --- a/drivers/target/target_core_tpg.c +++ b/drivers/target/target_core_tpg.c @@ -461,6 +461,7 @@ int core_tpg_del_initiator_node_acl( } list_del(&acl->acl_list); tpg->num_node_acls--; + kfree(acl->acl_tag); spin_unlock_irq(&tpg->acl_node_lock); spin_lock_irqsave(&acl->nacl_sess_lock, flags); @@ -616,6 +617,36 @@ int core_tpg_set_initiator_node_queue_depth( } EXPORT_SYMBOL(core_tpg_set_initiator_node_queue_depth); +/* core_tpg_set_initiator_node_tag(): + * + * Initiator nodeacl tags are not used internally, but may be used by + * userspace to emulate aliases or groups. + * Returns length of newly-set tag. + */ +int core_tpg_set_initiator_node_tag( + struct se_portal_group *tpg, + struct se_node_acl *acl, + const char *new_tag) +{ + char *tmp_tag; + + if (!strncmp("NULL", new_tag, 4)) { + tmp_tag = NULL; + } else { + tmp_tag = kstrndup(new_tag, PAGE_SIZE-1, GFP_KERNEL); + if (!tmp_tag) + return -ENOMEM; + } + + spin_lock_irq(&tpg->acl_node_lock); + kfree(acl->acl_tag); + acl->acl_tag = tmp_tag; + spin_unlock_irq(&tpg->acl_node_lock); + + return 0; +} +EXPORT_SYMBOL(core_tpg_set_initiator_node_tag); + static int core_tpg_setup_virtual_lun0(struct se_portal_group *se_tpg) { /* Set in core_dev_setup_virtual_lun0() */ diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 645d90a..7bcc090 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -507,6 +507,7 @@ struct se_node_acl { bool acl_stop:1; u32 queue_depth; u32 acl_index; + char *acl_tag; u64 num_cmds; u64 read_bytes; u64 write_bytes; diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h index 9087b20..aaa1ee6 100644 --- a/include/target/target_core_fabric.h +++ b/include/target/target_core_fabric.h @@ -142,6 +142,8 @@ int core_tpg_del_initiator_node_acl(struct se_portal_group *, struct se_node_acl *, int); int core_tpg_set_initiator_node_queue_depth(struct se_portal_group *, unsigned char *, u32, int); +int core_tpg_set_initiator_node_tag(struct se_portal_group *, + struct se_node_acl *, const char *); int core_tpg_register(struct target_core_fabric_ops *, struct se_wwn *, struct se_portal_group *, void *, int); int core_tpg_deregister(struct se_portal_group *); -- 1.7.1 -- 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