From patchwork Mon Jan 11 15:20: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: 12010999 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 A9E76C433E9 for ; Mon, 11 Jan 2021 15:22:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 64697229CA for ; Mon, 11 Jan 2021 15:22:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732244AbhAKPWJ (ORCPT ); Mon, 11 Jan 2021 10:22:09 -0500 Received: from comms.puri.sm ([159.203.221.185]:56912 "EHLO comms.puri.sm" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731265AbhAKPWI (ORCPT ); Mon, 11 Jan 2021 10:22:08 -0500 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 813A5DFD09; Mon, 11 Jan 2021 07:20: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 HZy-WhHIVYFO; Mon, 11 Jan 2021 07:20:57 -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 1/3] scsi: add expecting_media_change flag to error path Date: Mon, 11 Jan 2021 16:20:27 +0100 Message-Id: <20210111152029.28426-2-martin.kepplinger@puri.sm> In-Reply-To: <20210111152029.28426-1-martin.kepplinger@puri.sm> References: <20210111152029.28426-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 Mon Jan 11 15:20: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: 12011001 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 4D18BC43331 for ; Mon, 11 Jan 2021 15:22:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2D21822A83 for ; Mon, 11 Jan 2021 15:22:46 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730649AbhAKPWR (ORCPT ); Mon, 11 Jan 2021 10:22:17 -0500 Received: from comms.puri.sm ([159.203.221.185]:56914 "EHLO comms.puri.sm" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732692AbhAKPWL (ORCPT ); Mon, 11 Jan 2021 10:22:11 -0500 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id D6E47DF76B; Mon, 11 Jan 2021 07:21:00 -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 PZI06H7Wq84z; Mon, 11 Jan 2021 07:21:00 -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 2/3] scsi: add expect_media_change_suspend sysfs device setting Date: Mon, 11 Jan 2021 16:20:28 +0100 Message-Id: <20210111152029.28426-3-martin.kepplinger@puri.sm> In-Reply-To: <20210111152029.28426-1-martin.kepplinger@puri.sm> References: <20210111152029.28426-1-martin.kepplinger@puri.sm> Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Add a user-facing flag that sets expecting_media_change on runtime resume. That works around devices that send MEDIA_CHANGED when it actually is just resumed from suspend and the media can be expected not to have changed. Signed-off-by: Martin Kepplinger --- drivers/scsi/scsi_sysfs.c | 38 ++++++++++++++++++++++++++++++++++++++ include/scsi/scsi_device.h | 2 ++ 2 files changed, 40 insertions(+) diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index b6378c8ca783..a049290addff 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -1189,6 +1189,43 @@ static DEVICE_ATTR(queue_ramp_up_period, S_IRUGO | S_IWUSR, sdev_show_queue_ramp_up_period, sdev_store_queue_ramp_up_period); +static ssize_t +sdev_show_expect_media_change_suspend(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct scsi_device *sdev; + sdev = to_scsi_device(dev); + + if (sdev->expect_media_change_suspend) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static ssize_t +sdev_store_expect_media_change_suspend(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct scsi_device *sdev; + unsigned int flag; + int err; + + if (!capable(CAP_SYS_ADMIN)) + return -EACCES; + + sdev = to_scsi_device(dev); + err = kstrtouint(buf, 10, &flag); + if (err) + return err; + sdev->expect_media_change_suspend = !!flag; + + return count; +} +static DEVICE_ATTR(expect_media_change_suspend, S_IRUGO | S_IWUSR, + sdev_show_expect_media_change_suspend, + sdev_store_expect_media_change_suspend); + static umode_t scsi_sdev_attr_is_visible(struct kobject *kobj, struct attribute *attr, int i) { @@ -1260,6 +1297,7 @@ static struct attribute *scsi_sdev_attrs[] = { &dev_attr_queue_type.attr, &dev_attr_wwid.attr, &dev_attr_blacklist.attr, + &dev_attr_expect_media_change_suspend.attr, #ifdef CONFIG_SCSI_DH &dev_attr_dh_state.attr, &dev_attr_access_state.attr, diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index ca2c3eb5830f..fafb8e6ea4d0 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -171,6 +171,8 @@ struct scsi_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 expect_media_change_suspend:1; /* User facing flag to enable + * the above flag on runtime resume */ 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 Mon Jan 11 15:20: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: 12010995 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 19E3DC433E0 for ; Mon, 11 Jan 2021 15:22:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CBF3F225AC for ; Mon, 11 Jan 2021 15:22:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730222AbhAKPVo (ORCPT ); Mon, 11 Jan 2021 10:21:44 -0500 Received: from comms.puri.sm ([159.203.221.185]:56902 "EHLO comms.puri.sm" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729200AbhAKPVo (ORCPT ); Mon, 11 Jan 2021 10:21:44 -0500 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id C0AABDFD21; Mon, 11 Jan 2021 07:21:03 -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 URKHmkTJRGSk; Mon, 11 Jan 2021 07:21:03 -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 3/3] scsi: sd: add support for expect_media_change_suspend flag Date: Mon, 11 Jan 2021 16:20:29 +0100 Message-Id: <20210111152029.28426-4-martin.kepplinger@puri.sm> In-Reply-To: <20210111152029.28426-1-martin.kepplinger@puri.sm> References: <20210111152029.28426-1-martin.kepplinger@puri.sm> Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org Make the sd driver act appropriately when the user has set expect_media_change_suspend for a device. Signed-off-by: Martin Kepplinger Reported-by: kernel test robot --- drivers/scsi/sd.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index a3d2d4bc4a3d..ad89f8c76a27 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -608,7 +608,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 +3699,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; + + /* + * expect_media_change_suspend 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->device->expect_media_change_suspend) + 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).