scsi: sr: Have midlayer retry get_sectorsize() errors
authorMike Christie <michael.christie@oracle.com>
Tue, 23 Jan 2024 00:22:18 +0000 (18:22 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 30 Jan 2024 02:20:54 +0000 (21:20 -0500)
This has get_sectorsize() have the SCSI midlayer retry errors instead of
driving them itself.

There is one behavior change where we no longer retry when
scsi_execute_cmd() returns < 0, but we should be ok. We don't need to retry
for failures like the queue being removed, and for the case where there are
no tags/reqs the block layer waits/retries for us. For possible memory
allocation failures from blk_rq_map_kern() we use GFP_NOIO, so retrying
will probably not help.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Link: https://lore.kernel.org/r/20240123002220.129141-18-michael.christie@oracle.com
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/sr.c

index d093dd1..268b3a4 100644 (file)
@@ -717,27 +717,29 @@ fail:
 
 static void get_sectorsize(struct scsi_cd *cd)
 {
-       unsigned char cmd[10];
-       unsigned char buffer[8];
-       int the_result, retries = 3;
+       static const u8 cmd[10] = { READ_CAPACITY };
+       unsigned char buffer[8] = { };
+       int the_result;
        int sector_size;
        struct request_queue *queue;
+       struct scsi_failure failure_defs[] = {
+               {
+                       .result = SCMD_FAILURE_RESULT_ANY,
+                       .allowed = 3,
+               },
+               {}
+       };
+       struct scsi_failures failures = {
+               .failure_definitions = failure_defs,
+       };
+       const struct scsi_exec_args exec_args = {
+               .failures = &failures,
+       };
 
-       do {
-               cmd[0] = READ_CAPACITY;
-               memset((void *) &cmd[1], 0, 9);
-               memset(buffer, 0, sizeof(buffer));
-
-               /* Do the command and wait.. */
-               the_result = scsi_execute_cmd(cd->device, cmd, REQ_OP_DRV_IN,
-                                             buffer, sizeof(buffer),
-                                             SR_TIMEOUT, MAX_RETRIES, NULL);
-
-               retries--;
-
-       } while (the_result && retries);
-
-
+       /* Do the command and wait.. */
+       the_result = scsi_execute_cmd(cd->device, cmd, REQ_OP_DRV_IN, buffer,
+                                     sizeof(buffer), SR_TIMEOUT, MAX_RETRIES,
+                                     &exec_args);
        if (the_result) {
                cd->capacity = 0x1fffff;
                sector_size = 2048;     /* A guess, just in case */