summaryrefslogtreecommitdiff
path: root/drivers/target/target_core_ua.c
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2015-06-11 11:01:26 +0300
committerNicholas Bellinger <nab@linux-iscsi.org>2015-06-17 09:27:04 +0300
commitc51c8e7bcac966f209da83630fc8ca7e6cad279b (patch)
treea4823a8d68916d5cdd7a580d4b1bba4dd2a3fa5f /drivers/target/target_core_ua.c
parent316058134ffa0017199b460318e109aa79432cc6 (diff)
downloadlinux-c51c8e7bcac966f209da83630fc8ca7e6cad279b.tar.xz
target: use 'se_dev_entry' when allocating UAs
We need to use 'se_dev_entry' as argument when allocating UAs, otherwise we'll never see any UAs for an implicit ALUA state transition triggered from userspace. (Add target_ua_allocate_lun() common caller - nab) Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_ua.c')
-rw-r--r--drivers/target/target_core_ua.c42
1 files changed, 22 insertions, 20 deletions
diff --git a/drivers/target/target_core_ua.c b/drivers/target/target_core_ua.c
index e5062245171e..fc095aed5a88 100644
--- a/drivers/target/target_core_ua.c
+++ b/drivers/target/target_core_ua.c
@@ -87,18 +87,11 @@ target_scsi3_ua_check(struct se_cmd *cmd)
}
int core_scsi3_ua_allocate(
- struct se_node_acl *nacl,
- u64 unpacked_lun,
+ struct se_dev_entry *deve,
u8 asc,
u8 ascq)
{
- struct se_dev_entry *deve;
struct se_ua *ua, *ua_p, *ua_tmp;
- /*
- * PASSTHROUGH OPS
- */
- if (!nacl)
- return -EINVAL;
ua = kmem_cache_zalloc(se_ua_cache, GFP_ATOMIC);
if (!ua) {
@@ -110,12 +103,6 @@ int core_scsi3_ua_allocate(
ua->ua_asc = asc;
ua->ua_ascq = ascq;
- rcu_read_lock();
- deve = target_nacl_find_deve(nacl, unpacked_lun);
- if (!deve) {
- rcu_read_unlock();
- return -EINVAL;
- }
spin_lock(&deve->ua_lock);
list_for_each_entry_safe(ua_p, ua_tmp, &deve->ua_list, ua_nacl_list) {
/*
@@ -123,7 +110,6 @@ int core_scsi3_ua_allocate(
*/
if ((ua_p->ua_asc == asc) && (ua_p->ua_ascq == ascq)) {
spin_unlock(&deve->ua_lock);
- rcu_read_unlock();
kmem_cache_free(se_ua_cache, ua);
return 0;
}
@@ -170,22 +156,38 @@ int core_scsi3_ua_allocate(
spin_unlock(&deve->ua_lock);
atomic_inc_mb(&deve->ua_count);
- rcu_read_unlock();
return 0;
}
list_add_tail(&ua->ua_nacl_list, &deve->ua_list);
spin_unlock(&deve->ua_lock);
- pr_debug("[%s]: Allocated UNIT ATTENTION, mapped LUN: %llu, ASC:"
- " 0x%02x, ASCQ: 0x%02x\n",
- nacl->se_tpg->se_tpg_tfo->get_fabric_name(), unpacked_lun,
+ pr_debug("Allocated UNIT ATTENTION, mapped LUN: %llu, ASC:"
+ " 0x%02x, ASCQ: 0x%02x\n", deve->mapped_lun,
asc, ascq);
atomic_inc_mb(&deve->ua_count);
- rcu_read_unlock();
return 0;
}
+void target_ua_allocate_lun(struct se_node_acl *nacl,
+ u32 unpacked_lun, u8 asc, u8 ascq)
+{
+ struct se_dev_entry *deve;
+
+ if (!nacl)
+ return;
+
+ rcu_read_lock();
+ deve = target_nacl_find_deve(nacl, unpacked_lun);
+ if (!deve) {
+ rcu_read_unlock();
+ return;
+ }
+
+ core_scsi3_ua_allocate(deve, asc, ascq);
+ rcu_read_unlock();
+}
+
void core_scsi3_ua_release_all(
struct se_dev_entry *deve)
{