All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Christie <michael.christie@oracle.com>
To: bvanassche@acm.org, mwilck@suse.com, hch@lst.de,
	martin.petersen@oracle.com, linux-scsi@vger.kernel.org,
	james.bottomley@hansenpartnership.com
Cc: Mike Christie <michael.christie@oracle.com>
Subject: [PATCH v6 21/35] scsi: Have scsi-ml retry read_capacity_16 errors
Date: Fri,  4 Nov 2022 18:19:13 -0500	[thread overview]
Message-ID: <20221104231927.9613-22-michael.christie@oracle.com> (raw)
In-Reply-To: <20221104231927.9613-1-michael.christie@oracle.com>

This has read_capacity_16 have scsi-ml retry errors instead of driving
them itself.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Reviewed-by: Martin Wilck <mwilck@suse.com>
---
 drivers/scsi/sd.c | 115 ++++++++++++++++++++++++++++++----------------
 1 file changed, 75 insertions(+), 40 deletions(-)

diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 37eafa968116..54e599529a3c 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -2279,59 +2279,94 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
 static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
 						unsigned char *buffer)
 {
-	unsigned char cmd[16];
+	static const u8 cmd[16] = { SERVICE_ACTION_IN_16, SAI_READ_CAPACITY_16,
+				    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, RC16_LEN };
 	struct scsi_sense_hdr sshdr;
 	int sense_valid = 0;
 	int the_result;
-	int retries = 3, reset_retries = READ_CAPACITY_RETRIES_ON_RESET;
 	unsigned int alignment;
 	unsigned long long lba;
 	unsigned sector_size;
+	struct scsi_failure failures[] = {
+		/*
+		 * Fail immediately for Invalid Command Operation Code or
+		 * Invalid Field in CDB.
+		 */
+		{
+			.sense = ILLEGAL_REQUEST,
+			.asc = 0x20,
+			.ascq = 0x0,
+			.allowed = 0,
+			.result = SAM_STAT_CHECK_CONDITION,
+		},
+		{
+			.sense = ILLEGAL_REQUEST,
+			.asc = 0x24,
+			.ascq = 0x0,
+			.allowed = 0,
+			.result = SAM_STAT_CHECK_CONDITION,
+		},
+		/* Fail immediately for Medium Not Present */
+		{
+			.sense = UNIT_ATTENTION,
+			.asc = 0x3A,
+			.ascq = 0x0,
+			.allowed = 0,
+			.result = SAM_STAT_CHECK_CONDITION,
+		},
+		{
+			.sense = NOT_READY,
+			.asc = 0x3A,
+			.ascq = 0x0,
+			.allowed = 0,
+			.result = SAM_STAT_CHECK_CONDITION,
+		},
+		{
+			.sense = UNIT_ATTENTION,
+			.asc = 0x29,
+			.ascq = 0,
+			/* Device reset might occur several times */
+			.allowed = READ_CAPACITY_RETRIES_ON_RESET,
+			.result = SAM_STAT_CHECK_CONDITION,
+		},
+		/* Any other error not listed above retry */
+		{
+			.result = SCMD_FAILURE_RESULT_ANY,
+			.allowed = 3,
+		},
+		{},
+	};
 
 	if (sdp->no_read_capacity_16)
 		return -EINVAL;
 
-	do {
-		memset(cmd, 0, 16);
-		cmd[0] = SERVICE_ACTION_IN_16;
-		cmd[1] = SAI_READ_CAPACITY_16;
-		cmd[13] = RC16_LEN;
-		memset(buffer, 0, RC16_LEN);
-
-		the_result = scsi_exec_req(((struct scsi_exec_args) {
-						.sdev = sdp,
-						.cmd = cmd,
-						.data_dir = DMA_FROM_DEVICE,
-						.buf = buffer,
-						.buf_len = RC16_LEN,
-						.sshdr = &sshdr,
-						.timeout = SD_TIMEOUT,
-						.retries = sdkp->max_retries }));
+	memset(buffer, 0, RC16_LEN);
 
-		if (media_not_present(sdkp, &sshdr))
-			return -ENODEV;
+	the_result = scsi_exec_req(((struct scsi_exec_args) {
+					.sdev = sdp,
+					.cmd = cmd,
+					.data_dir = DMA_FROM_DEVICE,
+					.buf = buffer,
+					.buf_len = RC16_LEN,
+					.sshdr = &sshdr,
+					.timeout = SD_TIMEOUT,
+					.retries = sdkp->max_retries,
+					.failures = failures }));
 
-		if (the_result > 0) {
-			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 */
-				return -EINVAL;
-			if (sense_valid &&
-			    sshdr.sense_key == UNIT_ATTENTION &&
-			    sshdr.asc == 0x29 && sshdr.ascq == 0x00)
-				/* Device reset might occur several times,
-				 * give it one more chance */
-				if (--reset_retries > 0)
-					continue;
-		}
-		retries--;
+	if (media_not_present(sdkp, &sshdr))
+		return -ENODEV;
 
-	} while (the_result && retries);
+	if (the_result > 0) {
+		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
+			 */
+			return -EINVAL;
+	}
 
 	if (the_result) {
 		sd_print_result(sdkp, "Read Capacity(16) failed", the_result);
-- 
2.25.1


  parent reply	other threads:[~2022-11-04 23:24 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-04 23:18 [PATCH v6 00/35] Allow scsi_execute users to control retries Mike Christie
2022-11-04 23:18 ` [PATCH v6 01/35] scsi: Add helper to prep sense during error handling Mike Christie
2022-11-04 23:18 ` [PATCH v6 02/35] scsi: Allow passthrough to override what errors to retry Mike Christie
2022-11-08 23:57   ` Bart Van Assche
2022-11-09  3:49     ` Mike Christie
2022-11-15  8:10   ` Christoph Hellwig
2022-11-04 23:18 ` [PATCH v6 03/35] scsi: Add struct for args to execution functions Mike Christie
2022-11-10 11:15   ` John Garry
2022-11-10 17:26     ` Bart Van Assche
2022-11-10 18:09       ` John Garry
2022-11-10 18:21         ` Mike Christie
2022-11-10 18:40     ` Mike Christie
2022-11-10 19:26       ` Mike Christie
2022-11-10 20:47         ` Bart Van Assche
2022-11-11 12:07         ` John Garry
2022-11-15  8:13           ` Christoph Hellwig
2022-11-15  8:25   ` Christoph Hellwig
2022-11-04 23:18 ` [PATCH v6 04/35] scsi: Add scsi_failure field to scsi_exec_args Mike Christie
2022-11-15  8:25   ` Christoph Hellwig
2022-11-04 23:18 ` [PATCH v6 05/35] scsi: libata: Convert to scsi_exec_req Mike Christie
2022-11-04 23:18 ` [PATCH v6 06/35] hwmon: drivetemp: " Mike Christie
2022-11-04 23:18 ` [PATCH v6 07/35] scsi: ch: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 08/35] scsi: scsi_dh: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 09/35] scsi: core: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 10/35] scsi: spi: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 11/35] scsi: sd: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 12/35] scsi: zbc: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 13/35] scsi: ses: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 14/35] scsi: sr: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 15/35] scsi: virtio_scsi: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 16/35] scsi: target_core_pscsi: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 17/35] scsi: cxlflash: " Mike Christie
2022-11-04 23:19 ` [PATCH v6 18/35] scsi: Remove scsi_execute functions Mike Christie
2022-11-04 23:19 ` [PATCH v6 19/35] scsi: Have scsi-ml retry scsi_probe_lun errors Mike Christie
2022-11-04 23:19 ` [PATCH v6 20/35] scsi: retry INQUIRY after timeout Mike Christie
2022-11-04 23:19 ` Mike Christie [this message]
2022-11-09 18:42   ` [PATCH v6 21/35] scsi: Have scsi-ml retry read_capacity_16 errors Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 22/35] scsi: Have scsi-ml retry sd_spinup_disk errors Mike Christie
2022-11-09 18:45   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 23/35] scsi: hp_sw: Have scsi-ml retry scsi_exec_req errors Mike Christie
2022-11-04 23:19 ` [PATCH v6 24/35] scsi: rdac: Have scsi-ml retry send_mode_select errors Mike Christie
2022-11-04 23:19 ` [PATCH v6 25/35] scsi: spi: Have scsi-ml retry spi_execute errors Mike Christie
2022-11-04 23:19 ` [PATCH v6 26/35] scsi: sd: Have scsi-ml retry sd_sync_cache errors Mike Christie
2022-11-09 18:47   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 27/35] scsi: ch: Have scsi-ml retry ch_do_scsi errors Mike Christie
2022-11-09 18:50   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 28/35] scsi: Have scsi-ml retry scsi_mode_sense errors Mike Christie
2022-11-09 18:51   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 29/35] scsi: Have scsi-ml retry scsi_report_lun_scan errors Mike Christie
2022-11-09 18:53   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 30/35] scsi: sd: Have sd_pr_command retry UAs Mike Christie
2022-11-09 18:53   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 31/35] scsi: sd: Have scsi-ml retry read_capacity_10 errors Mike Christie
2022-11-09 18:55   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 32/35] scsi: ses: Have scsi-ml retry scsi_exec_req errors Mike Christie
2022-11-04 23:19 ` [PATCH v6 33/35] scsi: sr: Have scsi-ml retry get_sectorsize errors Mike Christie
2022-11-04 23:19 ` [PATCH v6 34/35] scsi: ufs: Have scsi-ml retry start stop errors Mike Christie
2022-11-09 19:00   ` Bart Van Assche
2022-11-04 23:19 ` [PATCH v6 35/35] scsi: Add kunit tests for scsi_check_passthrough Mike Christie
2022-11-09 19:01   ` Bart Van Assche

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=20221104231927.9613-22-michael.christie@oracle.com \
    --to=michael.christie@oracle.com \
    --cc=bvanassche@acm.org \
    --cc=hch@lst.de \
    --cc=james.bottomley@hansenpartnership.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    --cc=mwilck@suse.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.