From: Martin K. Petersen Date: Tue, 14 Nov 2023 16:40:40 +0000 (-0500) Subject: Merge branch '6.7/scsi-staging' into 6.7/scsi-fixes X-Git-Tag: v6.7-rc2~8^2 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=2a0508d9d08f0c3e354044d4f48466ee0d225041;p=linux-2.6-block.git Merge branch '6.7/scsi-staging' into 6.7/scsi-fixes Pull in queued fixes for 6.7 Signed-off-by: Martin K. Petersen --- 2a0508d9d08f0c3e354044d4f48466ee0d225041 diff --cc drivers/scsi/sd.c index 530918cbfce2,3ef3b00397fe..fa00dd503cbf --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@@ -3853,28 -3779,18 +3858,27 @@@ static void sd_shutdown(struct device * if (sdkp->WCE && sdkp->media_present) { sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n"); - sd_sync_cache(sdkp, NULL); + sd_sync_cache(sdkp); } - if (system_state != SYSTEM_RESTART && sdkp->device->manage_start_stop) { + if ((system_state != SYSTEM_RESTART && + sdkp->device->manage_system_start_stop) || + (system_state == SYSTEM_POWER_OFF && + sdkp->device->manage_shutdown)) { sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n"); sd_start_stop_device(sdkp, 0); } } -static int sd_suspend_common(struct device *dev, bool ignore_stop_errors) +static inline bool sd_do_start_stop(struct scsi_device *sdev, bool runtime) +{ + return (sdev->manage_system_start_stop && !runtime) || + (sdev->manage_runtime_start_stop && runtime); +} + +static int sd_suspend_common(struct device *dev, bool runtime) { struct scsi_disk *sdkp = dev_get_drvdata(dev); - struct scsi_sense_hdr sshdr; int ret = 0; if (!sdkp) /* E.g.: runtime suspend following sd_remove() */ @@@ -3883,27 -3799,16 +3887,16 @@@ if (sdkp->WCE && sdkp->media_present) { if (!sdkp->device->silence_suspend) sd_printk(KERN_NOTICE, sdkp, "Synchronizing SCSI cache\n"); - ret = sd_sync_cache(sdkp, &sshdr); - - if (ret) { - /* ignore OFFLINE device */ - if (ret == -ENODEV) - return 0; - - if (!scsi_sense_valid(&sshdr) || - sshdr.sense_key != ILLEGAL_REQUEST) - return ret; + ret = sd_sync_cache(sdkp); + /* ignore OFFLINE device */ + if (ret == -ENODEV) + return 0; - /* - * sshdr.sense_key == ILLEGAL_REQUEST means this drive - * doesn't support sync. There's not much to do and - * suspend shouldn't fail. - */ - ret = 0; - } + if (ret) + return ret; } - if (sdkp->device->manage_start_stop) { + if (sd_do_start_stop(sdkp->device, runtime)) { if (!sdkp->device->silence_suspend) sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n"); /* an error is not worth aborting a system sleep */