scsi: sd: Fix sshdr use in cache_type_store
authorMike Christie <michael.christie@oracle.com>
Wed, 4 Oct 2023 21:00:12 +0000 (16:00 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 13 Oct 2023 20:36:20 +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-12-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>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/sd.c

index 674e844aa72cbb9b0929cbae293ab0a35d8696cf..ce091ffcf3de2b37960441b3d89a50dcdb70794b 100644 (file)
@@ -143,7 +143,7 @@ cache_type_store(struct device *dev, struct device_attribute *attr,
        struct scsi_mode_data data;
        struct scsi_sense_hdr sshdr;
        static const char temp[] = "temporary ";
-       int len;
+       int len, ret;
 
        if (sdp->type != TYPE_DISK && sdp->type != TYPE_ZBC)
                /* no cache control on RBC devices; theoretically they
@@ -190,9 +190,10 @@ cache_type_store(struct device *dev, struct device_attribute *attr,
         */
        data.device_specific = 0;
 
-       if (scsi_mode_select(sdp, 1, sp, buffer_data, len, SD_TIMEOUT,
-                            sdkp->max_retries, &data, &sshdr)) {
-               if (scsi_sense_valid(&sshdr))
+       ret = scsi_mode_select(sdp, 1, sp, buffer_data, len, SD_TIMEOUT,
+                              sdkp->max_retries, &data, &sshdr);
+       if (ret) {
+               if (ret > 0 && scsi_sense_valid(&sshdr))
                        sd_print_sense_hdr(sdkp, &sshdr);
                return -EINVAL;
        }