]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
target: Fix lookup of dynamic NodeACLs during cached demo-mode operation
authorNicholas Bellinger <nab@linux-iscsi.org>
Tue, 19 Feb 2013 02:00:33 +0000 (18:00 -0800)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 6 Mar 2013 03:24:03 +0000 (03:24 +0000)
commit fcf29481fb8e106daad6688f2e898226ee928992 upstream.

This patch fixes a bug in core_tpg_check_initiator_node_acl() ->
core_tpg_get_initiator_node_acl() where a dynamically created
se_node_acl generated during session login would be skipped during
subsequent lookup due to the '!acl->dynamic_node_acl' check, causing
a new se_node_acl to be created with a duplicate ->initiatorname.

This would occur when a fabric endpoint was configured with
TFO->tpg_check_demo_mode()=1 + TPF->tpg_check_demo_mode_cache()=1
preventing the release of an existing se_node_acl during se_session
shutdown.

Also, drop the unnecessary usage of core_tpg_get_initiator_node_acl()
within core_dev_init_initiator_node_lun_acl() that originally
required the extra '!acl->dynamic_node_acl' check, and just pass
the configfs provided se_node_acl pointer instead.

Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
[bwh: Backported to 3.2: adjust context, filename of header]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/target/target_core_device.c
drivers/target/target_core_fabric_configfs.c
drivers/target/target_core_tpg.c
include/target/target_core_device.h

index a0143a097f42c1a5574807e7a66216c14a0ccd94..5def3593e87254a5f40d826e2312241849e9ec50 100644 (file)
@@ -1439,24 +1439,18 @@ static struct se_lun *core_dev_get_lun(struct se_portal_group *tpg, u32 unpacked
 
 struct se_lun_acl *core_dev_init_initiator_node_lun_acl(
        struct se_portal_group *tpg,
+       struct se_node_acl *nacl,
        u32 mapped_lun,
-       char *initiatorname,
        int *ret)
 {
        struct se_lun_acl *lacl;
-       struct se_node_acl *nacl;
 
-       if (strlen(initiatorname) >= TRANSPORT_IQN_LEN) {
+       if (strlen(nacl->initiatorname) >= TRANSPORT_IQN_LEN) {
                pr_err("%s InitiatorName exceeds maximum size.\n",
                        tpg->se_tpg_tfo->get_fabric_name());
                *ret = -EOVERFLOW;
                return NULL;
        }
-       nacl = core_tpg_get_initiator_node_acl(tpg, initiatorname);
-       if (!nacl) {
-               *ret = -EINVAL;
-               return NULL;
-       }
        lacl = kzalloc(sizeof(struct se_lun_acl), GFP_KERNEL);
        if (!lacl) {
                pr_err("Unable to allocate memory for struct se_lun_acl.\n");
@@ -1467,7 +1461,8 @@ struct se_lun_acl *core_dev_init_initiator_node_lun_acl(
        INIT_LIST_HEAD(&lacl->lacl_list);
        lacl->mapped_lun = mapped_lun;
        lacl->se_lun_nacl = nacl;
-       snprintf(lacl->initiatorname, TRANSPORT_IQN_LEN, "%s", initiatorname);
+       snprintf(lacl->initiatorname, TRANSPORT_IQN_LEN, "%s",
+                nacl->initiatorname);
 
        return lacl;
 }
index 09b6f8729f918edbcd913770ef73c16485594839..19460f9192998e09deeb741da82884feb02487a9 100644 (file)
@@ -355,8 +355,8 @@ static struct config_group *target_fabric_make_mappedlun(
                goto out;
        }
 
-       lacl = core_dev_init_initiator_node_lun_acl(se_tpg, mapped_lun,
-                       config_item_name(acl_ci), &ret);
+       lacl = core_dev_init_initiator_node_lun_acl(se_tpg, se_nacl,
+                       mapped_lun, &ret);
        if (!lacl) {
                ret = -EINVAL;
                goto out;
index d91fe44b00d16fbcc0370478dde91061937a02c9..d048e330aafd90210cfe8c4c752bda3fde54821e 100644 (file)
@@ -117,16 +117,10 @@ struct se_node_acl *core_tpg_get_initiator_node_acl(
        struct se_node_acl *acl;
 
        spin_lock_irq(&tpg->acl_node_lock);
-       list_for_each_entry(acl, &tpg->acl_node_list, acl_list) {
-               if (!strcmp(acl->initiatorname, initiatorname) &&
-                   !acl->dynamic_node_acl) {
-                       spin_unlock_irq(&tpg->acl_node_lock);
-                       return acl;
-               }
-       }
+       acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname);
        spin_unlock_irq(&tpg->acl_node_lock);
 
-       return NULL;
+       return acl;
 }
 
 /*     core_tpg_add_node_to_devs():
index 2be31ff8763b25cb2e3a5f1b641e7af3ded2defd..6f30e700da28b0e0638f9191d449c838d427a6c5 100644 (file)
@@ -50,7 +50,7 @@ extern struct se_lun *core_dev_add_lun(struct se_portal_group *, struct se_hba *
 extern int core_dev_del_lun(struct se_portal_group *, u32);
 extern struct se_lun *core_get_lun_from_tpg(struct se_portal_group *, u32);
 extern struct se_lun_acl *core_dev_init_initiator_node_lun_acl(struct se_portal_group *,
-                                                       u32, char *, int *);
+               struct se_node_acl *, u32, int *);
 extern int core_dev_add_initiator_node_lun_acl(struct se_portal_group *,
                                                struct se_lun_acl *, u32, u32);
 extern int core_dev_del_initiator_node_lun_acl(struct se_portal_group *,