From: Damien Le Moal <dlemoal@kernel.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>,
"James E . J . Bottomley" <James.Bottomley@HansenPartnership.com>,
linux-scsi@vger.kernel.org, linux-ide@vger.kernel.org,
Niklas Cassel <cassel@kernel.org>,
linux-usb@vger.kernel.org, Alan Stern <stern@rowland.harvard.edu>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: [PATCH 08/37] scsi: sd: use 16-bits defined sense codes
Date: Mon, 31 Aug 2026 11:04:22 +0900 [thread overview]
Message-ID: <20260831020451.585944-9-dlemoal@kernel.org> (raw)
In-Reply-To: <20260831020451.585944-1-dlemoal@kernel.org>
Refactor the SCSI disk driver to use as much as possible the 16-bits
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>
---
drivers/scsi/sd.c | 106 +++++++++++++++++++++---------------------
drivers/scsi/sd_zbc.c | 2 +-
2 files changed, 53 insertions(+), 55 deletions(-)
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index fecb001115ab..b0d2542fd317 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1786,8 +1786,7 @@ static int media_not_present(struct scsi_disk *sdkp,
switch (sshdr->sense_key) {
case UNIT_ATTENTION:
case NOT_READY:
- /* medium not present */
- if (sshdr->asc == 0x3A) {
+ if (scsi_sense_asc(sshdr) == ASC_MEDIUM_NOT_PRESENT) {
set_media_not_present(sdkp);
return 1;
}
@@ -1911,12 +1910,14 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
if (scsi_status_is_check_condition(res) &&
scsi_sense_valid(&sshdr)) {
+ u8 asc = scsi_sense_asc(&sshdr);
+
sd_print_sense_hdr(sdkp, &sshdr);
/* we need to evaluate the error return */
- if (sshdr.asc == 0x3a || /* medium not present */
- sshdr.asc == 0x20 || /* invalid command */
- (sshdr.asc == 0x74 && sshdr.ascq == 0x71)) /* drive is password locked */
+ if (asc == ASC_MEDIUM_NOT_PRESENT ||
+ asc == ASC_INVALID_COMMAND_OP_CODE ||
+ sshdr.sense_code == LU_ACCESS_NOT_AUTHORIZED)
/* this is no error here */
return 0;
@@ -1926,8 +1927,8 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
* this is called during shutdown or suspend so just
* return success so those operations can proceed.
*/
- if ((sshdr.asc == 0x04 && sshdr.ascq == 0x04) ||
- sshdr.sense_key == ILLEGAL_REQUEST)
+ if (sshdr.sense_key == ILLEGAL_REQUEST ||
+ sshdr.sense_code == LU_NOT_READY_FORMAT_IN_PROGRESS)
return 0;
}
@@ -2015,7 +2016,9 @@ static int sd_scsi_to_pr_err(struct scsi_sense_hdr *sshdr, int result)
return PR_STS_IOERR;
if (sshdr->sense_key == ILLEGAL_REQUEST &&
- (sshdr->asc == 0x26 || sshdr->asc == 0x24))
+ (scsi_sense_asc(sshdr) ==
+ ASC_INVALID_FIELD_IN_PARAMETER_LIST ||
+ scsi_sense_asc(sshdr) == ASC_INVALID_FIELD_IN_CDB))
return -EINVAL;
fallthrough;
@@ -2034,8 +2037,7 @@ static int sd_pr_in_command(struct block_device *bdev, u8 sa,
struct scsi_failure failure_defs[] = {
{
.sense_key = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = 5,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -2146,8 +2148,7 @@ static int sd_pr_out_command(struct block_device *bdev, u8 sa, u64 key,
struct scsi_failure failure_defs[] = {
{
.sense_key = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = 5,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -2440,16 +2441,17 @@ static int sd_done(struct scsi_cmnd *SCpnt)
memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
break;
case ABORTED_COMMAND:
- if (sshdr.asc == 0x10) /* DIF: Target detected corruption */
+ if (scsi_sense_asc(&sshdr) == ASC_ID_CRC_OR_ECC_ERROR) /* DIF */
good_bytes = sd_completed_bytes(SCpnt);
break;
case ILLEGAL_REQUEST:
- switch (sshdr.asc) {
- case 0x10: /* DIX: Host detected corruption */
+ switch (scsi_sense_asc(&sshdr)) {
+ case ASC_ID_CRC_OR_ECC_ERROR:
+ /* DIX */
good_bytes = sd_completed_bytes(SCpnt);
break;
- case 0x20: /* INVALID COMMAND OPCODE */
- case 0x24: /* INVALID FIELD IN CDB */
+ case ASC_INVALID_COMMAND_OP_CODE:
+ case ASC_INVALID_FIELD_IN_CDB:
switch (SCpnt->cmnd[0]) {
case UNMAP:
sd_disable_discard(sdkp);
@@ -2495,14 +2497,14 @@ sd_spinup_disk(struct scsi_disk *sdkp)
/* Do not retry Medium Not Present */
{
.sense_key = UNIT_ATTENTION,
- .asc = 0x3A,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_code =
+ MEDIUM_NOT_PRESENT | SCMD_FAILURE_ASCQ_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
{
.sense_key = NOT_READY,
- .asc = 0x3A,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_code =
+ MEDIUM_NOT_PRESENT | SCMD_FAILURE_ASCQ_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Retry when scsi_status_is_good would return false 3 times */
@@ -2566,18 +2568,18 @@ sd_spinup_disk(struct scsi_disk *sdkp)
break;
if (sense_valid && sshdr.sense_key == NOT_READY) {
- if (sshdr.asc == 4 && sshdr.ascq == 3)
- break; /* manual intervention required */
- if (sshdr.asc == 4 && sshdr.ascq == 0xb)
- break; /* standby */
- if (sshdr.asc == 4 && sshdr.ascq == 0xc)
- break; /* unavailable */
- if (sshdr.asc == 4 && sshdr.ascq == 0x1b)
- break; /* sanitize in progress */
- if (sshdr.asc == 4 && sshdr.ascq == 0x24)
- break; /* depopulation in progress */
- if (sshdr.asc == 4 && sshdr.ascq == 0x25)
- break; /* depopulation restoration in progress */
+ switch (sshdr.sense_code) {
+ case LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED:
+ case LU_NOT_ACCESSIBLE_TARGET_PORT_IN_STANDBY_STATE:
+ case LU_NOT_ACCESSIBLE_TARGET_PORT_IN_UNAVAILABLE_STATE:
+ case LU_NOT_READY_SANITIZE_IN_PROGRESS:
+ case DEPOPULATION_IN_PROGRESS:
+ case DEPOPULATION_RESTORATION_IN_PROGRESS:
+ goto out;
+ default:
+ break;
+ }
+
/*
* Issue command to spin up drive when not ready
*/
@@ -2608,8 +2610,9 @@ sd_spinup_disk(struct scsi_disk *sdkp)
* occur here. It's characteristic of these devices.
*/
} else if (sense_valid &&
- sshdr.sense_key == UNIT_ATTENTION &&
- sshdr.asc == 0x28) {
+ sshdr.sense_key == UNIT_ATTENTION &&
+ scsi_sense_asc(&sshdr) ==
+ ASC_NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED) {
if (!spintime) {
spintime_expire = jiffies + 5 * HZ;
spintime = 1;
@@ -2628,6 +2631,7 @@ sd_spinup_disk(struct scsi_disk *sdkp)
} while (spintime && time_before_eq(jiffies, spintime_expire));
+out:
if (spintime) {
if (scsi_status_is_good(the_result))
printk(KERN_CONT "ready\n");
@@ -2753,15 +2757,14 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
sense_valid = scsi_sense_valid(&sshdr);
if (sense_valid &&
sshdr.sense_key == ILLEGAL_REQUEST &&
- (sshdr.asc == 0x20 || sshdr.asc == 0x24) &&
- sshdr.ascq == 0x00)
- /* Invalid Command Operation Code or
- * Invalid Field in CDB, just retry
- * silently with RC10 */
+ (sshdr.sense_code == INVALID_COMMAND_OP_CODE ||
+ sshdr.sense_code == INVALID_FIELD_IN_CDB))
+ /* Just retry silently with RC10 */
return -EINVAL;
if (sense_valid &&
sshdr.sense_key == UNIT_ATTENTION &&
- sshdr.asc == 0x29 && sshdr.ascq == 0x00)
+ sshdr.sense_code ==
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED)
/* Device reset might occur several times,
* give it one more chance */
if (--reset_retries > 0)
@@ -2818,18 +2821,18 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,
/* Do not retry Medium Not Present */
{
.sense_key = UNIT_ATTENTION,
- .asc = 0x3A,
+ .sense_code = MEDIUM_NOT_PRESENT,
.result = SAM_STAT_CHECK_CONDITION,
},
{
.sense_key = NOT_READY,
- .asc = 0x3A,
+ .sense_code = MEDIUM_NOT_PRESENT,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Device reset might occur several times so retry a lot */
{
.sense_key = UNIT_ATTENTION,
- .asc = 0x29,
+ .sense_code = POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED,
.allowed = READ_CAPACITY_RETRIES_ON_RESET,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -3258,8 +3261,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
bad_sense:
if (res == -EIO && scsi_sense_valid(&sshdr) &&
sshdr.sense_key == ILLEGAL_REQUEST &&
- sshdr.asc == 0x24 && sshdr.ascq == 0x0)
- /* Invalid field in CDB */
+ sshdr.sense_code == INVALID_FIELD_IN_CDB)
sd_first_printk(KERN_NOTICE, sdkp, "Cache data unavailable\n");
else
sd_first_printk(KERN_ERR, sdkp,
@@ -4160,22 +4162,19 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
{
/* Power on, reset, or bus device reset occurred */
.sense_key = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = 0,
+ .sense_code = POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
/* Power on occurred */
.sense_key = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = 1,
+ .sense_code = POWER_ON_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
/* SCSI bus reset */
.sense_key = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = 2,
+ .sense_code = SCSI_BUS_RESET_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{}
@@ -4207,8 +4206,7 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
sd_print_result(sdkp, "Start/Stop Unit failed", res);
if (res > 0 && scsi_sense_valid(&sshdr)) {
sd_print_sense_hdr(sdkp, &sshdr);
- /* 0x3a is medium not present */
- if (sshdr.asc == 0x3a)
+ if (scsi_sense_asc(&sshdr) == ASC_MEDIUM_NOT_PRESENT)
res = 0;
}
}
diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c
index 56e455fb5add..98f1b9864a79 100644
--- a/drivers/scsi/sd_zbc.c
+++ b/drivers/scsi/sd_zbc.c
@@ -369,7 +369,7 @@ unsigned int sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
if (op_is_zone_mgmt(req_op(rq)) &&
result &&
sshdr->sense_key == ILLEGAL_REQUEST &&
- sshdr->asc == 0x24) {
+ sshdr->sense_code == INVALID_FIELD_IN_CDB) {
/*
* INVALID FIELD IN CDB error: a zone management command was
* attempted on a conventional zone. Nothing to worry about,
--
2.55.0
next prev parent reply other threads:[~2026-08-31 2:05 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-31 2:04 [PATCH 00/37] Use defined 16-bits ASC/ASCQ combinations Damien Le Moal
2026-08-31 2:04 ` [PATCH 01/37] scsi: define all additional sense codes and their qualifiers Damien Le Moal
2026-08-31 2:04 ` [PATCH 02/37] scsi: constants: use defined sense codes Damien Le Moal
2026-08-31 2:04 ` [PATCH 03/37] scsi: constants: rename internal struct field names Damien Le Moal
2026-08-31 2:04 ` [PATCH 04/37] scsi: rename sense field of struct scsi_failure Damien Le Moal
2026-08-31 2:17 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 05/37] scsi: prepare for using 16-bits defined sense codes Damien Le Moal
2026-08-31 2:04 ` [PATCH 06/37] scsi: use struct scsi_sense_hdr to log sense keys and codes Damien Le Moal
2026-08-31 2:04 ` [PATCH 07/37] scsi: core: use 16-bits defined sense codes Damien Le Moal
2026-08-31 2:18 ` sashiko-bot
2026-08-31 2:04 ` Damien Le Moal [this message]
2026-08-31 2:04 ` [PATCH 09/37] scsi: sr: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 10/37] scsi: ses: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 11/37] scsi: ch: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 12/37] scsi: st: " Damien Le Moal
2026-08-31 2:19 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 13/37] scsi: device_handlers: hp_sw: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 14/37] scsi: device_handlers: rdac: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 15/37] scsi: device_handlers: emc: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 16/37] scsi: device_handlers: alua: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 17/37] scsi: mpt3sas: " Damien Le Moal
2026-08-31 2:19 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 18/37] scsi: mpi3mr: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 19/37] scsi: 3w-xxxx: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 20/37] scsi: leapraid: " Damien Le Moal
2026-08-31 2:18 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 21/37] scsi: megaraid: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 22/37] scsi: myrX: " Damien Le Moal
2026-08-31 2:30 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 23/37] scsi: smartpqi: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 24/37] scsi: qla2xxx: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 25/37] scsi: ps3rom: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 26/37] scsi: lpfc: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 27/37] scsi: stex: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 28/37] scsi: mvumi: " Damien Le Moal
2026-08-31 2:24 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 29/37] scsi: libiscsi: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 30/37] scsi: ibmvscsi_tgt: " Damien Le Moal
2026-08-31 2:27 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 31/37] scsi: scsi_debug: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 32/37] scsi: hpsa: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 33/37] scsi: storvsc: " Damien Le Moal
2026-08-31 2:27 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 34/37] usb: storage: " Damien Le Moal
2026-08-31 2:04 ` [PATCH 35/37] cdrom: " Damien Le Moal
2026-08-31 2:29 ` sashiko-bot
2026-08-31 2:04 ` [PATCH 36/37] ata: libata: " Damien Le Moal
2026-09-02 11:29 ` Niklas Cassel
2026-08-31 2:04 ` [PATCH 37/37] scsi: cleanup scsi_proto.h Damien Le Moal
2026-08-31 2:31 ` sashiko-bot
2026-08-31 2:36 ` [PATCH 00/37] Use defined 16-bits ASC/ASCQ combinations Damien Le Moal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260831020451.585944-9-dlemoal@kernel.org \
--to=dlemoal@kernel.org \
--cc=James.Bottomley@HansenPartnership.com \
--cc=cassel@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=stern@rowland.harvard.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox