Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp2830629pxf; Sun, 28 Mar 2021 03:34:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyA2Q05fWWkNmA5TQZ9LIICTu0CHJgms8lSSXjRc3PYPriNhIeTQXLK79AUw1IsMOPLfKJV X-Received: by 2002:a17:906:bfcc:: with SMTP id us12mr24318789ejb.266.1616927650844; Sun, 28 Mar 2021 03:34:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616927650; cv=none; d=google.com; s=arc-20160816; b=gwMGAENC4xbfKysUo+KUfoIdUlGqFn9xZs8yDGyDu6G2Wo2uxGPgotQL6yzC2gAO/2 TjAXwxcx3oy5+O53F7Y88CAXQjqM5bm49uV5dG/hb/K07PcUjIUXV1rDMmI3W9PDDD5H hyt37uWoWMov5h4oWSUksi1NqqYqCAAeDChTQVhIG7pN88jxLkP22si7rdHim2hL1VXu hYa1h3apXjjdvjLZkheg1QVPQksn/AgK9hCeyAh+O5dlRsx0+pbPWvhvL8X++B3Svk68 1nBnidFmZTK090tkSwLj/RQn3s9bn1RH3EWduAkigpgcTAVzIJ608I1kTwCkR4tyPnJK f0RQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:references:in-reply-to :message-id:date:subject:cc:to:from; bh=r6X7LK2Dx+GbQ4H/O0bGfxVpwcWMzX6pKrlQYZoB7s8=; b=nN5npm/958mmzglsii+IdOo5Gq87G7MGlbnj0sQpNgFUpb+1f1aab6RE5L5KddBa07 MTRcGELwhvIFtkAt4ZLkSUEOMyLztAqGab5PdBhTWgZS6cHhehKeWh0RD12VcHShV99R sKx4KLK+qDhhDbim2PB8UjdHo5Md96BoL+T/FuIMKglKlap0G+7pOiES0iP1HdwiGKII tmfYff8VvHnmMsNHP59Tz0K18JQntK9FuWW0ax6XW3E3jlF/wPz4WAMd3Ot3ZwSK+KCZ Wi0sROHQzNJElTzKtAKrR7YoUJnWA0EmO4PlXKRqXoFK8WRTpHy/S/A2Gj5wImmKcBgJ nATA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=puri.sm Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gl1si10334568ejc.456.2021.03.28.03.33.47; Sun, 28 Mar 2021 03:34:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=puri.sm Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231300AbhC1K0J (ORCPT + 99 others); Sun, 28 Mar 2021 06:26:09 -0400 Received: from comms.puri.sm ([159.203.221.185]:56142 "EHLO comms.puri.sm" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230092AbhC1KZt (ORCPT ); Sun, 28 Mar 2021 06:25:49 -0400 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 71432E01F7; Sun, 28 Mar 2021 03:25:49 -0700 (PDT) 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 xLhsW1HiZtqA; Sun, 28 Mar 2021 03:25:48 -0700 (PDT) From: Martin Kepplinger To: martin.kepplinger@puri.sm Cc: bvanassche@acm.org, jejb@linux.ibm.com, linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, linux-pm@vger.kernel.org, martin.petersen@oracle.com, stern@rowland.harvard.edu Subject: [PATCH v3 1/4] scsi: add expecting_media_change flag to error path Date: Sun, 28 Mar 2021 12:25:28 +0200 Message-Id: <20210328102531.1114535-2-martin.kepplinger@puri.sm> In-Reply-To: <20210328102531.1114535-1-martin.kepplinger@puri.sm> References: <20210328102531.1114535-1-martin.kepplinger@puri.sm> Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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. That's the motivation to add this flag. If set by a driver the one following MEDIA CHANGE unit attention will be ignored. 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 08c06c56331c..c62915d34ba4 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -585,6 +585,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 - @@ -1977,14 +1989,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 05c7c320ef32..926b42ce1dc4 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h @@ -171,6 +171,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 */ -- 2.30.2