From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CFBB92D239A for ; Mon, 24 Nov 2025 18:48:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764010121; cv=none; b=T/zFCjow86+5HlKZUyQMOfaVYLyqqzyMj/srYvamkauvKFz5QfL/8WSGj/mNxtmgRWq2OfVEk1SZFULBWE1lD4eWFComzWirxrfJxD53dOsNQGNKS0KPWfBAAE1YSVKIUMvVtdQhOo5D0EqhoT8Xrn3Fkz227mw7/RcpCfQb4d8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764010121; c=relaxed/simple; bh=coU2b7iwVK7hOpNLrq5BybkyaUE2BrKrPSdFvbNS5ZI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sOPzgHVQ9oy0/+9xdBSe3GWp/mfKWRinQ1ORS20iy4fXuLxo72MBNbiDtmXAQvAjM6wuhFBUJqANNBLRkmbMH9iIunsGlOU9AwCSJA6wlU075zFpM4a8Ouv4uDdkNL7Kz/o/oCbJTj+364fZ37wjnZfgWiJgf2J6HkCrPnxvvQ4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=jAs21z0l; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="jAs21z0l" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A17B4C4CEF1; Mon, 24 Nov 2025 18:48:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1764010121; bh=coU2b7iwVK7hOpNLrq5BybkyaUE2BrKrPSdFvbNS5ZI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jAs21z0lzrzrz/EPOruVBbZ9CoQW+VdMsGGlXIubpKpnC0hByBjtWI1EG6ExpQBSM Q5U77Jfllh+0SiZAsWp9a6seLN6vEDN4vFMh2lChRSWibmAZcJQRg2nnR35SIYW6se eaMWS7iVZ4gvE+/rHE0eDujYIcM4AEOAxsqX8Fx/jsJqILmj5BZ2nJi3xRmaWA3gLY ruer28VgA9fAJXkiWVmpT1rA1z+0oQQrDH8pb9/LExTE5xP0YZpVwlFM3vJWni1RJZ 7JyhEjlglPILnmv39BHHjRxqWI2Ltr3+fbVNLUdRoUAdkOQIk9V4JWzg1WqIpOD4kk ON+/d+Hk8zpUQ== From: Sasha Levin To: stable@vger.kernel.org Cc: Niklas Cassel , Ilia Baryshnikov , Hannes Reinecke , "Martin K. Petersen" , Damien Le Moal , Sasha Levin Subject: [PATCH 5.15.y] ata: libata-scsi: Fix system suspend for a security locked drive Date: Mon, 24 Nov 2025 13:48:38 -0500 Message-ID: <20251124184838.4189739-1-sashal@kernel.org> X-Mailer: git-send-email 2.51.0 In-Reply-To: <2025112453-paramedic-agonizing-0a51@gregkh> References: <2025112453-paramedic-agonizing-0a51@gregkh> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Niklas Cassel [ Upstream commit b11890683380a36b8488229f818d5e76e8204587 ] Commit cf3fc037623c ("ata: libata-scsi: Fix ata_to_sense_error() status handling") fixed ata_to_sense_error() to properly generate sense key ABORTED COMMAND (without any additional sense code), instead of the previous bogus sense key ILLEGAL REQUEST with the additional sense code UNALIGNED WRITE COMMAND, for a failed command. However, this broke suspend for Security locked drives (drives that have Security enabled, and have not been Security unlocked by boot firmware). The reason for this is that the SCSI disk driver, for the Synchronize Cache command only, treats any sense data with sense key ILLEGAL REQUEST as a successful command (regardless of ASC / ASCQ). After commit cf3fc037623c ("ata: libata-scsi: Fix ata_to_sense_error() status handling") the code that treats any sense data with sense key ILLEGAL REQUEST as a successful command is no longer applicable, so the command fails, which causes the system suspend to be aborted: sd 1:0:0:0: PM: dpm_run_callback(): scsi_bus_suspend returns -5 sd 1:0:0:0: PM: failed to suspend async: error -5 PM: Some devices failed to suspend, or early wake event detected To make suspend work once again, for a Security locked device only, return sense data LOGICAL UNIT ACCESS NOT AUTHORIZED, the actual sense data which a real SCSI device would have returned if locked. The SCSI disk driver treats this sense data as a successful command. Cc: stable@vger.kernel.org Reported-by: Ilia Baryshnikov Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220704 Fixes: cf3fc037623c ("ata: libata-scsi: Fix ata_to_sense_error() status handling") Reviewed-by: Hannes Reinecke Reviewed-by: Martin K. Petersen Reviewed-by: Damien Le Moal Signed-off-by: Niklas Cassel [ Adjust context ] Signed-off-by: Sasha Levin --- drivers/ata/libata-scsi.c | 8 ++++++++ include/linux/ata.h | 1 + 2 files changed, 9 insertions(+) diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 891114a5e5c18..f91b88073232d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -968,6 +968,14 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc) ata_scsi_set_sense(dev, cmd, NOT_READY, 0x04, 0x21); return; } + + if (ata_id_is_locked(dev->id)) { + /* Security locked */ + /* LOGICAL UNIT ACCESS NOT AUTHORIZED */ + ata_scsi_set_sense(dev, cmd, DATA_PROTECT, 0x74, 0x71); + return; + } + /* Use ata_to_sense_error() to map status register bits * onto sense key, asc & ascq. */ diff --git a/include/linux/ata.h b/include/linux/ata.h index 3b1ad57d0e017..7e166eea9350b 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h @@ -557,6 +557,7 @@ struct ata_bmdma_prd { #define ata_id_has_ncq(id) ((id)[ATA_ID_SATA_CAPABILITY] & (1 << 8)) #define ata_id_queue_depth(id) (((id)[ATA_ID_QUEUE_DEPTH] & 0x1f) + 1) #define ata_id_removable(id) ((id)[ATA_ID_CONFIG] & (1 << 7)) +#define ata_id_is_locked(id) (((id)[ATA_ID_DLF] & 0x7) == 0x7) #define ata_id_has_atapi_AN(id) \ ((((id)[ATA_ID_SATA_CAPABILITY] != 0x0000) && \ ((id)[ATA_ID_SATA_CAPABILITY] != 0xffff)) && \ -- 2.51.0