scsi: sd: Fix sshdr use in sd_spinup_disk
authorMike Christie <michael.christie@oracle.com>
Wed, 4 Oct 2023 21:00:03 +0000 (16:00 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 13 Oct 2023 20:36:19 +0000 (16:36 -0400)
If scsi_execute_cmd returns < 0, it doesn't initialize the sshdr, so we
shouldn't access the sshdr. If it returns 0, then the cmd executed
successfully, so there is no need to check the sshdr. This has us access
the sshdr when we get a return value > 0.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
Link: https://lore.kernel.org/r/20231004210013.5601-3-michael.christie@oracle.com
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Martin Wilck <mwilck@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/sd.c

index cc78b5e49f32b2135611883d09eda8de4b20c880..dde9b670798012c78c48af30692e678719f1bd80 100644 (file)
@@ -2180,19 +2180,21 @@ sd_spinup_disk(struct scsi_disk *sdkp)
                                                      sdkp->max_retries,
                                                      &exec_args);
 
-                       /*
-                        * If the drive has indicated to us that it
-                        * doesn't have any media in it, don't bother
-                        * with any more polling.
-                        */
-                       if (media_not_present(sdkp, &sshdr)) {
-                               if (media_was_present)
-                                       sd_printk(KERN_NOTICE, sdkp, "Media removed, stopped polling\n");
-                               return;
-                       }
+                       if (the_result > 0) {
+                               /*
+                                * If the drive has indicated to us that it
+                                * doesn't have any media in it, don't bother
+                                * with any more polling.
+                                */
+                               if (media_not_present(sdkp, &sshdr)) {
+                                       if (media_was_present)
+                                               sd_printk(KERN_NOTICE, sdkp,
+                                                         "Media removed, stopped polling\n");
+                                       return;
+                               }
 
-                       if (the_result)
                                sense_valid = scsi_sense_valid(&sshdr);
+                       }
                        retries++;
                } while (retries < 3 &&
                         (!scsi_status_is_good(the_result) ||