scsi: sd: Use separate buf for START_STOP in sd_spinup_disk()
authorMike Christie <michael.christie@oracle.com>
Tue, 23 Jan 2024 00:22:05 +0000 (18:22 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 30 Jan 2024 02:20:53 +0000 (21:20 -0500)
We currently reuse the cmd buffer for the TUR and START_STOP commands
which requires us to reset the buffer when retrying. This has us use
separate buffers for the 2 commands so we can make them const and I think
it makes it easier to handle for retries but does not add too much extra to
the stack use.

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

index 0833b3e6aa6e8f35b791d3f75fe208fb0f888914..3d85913d373c809d278b0e0fe1acb049e90c1bcf 100644 (file)
@@ -2318,14 +2318,16 @@ sd_spinup_disk(struct scsi_disk *sdkp)
                         * Issue command to spin up drive when not ready
                         */
                        if (!spintime) {
+                               /* Return immediately and start spin cycle */
+                               const u8 start_cmd[10] = {
+                                       [0] = START_STOP,
+                                       [1] = 1,
+                                       [4] = sdkp->device->start_stop_pwr_cond ?
+                                               0x11 : 1,
+                               };
+
                                sd_printk(KERN_NOTICE, sdkp, "Spinning up disk...");
-                               cmd[0] = START_STOP;
-                               cmd[1] = 1;     /* Return immediately */
-                               memset((void *) &cmd[2], 0, 8);
-                               cmd[4] = 1;     /* Start spin cycle */
-                               if (sdkp->device->start_stop_pwr_cond)
-                                       cmd[4] |= 1 << 4;
-                               scsi_execute_cmd(sdkp->device, cmd,
+                               scsi_execute_cmd(sdkp->device, start_cmd,
                                                 REQ_OP_DRV_IN, NULL, 0,
                                                 SD_TIMEOUT, sdkp->max_retries,
                                                 &exec_args);