Skip to content

Commit

Permalink
scsi: target: core: Drop unnecessary se_cmd ASC/ASCQ members
Browse files Browse the repository at this point in the history
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/[email protected]
Reviewed-by: Mike Christie <[email protected]>
Signed-off-by: David Disseldorp <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>
  • Loading branch information
ddiss authored and martinkpetersen committed Aug 3, 2021
1 parent 35410f8 commit 40fd884
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 67 deletions.
86 changes: 30 additions & 56 deletions drivers/target/target_core_alua.c
Original file line number Diff line number Diff line change
Expand Up @@ -428,22 +428,6 @@ target_emulate_set_target_port_groups(struct se_cmd *cmd)
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,
Expand All @@ -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)
{
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}
Expand All @@ -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)
{
Expand All @@ -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:
Expand All @@ -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)
{
Expand All @@ -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)
{
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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)
Expand All @@ -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
Expand All @@ -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;
}

/*
Expand Down
33 changes: 25 additions & 8 deletions drivers/target/target_core_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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,
},
};

/**
Expand Down Expand Up @@ -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;
}
Expand Down
8 changes: 5 additions & 3 deletions include/target/target_core_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -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
};

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 40fd884

Please sign in to comment.