Create helper functions to alloc a deve and to transition it from demo mode to explicit. Signed-off-by: Andy Grover <agrover@xxxxxxxxxx> --- 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 0bd09c8..c15b7aa 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(): * * Called with tpg_lun_lock held & irqs off @@ -314,62 +381,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.8.5.3 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html