Hey Hannes,

Apologies for the delayed follow-up on these, one comment below.

On Thu, 2015-06-11 at 10:01 +0200, Hannes Reinecke wrote:
> 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.
> 
> Signed-off-by: Hannes Reinecke <h...@suse.de>
> ---
>  drivers/target/target_core_alua.c      | 27 ++++++++++++++++++---------
>  drivers/target/target_core_pr.c        | 31 +++++++++++++++++++++++++------
>  drivers/target/target_core_transport.c | 18 ++++++++++++------
>  drivers/target/target_core_ua.c        | 23 +++--------------------
>  drivers/target/target_core_ua.h        |  2 +-
>  5 files changed, 59 insertions(+), 42 deletions(-)
> 

<SNIP>

> diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
> index 436e30b..bb28a97 100644
> --- a/drivers/target/target_core_pr.c
> +++ b/drivers/target/target_core_pr.c
> @@ -125,6 +125,25 @@ static struct t10_pr_registration 
> *core_scsi3_locate_pr_reg(struct se_device *,
>                                       struct se_node_acl *, struct se_session 
> *);
>  static void core_scsi3_put_pr_reg(struct t10_pr_registration *);
>  
> +static void core_scsi3_pr_ua_allocate(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();
> +}
> +

This should be common for TCM_RESERVATION_CONFLICT case outside of PR
code too.

Any objections for squashing the following into your original patch..?

Thank you,

--nab

diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index bb28a97..0bb3292 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -125,25 +125,6 @@ static struct t10_pr_registration 
*core_scsi3_locate_pr_reg(struct se_device *,
                                        struct se_node_acl *, struct se_session 
*);
 static void core_scsi3_put_pr_reg(struct t10_pr_registration *);
 
-static void core_scsi3_pr_ua_allocate(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();
-}
-
 static int target_check_scsi2_reservation_conflict(struct se_cmd *cmd)
 {
        struct se_session *se_sess = cmd->se_sess;
@@ -2216,7 +2197,7 @@ core_scsi3_emulate_pro_register(struct se_cmd *cmd, u64 
res_key, u64 sa_res_key,
                                        &pr_tmpl->registration_list,
                                        pr_reg_list) {
 
-                               core_scsi3_pr_ua_allocate(
+                               target_ua_allocate_lun(
                                        pr_reg_p->pr_reg_nacl,
                                        pr_reg_p->pr_res_mapped_lun,
                                        0x2A,
@@ -2643,7 +2624,7 @@ core_scsi3_emulate_pro_release(struct se_cmd *cmd, int 
type, int scope,
                if (pr_reg_p == pr_reg)
                        continue;
 
-               core_scsi3_pr_ua_allocate(pr_reg_p->pr_reg_nacl,
+               target_ua_allocate_lun(pr_reg_p->pr_reg_nacl,
                                pr_reg_p->pr_res_mapped_lun,
                                0x2A, ASCQ_2AH_RESERVATIONS_RELEASED);
        }
@@ -2728,7 +2709,7 @@ core_scsi3_emulate_pro_clear(struct se_cmd *cmd, u64 
res_key)
                 *    additional sense code set to RESERVATIONS PREEMPTED.
                 */
                if (!calling_it_nexus)
-                       core_scsi3_pr_ua_allocate(pr_reg_nacl, 
pr_res_mapped_lun,
+                       target_ua_allocate_lun(pr_reg_nacl, pr_res_mapped_lun,
                                0x2A, ASCQ_2AH_RESERVATIONS_PREEMPTED);
        }
        spin_unlock(&pr_tmpl->registration_lock);
@@ -2937,7 +2918,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int 
scope, u64 res_key,
                                                NULL, 0);
                        }
                        if (!calling_it_nexus)
-                               core_scsi3_pr_ua_allocate(pr_reg_nacl,
+                               target_ua_allocate_lun(pr_reg_nacl,
                                        pr_res_mapped_lun, 0x2A,
                                        ASCQ_2AH_REGISTRATIONS_PREEMPTED);
                }
@@ -3043,7 +3024,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int 
scope, u64 res_key,
                 *    persistent reservation and/or registration, with the
                 *    additional sense code set to REGISTRATIONS PREEMPTED;
                 */
-               core_scsi3_pr_ua_allocate(pr_reg_nacl, pr_res_mapped_lun, 0x2A,
+               target_ua_allocate_lun(pr_reg_nacl, pr_res_mapped_lun, 0x2A,
                                ASCQ_2AH_REGISTRATIONS_PREEMPTED);
        }
        spin_unlock(&pr_tmpl->registration_lock);
@@ -3076,7 +3057,7 @@ core_scsi3_pro_preempt(struct se_cmd *cmd, int type, int 
scope, u64 res_key,
                        if (calling_it_nexus)
                                continue;
 
-                       core_scsi3_pr_ua_allocate(pr_reg->pr_reg_nacl,
+                       target_ua_allocate_lun(pr_reg->pr_reg_nacl,
                                        pr_reg->pr_res_mapped_lun, 0x2A,
                                        ASCQ_2AH_RESERVATIONS_RELEASED);
                }
diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
index bd63254..201c33c 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -1678,15 +1678,9 @@ void transport_generic_request_failure(struct se_cmd 
*cmd,
                 */
                if (cmd->se_sess &&
                    cmd->se_dev->dev_attrib.emulate_ua_intlck_ctrl == 2) {
-                       struct se_dev_entry *deve;
-
-                       rcu_read_lock();
-                       deve = target_nacl_find_deve(cmd->se_sess->se_node_acl,
-                                                    cmd->orig_fe_lun);
-                       if (deve)
-                               core_scsi3_ua_allocate(deve, 0x2C,
+                       target_ua_allocate_lun(cmd->se_sess->se_node_acl,
+                                              cmd->orig_fe_lun, 0x2C,
                                        
ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS);
-                       rcu_read_unlock();
                }
                trace_target_cmd_complete(cmd);
                ret = cmd->se_tfo->queue_status(cmd);
diff --git a/drivers/target/target_core_ua.c b/drivers/target/target_core_ua.c
index e97a708..fc095ae 100644
--- a/drivers/target/target_core_ua.c
+++ b/drivers/target/target_core_ua.c
@@ -169,6 +169,25 @@ int core_scsi3_ua_allocate(
        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)
 {
diff --git a/drivers/target/target_core_ua.h b/drivers/target/target_core_ua.h
index 45e3b6d..bd6e78b 100644
--- a/drivers/target/target_core_ua.h
+++ b/drivers/target/target_core_ua.h
@@ -32,6 +32,7 @@ extern struct kmem_cache *se_ua_cache;
 
 extern sense_reason_t target_scsi3_ua_check(struct se_cmd *);
 extern int core_scsi3_ua_allocate(struct se_dev_entry *, u8, u8);
+extern void target_ua_allocate_lun(struct se_node_acl *, u32, u8, u8);
 extern void core_scsi3_ua_release_all(struct se_dev_entry *);
 extern void core_scsi3_ua_for_check_condition(struct se_cmd *, u8 *, u8 *);
 extern int core_scsi3_ua_clear_for_request_sense(struct se_cmd *,



--
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