Create helper functions to alloc a deve and to transition it from
demo mode to explicit.

Signed-off-by: Andy Grover <agro...@redhat.com>
---
 drivers/target/target_core_device.c | 121 ++++++++++++++++++++++--------------
 1 file changed, 74 insertions(+), 47 deletions(-)

diff --git a/drivers/target/target_core_device.c 
b/drivers/target/target_core_device.c
index 4b8149b..2c589a5 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -288,6 +288,73 @@ void core_update_device_list_access(
        spin_unlock_irq(&nacl->device_list_lock);
 }
 
+static struct se_dev_entry *core_alloc_se_dev_entry(
+       struct se_lun *lun,
+       struct se_lun_acl *lun_acl,
+       u32 mapped_lun,
+       u32 lun_access,
+       struct se_node_acl *nacl)
+{
+       struct se_dev_entry *deve;
+
+       /* Holding locks, can't sleep */
+       deve = kzalloc(sizeof(*deve), GFP_ATOMIC);
+       if (!deve)
+               return ERR_PTR(-ENOMEM);
+
+       atomic_set(&deve->ua_count, 0);
+       atomic_set(&deve->pr_ref_count, 0);
+       spin_lock_init(&deve->ua_lock);
+       INIT_LIST_HEAD(&deve->alua_port_list);
+       INIT_LIST_HEAD(&deve->ua_list);
+       deve->se_lun = lun;
+       deve->se_lun_acl = lun_acl;
+       deve->mapped_lun = mapped_lun;
+
+       if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE)
+               deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_WRITE;
+       else
+               deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
+
+       deve->creation_time = get_jiffies_64();
+
+       nacl->device_list[mapped_lun] = deve;
+
+       return deve;
+}
+
+static int core_transition_deve_to_explicit(
+       struct se_lun *lun,
+       struct se_lun_acl *lun_acl,
+       struct se_dev_entry *deve,
+       u32 lun_access)
+{
+       if (deve->se_lun_acl != NULL) {
+               pr_err("struct se_dev_entry->se_lun_acl"
+                      " already set for demo mode -> explicit"
+                      " LUN ACL transition\n");
+               return -EINVAL;
+       }
+       if (deve->se_lun != lun) {
+               pr_err("struct se_dev_entry->se_lun does"
+                      " match passed struct se_lun for demo mode"
+                      " -> explicit LUN ACL transition\n");
+               return -EINVAL;
+       }
+
+       deve->se_lun_acl = lun_acl;
+
+       if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE) {
+               deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_ONLY;
+               deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_WRITE;
+       } else {
+               deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_WRITE;
+               deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
+       }
+
+       return 0;
+}
+
 /*      core_enable_device_list_for_node():
  *
  */
@@ -316,62 +383,22 @@ int core_enable_device_list_for_node(
         * + mapped_lun that was setup in demo mode..
         */
        if (deve) {
-               if (deve->se_lun_acl != NULL) {
-                       pr_err("struct se_dev_entry->se_lun_acl"
-                              " already set for demo mode -> explicit"
-                              " LUN ACL transition\n");
-                       ret = -EINVAL;
-                       goto out;
-               }
-               if (deve->se_lun != lun) {
-                       pr_err("struct se_dev_entry->se_lun does"
-                              " match passed struct se_lun for demo mode"
-                              " -> explicit LUN ACL transition\n");
-                       ret = -EINVAL;
-                       goto out;
-               }
-               deve->se_lun_acl = lun_acl;
-
-               if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE) {
-                       deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_ONLY;
-                       deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_WRITE;
-               } else {
-                       deve->lun_flags &= ~TRANSPORT_LUNFLAGS_READ_WRITE;
-                       deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
-               }
-
+               ret = core_transition_deve_to_explicit(lun, lun_acl, deve,
+                                                      lun_access);
                goto out;
        }
 
-       deve = kzalloc(sizeof(*deve), GFP_ATOMIC);
-       if (!deve) {
-               spin_unlock_irq(&nacl->device_list_lock);
-               return -ENOMEM;
+       deve = core_alloc_se_dev_entry(lun, lun_acl, mapped_lun, lun_access, 
nacl);
+       if (IS_ERR(deve)) {
+               ret = PTR_ERR(deve);
+               goto out;
        }
 
-       nacl->device_list[mapped_lun] = deve;
-
-       atomic_set(&deve->ua_count, 0);
-       atomic_set(&deve->pr_ref_count, 0);
-       spin_lock_init(&deve->ua_lock);
-       INIT_LIST_HEAD(&deve->alua_port_list);
-       INIT_LIST_HEAD(&deve->ua_list);
-       deve->se_lun = lun;
-       deve->se_lun_acl = lun_acl;
-       deve->mapped_lun = mapped_lun;
-
-       if (lun_access & TRANSPORT_LUNFLAGS_READ_WRITE)
-               deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_WRITE;
-       else
-               deve->lun_flags |= TRANSPORT_LUNFLAGS_READ_ONLY;
-
-       deve->creation_time = get_jiffies_64();
-       deve->attach_count++;
-
        spin_lock(&port->sep_alua_lock);
        list_add_tail(&deve->alua_port_list, &port->sep_alua_list);
        spin_unlock(&port->sep_alua_lock);
 
+       deve->attach_count++;
 out:
        spin_unlock(&nacl->device_list_lock);
 
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to