On 30.07.20 17:10, Alan Stern wrote: > On Thu, Jul 30, 2020 at 10:52:14AM +0200, Martin Kepplinger wrote: >> Maybe I should just start a new discussion with a patch, but the below >> is what makes sense to me (when I understand you correctly) and seems to >> work. I basically add a new flag, so that the old flags behave unchanged >> and only call it during *runtime* resume for SD cards: >> >> >> --- a/drivers/scsi/scsi_error.c >> +++ b/drivers/scsi/scsi_error.c >> @@ -553,15 +553,21 @@ int scsi_check_sense(struct scsi_cmnd *scmd) >> * information that we should pass up to the upper-level >> driver >> * so that we can deal with it there. >> */ >> - if (scmd->device->expecting_cc_ua) { >> + if (scmd->device->expecting_cc_ua || >> + scmd->device->expecting_media_change) { >> /* >> * Because some device does not queue unit >> * attentions correctly, we carefully check >> * additional sense code and qualifier so as >> - * not to squash media change unit attention. >> + * not to squash media change unit attention; >> + * unless expecting_media_change is set, indicating >> + * that the media (most likely) didn't change >> + * but a device only believes so (for example >> + * because of suspend/resume). >> */ >> - if (sshdr.asc != 0x28 || sshdr.ascq != 0x00) { >> - scmd->device->expecting_cc_ua = 0; >> + if ((sshdr.asc != 0x28 || sshdr.ascq != 0x00) || >> + scmd->device->expecting_media_change) { >> + scmd->device->expecting_media_change = 0; >> return NEEDS_RETRY; >> } >> } >> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c >> index d90fefffe31b..b647fab2b663 100644 >> --- a/drivers/scsi/sd.c >> +++ b/drivers/scsi/sd.c >> @@ -114,6 +114,7 @@ static void sd_shutdown(struct device *); >> static int sd_suspend_system(struct device *); >> static int sd_suspend_runtime(struct device *); >> static int sd_resume(struct device *); >> +static int sd_resume_runtime(struct device *); >> static void sd_rescan(struct device *); >> static blk_status_t sd_init_command(struct scsi_cmnd *SCpnt); >> static void sd_uninit_command(struct scsi_cmnd *SCpnt); >> @@ -574,7 +575,7 @@ static const struct dev_pm_ops sd_pm_ops = { >> .poweroff = sd_suspend_system, >> .restore = sd_resume, >> .runtime_suspend = sd_suspend_runtime, >> - .runtime_resume = sd_resume, >> + .runtime_resume = sd_resume_runtime, >> }; >> >> static struct scsi_driver sd_template = { >> @@ -3652,6 +3653,21 @@ static int sd_resume(struct device *dev) >> return ret; >> } >> >> +static int sd_resume_runtime(struct device *dev) >> +{ >> + struct scsi_disk *sdkp = dev_get_drvdata(dev); >> + >> + /* Some SD cardreaders report media change when resuming from >> suspend >> + * because they can't keep track during suspend. */ >> + >> + /* XXX This is not unproblematic though: We won't notice when a card >> + * was really changed during runtime suspend! We basically rely >> on users >> + * to unmount or suspend before doing so. */ >> + sdkp->device->expecting_media_change = 1; >> + >> + return sd_resume(dev); >> +} >> + >> /** >> * init_sd - entry point for this driver (both when built in or when >> * a module). >> diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h >> index bc5909033d13..8c8f053f71c8 100644 >> --- a/include/scsi/scsi_device.h >> +++ b/include/scsi/scsi_device.h >> @@ -169,6 +169,8 @@ struct scsi_device { >> * this device */ >> unsigned expecting_cc_ua:1; /* Expecting a CHECK_CONDITION/UNIT_ATTN >> * because we did a bus reset. */ >> + unsigned expecting_media_change:1; /* Expecting media change >> ASC/ASCQ >> + when it actually doesn't >> change */ >> unsigned use_10_for_rw:1; /* first try 10-byte read / write */ >> unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */ >> unsigned set_dbd_for_ms:1; /* Set "DBD" field in mode sense */ > > That's pretty much what James was suggesting, except for one thing: You > must not set sdkp->device->expecting_media_change to 1 for all devices > in sd_runtime_resume(). Only for devices which may generate a spurious > Unit Attention following runtime resume -- and maybe not even for all of > them, depending on what the user wants. > > Alan Stern > when I mount the SD card myself or via Nautilus, things work. When I put sth like: /dev/sda1 /mnt/sda1 auto auto,nofail 0 2 into fstab, I *still* get (constantly) when accessing the files: [ 50.838061] sd 0:0:0:0: [sda] tag#0 device offline or changed why could that be? is there another place we would add such a new flag (not only resume())? martin