Received: by 2002:a05:7412:40d:b0:e2:908c:2ebd with SMTP id 13csp1178957rdf; Wed, 22 Nov 2023 07:35:00 -0800 (PST) X-Google-Smtp-Source: AGHT+IH/hiFcgXNyClvOXO5wLtYrQ4XWNVaMU4fXF+06GS2N8DByM1iuq1z6B77+Ih0CCrFh2VVr X-Received: by 2002:a05:6a00:130b:b0:68f:cb69:8e66 with SMTP id j11-20020a056a00130b00b0068fcb698e66mr4013268pfu.15.1700667300308; Wed, 22 Nov 2023 07:35:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700667300; cv=none; d=google.com; s=arc-20160816; b=vD34L7ms//n3zTcaSV6uo1RG4ePQj5JamgdvwQE4kBa2NVCtskAME4CSFFJCNn8WSJ kxxyfaCJWgSrrT2HVcjM1nBo0NVku7ZRO7v94dHy9wizU44eIx/Vyn4tqFMyitnAkqWj Q4PBNKsvuZUGwVWBgnHdCrf8oKu7L2H8c+naO3QcF6Gt0kinBfyBOVtqKaxWmPQHFrcB IRx04DClvgST55w+vcnMnYxZXvqFt3qeaVWwcs99VXqoi2eMLvWlkqP2+IachAMmpA6q oLrlh3jrxt3iAFeXghw3DmX5lwC0Hbvs2wFnrZphK9xZR04ZohXikT/detTYuc9Hl94e plxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=S6YY1nW83LrnEWWreLefx/AMBo4A3hvjmWYOZRREqEg=; fh=HugjWW6AUBZT2t2f/ERTNGZtlc/dk8UtjjkCYOYjF6g=; b=S7RwTjRtk2wn5wO290rZgH3s2oueGxqrjha9GxOcJqVW5BaBeC19MK0QMqOo6edzlA O0pxiZu/WBB7yjxkoRIhhZERxXcV/HV2ItqfZbKvj58WVEmbYO/FdTiULgsP6uDTlIhe PYJbLcM16NIski+kMqI2qqPnOY0GFOOiCUBF4pakTRbrn7nk+5x5uPwcQ2R3B2RQanf/ R5R9RM4r1epBoT03hCb2lJAH6O3l13YWpzqfcf81sGgbU60ZiJGGHvIx2VdHFXbGDIz7 IB8/XQIqfgXtCxJvKEJG4bAITUp1o4W/rSgPzZWuZtWagOKGincSnOU27BqaWTpXA163 mrbg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=A3OjznV2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id i128-20020a625486000000b006be2d9914eesi12413215pfb.118.2023.11.22.07.34.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Nov 2023 07:35:00 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=A3OjznV2; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id A87118213F01; Wed, 22 Nov 2023 07:34:57 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344401AbjKVPes (ORCPT + 99 others); Wed, 22 Nov 2023 10:34:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50126 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235262AbjKVPe0 (ORCPT ); Wed, 22 Nov 2023 10:34:26 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B628E2100; Wed, 22 Nov 2023 07:33:47 -0800 (PST) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CA49FC433C9; Wed, 22 Nov 2023 15:33:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1700667226; bh=5+/e5tq5KuWJ/VkW+PPP52Ao4aisjEYJ37b4EpqEbyw=; h=From:To:Cc:Subject:Date:From; b=A3OjznV2ZAh9ekPo1xiC5goL4k3YDjbRQj7XjTKaR1hqg/bHqOE57vnBqlSGewe7o /sKD8PlyFE9Wpd3hexh90WaJqb+GxhfpsYIncQKt5MuLY9gjwBJW7SPQR7y/+ik3E3 GhTNWNK/fLljgzbHe2tnUyWXKdxxQEfnRjQBYFaAklzscjlJ6x9J67hi/2/LPYcQol fgvBlBxKB70au+IVm4EkjhQfmGQJlZxZWs9dBxYSVNfXbQGqGjb14RRae1OQfvZn2n QgM5e4V+WGsHzwiAxp6XZN8Uc+KQjMv4zja3He3r2vkg7adoPuUyFilMSxmsGNRJQ3 SUvzfx4+FD76w== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Mike Christie , Christoph Hellwig , Martin Wilck , Bart Van Assche , "Martin K . Petersen" , Sasha Levin , jejb@linux.ibm.com, linux-scsi@vger.kernel.org Subject: [PATCH AUTOSEL 6.5 01/15] scsi: sd: Fix sshdr use in sd_suspend_common() Date: Wed, 22 Nov 2023 10:33:03 -0500 Message-ID: <20231122153340.852434-1-sashal@kernel.org> X-Mailer: git-send-email 2.42.0 MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.5.12 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.5 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Wed, 22 Nov 2023 07:34:57 -0800 (PST) From: Mike Christie [ Upstream commit 3b83486399a6a9feb9c681b74c21a227d48d7020 ] If scsi_execute_cmd() returns < 0, it doesn't initialize the sshdr, so we shouldn't access the sshdr. If it returns 0, then the cmd executed successfully, so there is no need to check the sshdr. sd_sync_cache() will only access the sshdr if it's been setup because it calls scsi_status_is_check_condition() before accessing it. However, the sd_sync_cache() caller, sd_suspend_common(), does not check. sd_suspend_common() is only checking for ILLEGAL_REQUEST which it's using to determine if the command is supported. If it's not it just ignores the error. So to fix its sshdr use this patch just moves that check to sd_sync_cache() where it converts ILLEGAL_REQUEST to success/0. sd_suspend_common() was ignoring that error and sd_shutdown() doesn't check for errors so there will be no behavior changes. Signed-off-by: Mike Christie Link: https://lore.kernel.org/r/20231106231304.5694-2-michael.christie@oracle.com Reviewed-by: Christoph Hellwig Reviewed-by: Martin Wilck Reviewed-by: Bart Van Assche Signed-off-by: Martin K. Petersen Signed-off-by: Sasha Levin --- drivers/scsi/sd.c | 53 ++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index c4babb16dac73..1b7de2daf64a2 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1681,24 +1681,21 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) return disk_changed ? DISK_EVENT_MEDIA_CHANGE : 0; } -static int sd_sync_cache(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr) +static int sd_sync_cache(struct scsi_disk *sdkp) { int retries, res; struct scsi_device *sdp = sdkp->device; const int timeout = sdp->request_queue->rq_timeout * SD_FLUSH_TIMEOUT_MULTIPLIER; - struct scsi_sense_hdr my_sshdr; + struct scsi_sense_hdr sshdr; const struct scsi_exec_args exec_args = { .req_flags = BLK_MQ_REQ_PM, - /* caller might not be interested in sense, but we need it */ - .sshdr = sshdr ? : &my_sshdr, + .sshdr = &sshdr, }; if (!scsi_device_online(sdp)) return -ENODEV; - sshdr = exec_args.sshdr; - for (retries = 3; retries > 0; --retries) { unsigned char cmd[16] = { 0 }; @@ -1723,15 +1720,23 @@ static int sd_sync_cache(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr) return res; if (scsi_status_is_check_condition(res) && - scsi_sense_valid(sshdr)) { - sd_print_sense_hdr(sdkp, sshdr); + scsi_sense_valid(&sshdr)) { + sd_print_sense_hdr(sdkp, &sshdr); /* we need to evaluate the error return */ - if (sshdr->asc == 0x3a || /* medium not present */ - sshdr->asc == 0x20 || /* invalid command */ - (sshdr->asc == 0x74 && sshdr->ascq == 0x71)) /* drive is password locked */ + if (sshdr.asc == 0x3a || /* medium not present */ + sshdr.asc == 0x20 || /* invalid command */ + (sshdr.asc == 0x74 && sshdr.ascq == 0x71)) /* drive is password locked */ /* this is no error here */ return 0; + /* + * This drive doesn't support sync and there's not much + * we can do because this is called during shutdown + * or suspend so just return success so those operations + * can proceed. + */ + if (sshdr.sense_key == ILLEGAL_REQUEST) + return 0; } switch (host_byte(res)) { @@ -3886,7 +3891,7 @@ static void sd_shutdown(struct device *dev) 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 && @@ -3907,7 +3912,6 @@ static inline bool sd_do_start_stop(struct scsi_device *sdev, bool 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() */ @@ -3916,24 +3920,13 @@ static int sd_suspend_common(struct device *dev, bool runtime) 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 (sd_do_start_stop(sdkp->device, runtime)) { -- 2.42.0