mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
scsi: device_handlers: rdac: Use combined sense codes
Refactor the NetApp E-Series RDAC SCSI device handler driver to use the 16-bit sense_code field of struct scsi_sense_hdr and struct scsi_failure and replace all hard-coded additional sense codes and additional sense code qualifiers with the enum values defined in include/scsi/scsi_sense.h. This helps with code clarity as the sense codes being processed are easier to test and self-documented. No functional change intended. Signed-off-by: Damien Le Moal <dlemoal@kernel.org> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Hannes Reinecke <hare@kernel.org> Link: https://patch.msgid.link/20260908090308.1085097-15-dlemoal@kernel.org Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
This commit is contained in:
parent
700ab5e279
commit
5c0ae0bcee
|
|
@ -493,7 +493,8 @@ static int mode_select_handle_sense(struct scsi_device *sdev,
|
|||
RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
|
||||
"MODE_SELECT returned with sense %02x/%02x/%02x",
|
||||
(char *) h->ctlr->array_name, h->ctlr->index,
|
||||
sense_hdr->sense_key, sense_hdr->asc, sense_hdr->ascq);
|
||||
sense_hdr->sense_key, scsi_sense_asc(sense_hdr),
|
||||
scsi_sense_ascq(sense_hdr));
|
||||
|
||||
return SCSI_DH_IO;
|
||||
}
|
||||
|
|
@ -515,34 +516,28 @@ static void send_mode_select(struct work_struct *work)
|
|||
struct scsi_failure failure_defs[] = {
|
||||
{
|
||||
.sense_key = NO_SENSE,
|
||||
.asc = SCMD_FAILURE_ASC_ANY,
|
||||
.ascq = SCMD_FAILURE_ASCQ_ANY,
|
||||
.sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
|
||||
.result = SAM_STAT_CHECK_CONDITION,
|
||||
},
|
||||
{
|
||||
.sense_key = ABORTED_COMMAND,
|
||||
.asc = SCMD_FAILURE_ASC_ANY,
|
||||
.ascq = SCMD_FAILURE_ASCQ_ANY,
|
||||
.sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
|
||||
.result = SAM_STAT_CHECK_CONDITION,
|
||||
},
|
||||
{
|
||||
.sense_key = UNIT_ATTENTION,
|
||||
.asc = SCMD_FAILURE_ASC_ANY,
|
||||
.ascq = SCMD_FAILURE_ASCQ_ANY,
|
||||
.sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
|
||||
.result = SAM_STAT_CHECK_CONDITION,
|
||||
},
|
||||
/* LUN Not Ready and is in the Process of Becoming Ready */
|
||||
{
|
||||
.sense_key = NOT_READY,
|
||||
.asc = 0x04,
|
||||
.ascq = 0x01,
|
||||
.sense_code = LU_IS_IN_PROCESS_OF_BECOMING_READY,
|
||||
.result = SAM_STAT_CHECK_CONDITION,
|
||||
},
|
||||
/* Command Lock contention */
|
||||
/* Command Lock contention (not a standard sense code) */
|
||||
{
|
||||
.sense_key = ILLEGAL_REQUEST,
|
||||
.asc = 0x91,
|
||||
.ascq = 0x36,
|
||||
.sense_code = scsi_sense_code(0x91, 0x36),
|
||||
.allowed = SCMD_FAILURE_NO_LIMIT,
|
||||
.result = SAM_STAT_CHECK_CONDITION,
|
||||
},
|
||||
|
|
@ -674,33 +669,34 @@ static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
|
|||
{
|
||||
struct rdac_dh_data *h = sdev->handler_data;
|
||||
|
||||
RDAC_LOG(RDAC_LOG_SENSE, sdev, "array %s, ctlr %d, "
|
||||
"I/O returned with sense %02x/%02x/%02x",
|
||||
(char *) h->ctlr->array_name, h->ctlr->index,
|
||||
sense_hdr->sense_key, sense_hdr->asc, sense_hdr->ascq);
|
||||
RDAC_LOG(RDAC_LOG_SENSE, sdev,
|
||||
"array %s, ctlr %d, I/O returned with sense %02x/%02x/%02x",
|
||||
(char *) h->ctlr->array_name, h->ctlr->index,
|
||||
sense_hdr->sense_key, scsi_sense_asc(sense_hdr),
|
||||
scsi_sense_ascq(sense_hdr));
|
||||
|
||||
switch (sense_hdr->sense_key) {
|
||||
case NOT_READY:
|
||||
if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x01)
|
||||
if (sense_hdr->sense_code == LU_IS_IN_PROCESS_OF_BECOMING_READY)
|
||||
/* LUN Not Ready - Logical Unit Not Ready and is in
|
||||
* the process of becoming ready
|
||||
* Just retry.
|
||||
*/
|
||||
return ADD_TO_MLQUEUE;
|
||||
if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x81)
|
||||
if (sense_hdr->sense_code == scsi_sense_code(0x04, 0x81))
|
||||
/* LUN Not Ready - Storage firmware incompatible
|
||||
* Manual code synchonisation required.
|
||||
*
|
||||
* Nothing we can do here. Try to bypass the path.
|
||||
*/
|
||||
return SUCCESS;
|
||||
if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0xA1)
|
||||
if (sense_hdr->sense_code == scsi_sense_code(0x04, 0xA1))
|
||||
/* LUN Not Ready - Quiescense in progress
|
||||
*
|
||||
* Just retry and wait.
|
||||
*/
|
||||
return ADD_TO_MLQUEUE;
|
||||
if (sense_hdr->asc == 0xA1 && sense_hdr->ascq == 0x02)
|
||||
if (sense_hdr->sense_code == scsi_sense_code(0xA1, 0x02))
|
||||
/* LUN Not Ready - Quiescense in progress
|
||||
* or has been achieved
|
||||
* Just retry.
|
||||
|
|
@ -708,7 +704,7 @@ static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
|
|||
return ADD_TO_MLQUEUE;
|
||||
break;
|
||||
case ILLEGAL_REQUEST:
|
||||
if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) {
|
||||
if (sense_hdr->sense_code == scsi_sense_code(0x94, 0x01)) {
|
||||
/* Invalid Request - Current Logical Unit Ownership.
|
||||
* Controller is not the current owner of the LUN,
|
||||
* Fail the path, so that the other path be used.
|
||||
|
|
@ -718,12 +714,13 @@ static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
|
|||
}
|
||||
break;
|
||||
case UNIT_ATTENTION:
|
||||
if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00)
|
||||
if (sense_hdr->sense_code ==
|
||||
POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED)
|
||||
/*
|
||||
* Power On, Reset, or Bus Device Reset, just retry.
|
||||
*/
|
||||
return ADD_TO_MLQUEUE;
|
||||
if (sense_hdr->asc == 0x8b && sense_hdr->ascq == 0x02)
|
||||
if (sense_hdr->sense_code == scsi_sense_code(0x8b, 0x02))
|
||||
/*
|
||||
* Quiescence in progress , just retry.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user