scsi: target: core: Drop unnecessary se_cmd ASC/ASCQ members
authorDavid Disseldorp <ddiss@suse.de>
Wed, 28 Jul 2021 11:53:54 +0000 (13:53 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 3 Aug 2021 11:27:43 +0000 (07:27 -0400)
These members are only used for ALUA sense detail propagation, which can
just as easily be done via sense_reason_t.

Link: https://lore.kernel.org/r/20210728115353.2396-4-ddiss@suse.de
Reviewed-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: David Disseldorp <ddiss@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_alua.c
drivers/target/target_core_transport.c
include/target/target_core_base.h

index e0036e7..cb1de1e 100644 (file)
@@ -428,22 +428,6 @@ out:
        return rc;
 }
 
-static inline void set_ascq(struct se_cmd *cmd, u8 alua_ascq)
-{
-       /*
-        * Set SCSI additional sense code (ASC) to 'LUN Not Accessible';
-        * The ALUA additional sense code qualifier (ASCQ) is determined
-        * by the ALUA primary or secondary access state..
-        */
-       pr_debug("[%s]: ALUA TG Port not available, "
-               "SenseKey: NOT_READY, ASC/ASCQ: "
-               "0x04/0x%02x\n",
-               cmd->se_tfo->fabric_name, alua_ascq);
-
-       cmd->scsi_asc = 0x04;
-       cmd->scsi_ascq = alua_ascq;
-}
-
 static inline void core_alua_state_nonoptimized(
        struct se_cmd *cmd,
        unsigned char *cdb,
@@ -458,7 +442,7 @@ static inline void core_alua_state_nonoptimized(
        cmd->alua_nonop_delay = nonop_delay_msecs;
 }
 
-static inline int core_alua_state_lba_dependent(
+static inline sense_reason_t core_alua_state_lba_dependent(
        struct se_cmd *cmd,
        u16 tg_pt_gp_id)
 {
@@ -506,8 +490,7 @@ static inline int core_alua_state_lba_dependent(
                }
                if (!cur_map) {
                        spin_unlock(&dev->t10_alua.lba_map_lock);
-                       set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
-                       return 1;
+                       return TCM_ALUA_TG_PT_UNAVAILABLE;
                }
                list_for_each_entry(map_mem, &cur_map->lba_map_mem_list,
                                    lba_map_mem_list) {
@@ -516,12 +499,10 @@ static inline int core_alua_state_lba_dependent(
                        switch(map_mem->lba_map_mem_alua_state) {
                        case ALUA_ACCESS_STATE_STANDBY:
                                spin_unlock(&dev->t10_alua.lba_map_lock);
-                               set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
-                               return 1;
+                               return TCM_ALUA_TG_PT_STANDBY;
                        case ALUA_ACCESS_STATE_UNAVAILABLE:
                                spin_unlock(&dev->t10_alua.lba_map_lock);
-                               set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
-                               return 1;
+                               return TCM_ALUA_TG_PT_UNAVAILABLE;
                        default:
                                break;
                        }
@@ -531,7 +512,7 @@ static inline int core_alua_state_lba_dependent(
        return 0;
 }
 
-static inline int core_alua_state_standby(
+static inline sense_reason_t core_alua_state_standby(
        struct se_cmd *cmd,
        unsigned char *cdb)
 {
@@ -555,24 +536,21 @@ static inline int core_alua_state_standby(
                case SAI_READ_CAPACITY_16:
                        return 0;
                default:
-                       set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
-                       return 1;
+                       return TCM_ALUA_TG_PT_STANDBY;
                }
        case MAINTENANCE_IN:
                switch (cdb[1] & 0x1f) {
                case MI_REPORT_TARGET_PGS:
                        return 0;
                default:
-                       set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
-                       return 1;
+                       return TCM_ALUA_TG_PT_STANDBY;
                }
        case MAINTENANCE_OUT:
                switch (cdb[1]) {
                case MO_SET_TARGET_PGS:
                        return 0;
                default:
-                       set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
-                       return 1;
+                       return TCM_ALUA_TG_PT_STANDBY;
                }
        case REQUEST_SENSE:
        case PERSISTENT_RESERVE_IN:
@@ -581,14 +559,13 @@ static inline int core_alua_state_standby(
        case WRITE_BUFFER:
                return 0;
        default:
-               set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
-               return 1;
+               return TCM_ALUA_TG_PT_STANDBY;
        }
 
        return 0;
 }
 
-static inline int core_alua_state_unavailable(
+static inline sense_reason_t core_alua_state_unavailable(
        struct se_cmd *cmd,
        unsigned char *cdb)
 {
@@ -605,30 +582,27 @@ static inline int core_alua_state_unavailable(
                case MI_REPORT_TARGET_PGS:
                        return 0;
                default:
-                       set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
-                       return 1;
+                       return TCM_ALUA_TG_PT_UNAVAILABLE;
                }
        case MAINTENANCE_OUT:
                switch (cdb[1]) {
                case MO_SET_TARGET_PGS:
                        return 0;
                default:
-                       set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
-                       return 1;
+                       return TCM_ALUA_TG_PT_UNAVAILABLE;
                }
        case REQUEST_SENSE:
        case READ_BUFFER:
        case WRITE_BUFFER:
                return 0;
        default:
-               set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
-               return 1;
+               return TCM_ALUA_TG_PT_UNAVAILABLE;
        }
 
        return 0;
 }
 
-static inline int core_alua_state_transition(
+static inline sense_reason_t core_alua_state_transition(
        struct se_cmd *cmd,
        unsigned char *cdb)
 {
@@ -645,16 +619,14 @@ static inline int core_alua_state_transition(
                case MI_REPORT_TARGET_PGS:
                        return 0;
                default:
-                       set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
-                       return 1;
+                       return TCM_ALUA_STATE_TRANSITION;
                }
        case REQUEST_SENSE:
        case READ_BUFFER:
        case WRITE_BUFFER:
                return 0;
        default:
-               set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
-               return 1;
+               return TCM_ALUA_STATE_TRANSITION;
        }
 
        return 0;
@@ -674,6 +646,7 @@ target_alua_state_check(struct se_cmd *cmd)
        struct t10_alua_tg_pt_gp *tg_pt_gp;
        int out_alua_state, nonop_delay_msecs;
        u16 tg_pt_gp_id;
+       sense_reason_t rc = TCM_NO_SENSE;
 
        if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
                return 0;
@@ -687,8 +660,7 @@ target_alua_state_check(struct se_cmd *cmd)
        if (atomic_read(&lun->lun_tg_pt_secondary_offline)) {
                pr_debug("ALUA: Got secondary offline status for local"
                                " target port\n");
-               set_ascq(cmd, ASCQ_04H_ALUA_OFFLINE);
-               return TCM_CHECK_CONDITION_NOT_READY;
+               return TCM_ALUA_OFFLINE;
        }
 
        if (!lun->lun_tg_pt_gp)
@@ -715,20 +687,16 @@ target_alua_state_check(struct se_cmd *cmd)
                core_alua_state_nonoptimized(cmd, cdb, nonop_delay_msecs);
                break;
        case ALUA_ACCESS_STATE_STANDBY:
-               if (core_alua_state_standby(cmd, cdb))
-                       return TCM_CHECK_CONDITION_NOT_READY;
+               rc = core_alua_state_standby(cmd, cdb);
                break;
        case ALUA_ACCESS_STATE_UNAVAILABLE:
-               if (core_alua_state_unavailable(cmd, cdb))
-                       return TCM_CHECK_CONDITION_NOT_READY;
+               rc = core_alua_state_unavailable(cmd, cdb);
                break;
        case ALUA_ACCESS_STATE_TRANSITION:
-               if (core_alua_state_transition(cmd, cdb))
-                       return TCM_CHECK_CONDITION_NOT_READY;
+               rc = core_alua_state_transition(cmd, cdb);
                break;
        case ALUA_ACCESS_STATE_LBA_DEPENDENT:
-               if (core_alua_state_lba_dependent(cmd, tg_pt_gp_id))
-                       return TCM_CHECK_CONDITION_NOT_READY;
+               rc = core_alua_state_lba_dependent(cmd, tg_pt_gp_id);
                break;
        /*
         * OFFLINE is a secondary ALUA target port group access state, that is
@@ -738,10 +706,16 @@ target_alua_state_check(struct se_cmd *cmd)
        default:
                pr_err("Unknown ALUA access state: 0x%02x\n",
                                out_alua_state);
-               return TCM_INVALID_CDB_FIELD;
+               rc = TCM_INVALID_CDB_FIELD;
        }
 
-       return 0;
+       if (rc && rc != TCM_INVALID_CDB_FIELD) {
+               pr_debug("[%s]: ALUA TG Port not available, "
+                       "SenseKey: NOT_READY, ASC/rc: 0x04/%d\n",
+                       cmd->se_tfo->fabric_name, rc);
+       }
+
+       return rc;
 }
 
 /*
index 7e35edd..0658344 100644 (file)
@@ -2003,7 +2003,6 @@ void transport_generic_request_failure(struct se_cmd *cmd,
        case TCM_ADDRESS_OUT_OF_RANGE:
        case TCM_CHECK_CONDITION_ABORT_CMD:
        case TCM_CHECK_CONDITION_UNIT_ATTENTION:
-       case TCM_CHECK_CONDITION_NOT_READY:
        case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED:
        case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED:
        case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED:
@@ -2013,6 +2012,10 @@ void transport_generic_request_failure(struct se_cmd *cmd,
        case TCM_TOO_MANY_SEGMENT_DESCS:
        case TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE:
        case TCM_INVALID_FIELD_IN_COMMAND_IU:
+       case TCM_ALUA_TG_PT_STANDBY:
+       case TCM_ALUA_TG_PT_UNAVAILABLE:
+       case TCM_ALUA_STATE_TRANSITION:
+       case TCM_ALUA_OFFLINE:
                break;
        case TCM_OUT_OF_RESOURCES:
                cmd->scsi_status = SAM_STAT_TASK_SET_FULL;
@@ -3277,9 +3280,6 @@ static const struct sense_detail sense_detail_table[] = {
        [TCM_CHECK_CONDITION_UNIT_ATTENTION] = {
                .key = UNIT_ATTENTION,
        },
-       [TCM_CHECK_CONDITION_NOT_READY] = {
-               .key = NOT_READY,
-       },
        [TCM_MISCOMPARE_VERIFY] = {
                .key = MISCOMPARE,
                .asc = 0x1d, /* MISCOMPARE DURING VERIFY OPERATION */
@@ -3340,6 +3340,26 @@ static const struct sense_detail sense_detail_table[] = {
                .asc = 0x0e,
                .ascq = 0x03, /* INVALID FIELD IN COMMAND INFORMATION UNIT */
        },
+       [TCM_ALUA_TG_PT_STANDBY] = {
+               .key = NOT_READY,
+               .asc = 0x04,
+               .ascq = ASCQ_04H_ALUA_TG_PT_STANDBY,
+       },
+       [TCM_ALUA_TG_PT_UNAVAILABLE] = {
+               .key = NOT_READY,
+               .asc = 0x04,
+               .ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE,
+       },
+       [TCM_ALUA_STATE_TRANSITION] = {
+               .key = NOT_READY,
+               .asc = 0x04,
+               .ascq = ASCQ_04H_ALUA_STATE_TRANSITION,
+       },
+       [TCM_ALUA_OFFLINE] = {
+               .key = NOT_READY,
+               .asc = 0x04,
+               .ascq = ASCQ_04H_ALUA_OFFLINE,
+       },
 };
 
 /**
@@ -3374,11 +3394,8 @@ static void translate_sense_reason(struct se_cmd *cmd, sense_reason_t reason)
                        cmd->scsi_status = SAM_STAT_BUSY;
                        return;
                }
-       } else if (sd->asc == 0) {
-               WARN_ON_ONCE(cmd->scsi_asc == 0);
-               asc = cmd->scsi_asc;
-               ascq = cmd->scsi_ascq;
        } else {
+               WARN_ON_ONCE(sd->asc == 0);
                asc = sd->asc;
                ascq = sd->ascq;
        }
index 85c16c2..f53e0f1 100644 (file)
@@ -171,7 +171,7 @@ enum tcm_sense_reason_table {
        TCM_WRITE_PROTECTED                     = R(0x0c),
        TCM_CHECK_CONDITION_ABORT_CMD           = R(0x0d),
        TCM_CHECK_CONDITION_UNIT_ATTENTION      = R(0x0e),
-       TCM_CHECK_CONDITION_NOT_READY           = R(0x0f),
+
        TCM_RESERVATION_CONFLICT                = R(0x10),
        TCM_ADDRESS_OUT_OF_RANGE                = R(0x11),
        TCM_OUT_OF_RESOURCES                    = R(0x12),
@@ -188,6 +188,10 @@ enum tcm_sense_reason_table {
        TCM_INSUFFICIENT_REGISTRATION_RESOURCES = R(0x1d),
        TCM_LUN_BUSY                            = R(0x1e),
        TCM_INVALID_FIELD_IN_COMMAND_IU         = R(0x1f),
+       TCM_ALUA_TG_PT_STANDBY                  = R(0x20),
+       TCM_ALUA_TG_PT_UNAVAILABLE              = R(0x21),
+       TCM_ALUA_STATE_TRANSITION               = R(0x22),
+       TCM_ALUA_OFFLINE                        = R(0x23),
 #undef R
 };
 
@@ -455,8 +459,6 @@ enum target_core_dif_check {
 struct se_cmd {
        /* SAM response code being sent to initiator */
        u8                      scsi_status;
-       u8                      scsi_asc;
-       u8                      scsi_ascq;
        u16                     scsi_sense_length;
        unsigned                unknown_data_length:1;
        bool                    state_active:1;