forked from Minki/linux
scsi: target: core: Drop unnecessary se_cmd ASC/ASCQ members
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>
This commit is contained in:
parent
35410f8624
commit
40fd8845c0
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user