From patchwork Tue Jan 12 09:33:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Kepplinger X-Patchwork-Id: 12012903 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 225A9C433E6 for ; Tue, 12 Jan 2021 09:35:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D97B4230FF for ; Tue, 12 Jan 2021 09:35:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405926AbhALJee (ORCPT ); Tue, 12 Jan 2021 04:34:34 -0500 Received: from comms.puri.sm ([159.203.221.185]:33578 "EHLO comms.puri.sm" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389242AbhALJee (ORCPT ); Tue, 12 Jan 2021 04:34:34 -0500 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 815A4DFDE3; Tue, 12 Jan 2021 01:33:53 -0800 (PST) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kerfCn-QRys9; Tue, 12 Jan 2021 01:33:52 -0800 (PST) From: Martin Kepplinger To: jejb@linux.ibm.com, martin.petersen@oracle.com, stern@rowland.harvard.edu, bvanassche@acm.org Cc: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Kepplinger Subject: [PATCH v2 1/3] scsi: add expecting_media_change flag to error path Date: Tue, 12 Jan 2021 10:33:27 +0100 Message-Id: <20210112093329.3639-2-martin.kepplinger@puri.sm> In-Reply-To: <20210112093329.3639-1-martin.kepplinger@puri.sm> References: <20210112093329.3639-1-martin.kepplinger@puri.sm> Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org SD Cardreaders (especially) sometimes lose the state during suspend and deliver a "media changed" unit attention when really only a (runtime) suspend/resume cycle has been done. For such devices, I/O fails when runtime PM is enabled, see below. Add a flag for drivers to use when this is expected. It's handled in the scsi core error path and allows to use (runtime) PM when it has not been possible before on said hardware. The "downside" is that we rely more on users not to really change the medium (SD card) *during* a runtime suspend/resume, i.e. when not unmounting. To enable runtime PM for an SD cardreader (here, device number 0:0:0:0), do the following: echo 0 > /sys/module/block/parameters/events_dfl_poll_msecs echo 1000 > /sys/bus/scsi/devices/0:0:0:0/power/autosuspend_delay_ms echo auto > /sys/bus/scsi/devices/0:0:0:0/power/control Signed-off-by: Martin Kepplinger --- drivers/scsi/scsi_error.c | 36 +++++++++++++++++++++++++++++++----- include/scsi/scsi_device.h | 1 + 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index f11f51e2465f..f3b34c142088 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -573,6 +573,18 @@ int scsi_check_sense(struct scsi_cmnd *scmd) return NEEDS_RETRY; } } + if (scmd->device->expecting_media_change) { + if (sshdr.asc == 0x28 && sshdr.ascq == 0x00) { + /* + * clear the expecting_media_change in + * scsi_decide_disposition() because we + * need to catch possible "fail fast" overrides + * that block readahead can cause. + */ + return NEEDS_RETRY; + } + } + /* * we might also expect a cc/ua if another LUN on the target * reported a UA with an ASC/ASCQ of 3F 0E - @@ -1959,14 +1971,28 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd) * the request was not marked fast fail. Note that above, * even if the request is marked fast fail, we still requeue * for queue congestion conditions (QUEUE_FULL or BUSY) */ - if (scsi_cmd_retry_allowed(scmd) && !scsi_noretry_cmd(scmd)) { - return NEEDS_RETRY; - } else { - /* - * no more retries - report this one back to upper level. + if (scsi_cmd_retry_allowed(scmd)) { + /* but scsi_noretry_cmd() cannot override the + * expecting_media_change flag. */ + if (!scsi_noretry_cmd(scmd) || + scmd->device->expecting_media_change) { + scmd->device->expecting_media_change = 0; + return NEEDS_RETRY; + } + + /* Not marked fail fast, or marked but not expected. + * Clear the flag too because it's meant for the + * next UA only. + */ + scmd->device->expecting_media_change = 0; return SUCCESS; } + + /* + * no more retries - report this one back to upper level. + */ + return SUCCESS; } static void eh_lock_door_done(struct request *req, blk_status_t status) diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 1a5c9a3df6d6..ca2c3eb5830f 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -170,6 +170,7 @@ 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 changed" UA */ 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 */ From patchwork Tue Jan 12 09:33:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Kepplinger X-Patchwork-Id: 12012905 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 919D8C43381 for ; Tue, 12 Jan 2021 09:35:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5C78423101 for ; Tue, 12 Jan 2021 09:35:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391018AbhALJei (ORCPT ); Tue, 12 Jan 2021 04:34:38 -0500 Received: from comms.puri.sm ([159.203.221.185]:33594 "EHLO comms.puri.sm" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405953AbhALJeg (ORCPT ); Tue, 12 Jan 2021 04:34:36 -0500 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 3F98CDFDF1; Tue, 12 Jan 2021 01:33:56 -0800 (PST) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id zLf_7nlhkmYV; Tue, 12 Jan 2021 01:33:55 -0800 (PST) From: Martin Kepplinger To: jejb@linux.ibm.com, martin.petersen@oracle.com, stern@rowland.harvard.edu, bvanassche@acm.org Cc: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Kepplinger Subject: [PATCH v2 2/3] scsi: sd: add ignore_resume_medium_changed disk setting Date: Tue, 12 Jan 2021 10:33:28 +0100 Message-Id: <20210112093329.3639-3-martin.kepplinger@puri.sm> In-Reply-To: <20210112093329.3639-1-martin.kepplinger@puri.sm> References: <20210112093329.3639-1-martin.kepplinger@puri.sm> Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Add a userspace knob for scsi disks that deliver a MEDIA CHANGED unit attention when the device actually only resumes from (runtime) suspend. Those devices need the new ignore_resume_medium_changed knob set to 1 in order to be able to use runtime PM. To enable runtime PM for an SD cardreader (here, device number 0:0:0:0), do the following: echo 0 > /sys/module/block/parameters/events_dfl_poll_msecs echo 1000 > /sys/bus/scsi/devices/0:0:0:0/power/autosuspend_delay_ms echo auto > /sys/bus/scsi/devices/0:0:0:0/power/control Set ignore_resume_medium_changed to 1 if you experience this problem. Otherwise the unit attention would trigger I/O failure like the following when using the mounted disk: [ 167.603864] sd 0:0:0:0: [sda] tag#0 UNKNOWN(0x2003) Result: hostbyte=0x00 driverbyte=0x08 cmd_age=0s [ 167.603892] sd 0:0:0:0: [sda] tag#0 Sense Key : 0x6 [current] [ 167.603899] sd 0:0:0:0: [sda] tag#0 ASC=0x28 ASCQ=0x0 [ 167.603909] sd 0:0:0:0: [sda] tag#0 CDB: opcode=0x2a 2a 00 01 c4 08 98 00 00 10 00 [ 167.603915] blk_update_request: I/O error, dev sda, sector 29624472 op 0x1:(WRITE) flags 0x800 phys_seg 2 prio class 0 [ 167.614750] Aborting journal on device sda1-8. [ 167.619460] sd 0:0:0:0: [sda] tag#0 device offline or changed [ 167.625342] blk_update_request: I/O error, dev sda, sector 29624320 op 0x1:(WRITE) flags 0x800 phys_seg 1 prio class 0 [ 167.636161] Buffer I/O error on dev sda1, logical block 3702784, lost sync page write [ 167.644132] JBD2: Error -5 detected when updating journal superblock for sda1-8. Signed-off-by: Martin Kepplinger --- drivers/scsi/sd.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++- drivers/scsi/sd.h | 1 + 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index a3d2d4bc4a3d..14b850d2af59 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); @@ -375,6 +376,33 @@ thin_provisioning_show(struct device *dev, struct device_attribute *attr, } static DEVICE_ATTR_RO(thin_provisioning); +static ssize_t +ignore_resume_medium_changed_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct scsi_disk *sdkp = to_scsi_disk(dev); + + return sprintf(buf, "%u\n", sdkp->ignore_resume_medium_changed); +} + +static ssize_t +ignore_resume_medium_changed_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + bool v; + struct scsi_disk *sdkp = to_scsi_disk(dev); + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + if (kstrtobool(buf, &v)) + return -EINVAL; + + sdkp->ignore_resume_medium_changed = v; + + return count; +} +static DEVICE_ATTR_RW(ignore_resume_medium_changed); + /* sysfs_match_string() requires dense arrays */ static const char *lbp_mode[] = { [SD_LBP_FULL] = "full", @@ -591,6 +619,7 @@ static struct attribute *sd_disk_attrs[] = { &dev_attr_max_medium_access_timeouts.attr, &dev_attr_zoned_cap.attr, &dev_attr_max_retries.attr, + &dev_attr_ignore_resume_medium_changed.attr, NULL, }; ATTRIBUTE_GROUPS(sd_disk); @@ -608,7 +637,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 = { @@ -3699,6 +3728,25 @@ 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); + int ret; + + if (!sdkp) /* E.g.: runtime resume at the start of sd_probe() */ + return 0; + + /* + * ignore_resume_media_change is the userspace setting and + * expecting_media_change is what is checked and cleared in the + * error path if we set it here. + */ + if (sdkp->ignore_resume_medium_changed) + 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/drivers/scsi/sd.h b/drivers/scsi/sd.h index b59136c4125b..1b041331356c 100644 --- a/drivers/scsi/sd.h +++ b/drivers/scsi/sd.h @@ -125,6 +125,7 @@ struct scsi_disk { unsigned urswrz : 1; unsigned security : 1; unsigned ignore_medium_access_errors : 1; + unsigned ignore_resume_medium_changed : 1; }; #define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev) From patchwork Tue Jan 12 09:33:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Kepplinger X-Patchwork-Id: 12012909 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5193EC433DB for ; Tue, 12 Jan 2021 09:35:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 08D8623101 for ; Tue, 12 Jan 2021 09:35:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405966AbhALJfJ (ORCPT ); Tue, 12 Jan 2021 04:35:09 -0500 Received: from comms.puri.sm ([159.203.221.185]:33642 "EHLO comms.puri.sm" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731123AbhALJfJ (ORCPT ); Tue, 12 Jan 2021 04:35:09 -0500 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id D76FDDF42D; Tue, 12 Jan 2021 01:33:58 -0800 (PST) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YD_EqG3nAla5; Tue, 12 Jan 2021 01:33:58 -0800 (PST) From: Martin Kepplinger To: jejb@linux.ibm.com, martin.petersen@oracle.com, stern@rowland.harvard.edu, bvanassche@acm.org Cc: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, Martin Kepplinger Subject: [PATCH v2 3/3] scsi: sd: Documentation: describe ignore_resume_medium_changed Date: Tue, 12 Jan 2021 10:33:29 +0100 Message-Id: <20210112093329.3639-4-martin.kepplinger@puri.sm> In-Reply-To: <20210112093329.3639-1-martin.kepplinger@puri.sm> References: <20210112093329.3639-1-martin.kepplinger@puri.sm> Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Add notes about the new sd sysfs knob that works around problems with runtime PM for certain types of SD cardreaders. Signed-off-by: Martin Kepplinger --- Documentation/scsi/sd-parameters.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Documentation/scsi/sd-parameters.rst b/Documentation/scsi/sd-parameters.rst index 87d554008bfb..a77b9fdffddf 100644 --- a/Documentation/scsi/sd-parameters.rst +++ b/Documentation/scsi/sd-parameters.rst @@ -25,3 +25,17 @@ To modify the caching mode without making the change persistent, prepend "temporary " to the cache type string. E.g.:: # echo "temporary write back" > cache_type + +ignore_resume_medium_changed (RW) +--------------------------------- +Some SD cardreaders deliver a "media changed" unit attention (that results +in I/O error) when they are resumed from suspend. This prevents users +to use runtime PM with these devices. To enable runtime PM for an SD +cardreader (here, device number 0:0:0:0), do something like: + +echo 0 > /sys/module/block/parameters/events_dfl_poll_msecs +echo 1000 > /sys/bus/scsi/devices/0:0:0:0/power/autosuspend_delay_ms +echo auto > /sys/bus/scsi/devices/0:0:0:0/power/control + +And if using the mounted disk filesystem causes trouble, try setting +ignore_resume_medium_changed to 1.