scsi: sd: Fix TCG OPAL unlock on system resume
authorDamien Le Moal <dlemoal@kernel.org>
Tue, 19 Mar 2024 07:12:09 +0000 (16:12 +0900)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 25 Mar 2024 19:46:12 +0000 (15:46 -0400)
commit0c76106cb97548810214def8ee22700bbbb90543
tree45b04799b3d3d4e1282df4b11f2cffce8f96fb6c
parent27f58c04a8f438078583041468ec60597841284d
scsi: sd: Fix TCG OPAL unlock on system resume

Commit 3cc2ffe5c16d ("scsi: sd: Differentiate system and runtime start/stop
management") introduced the manage_system_start_stop scsi_device flag to
allow libata to indicate to the SCSI disk driver that nothing should be
done when resuming a disk on system resume. This change turned the
execution of sd_resume() into a no-op for ATA devices on system
resume. While this solved deadlock issues during device resume, this change
also wrongly removed the execution of opal_unlock_from_suspend().  As a
result, devices with TCG OPAL locking enabled remain locked and
inaccessible after a system resume from sleep.

To fix this issue, introduce the SCSI driver resume method and implement it
with the sd_resume() function calling opal_unlock_from_suspend(). The
former sd_resume() function is renamed to sd_resume_common() and modified
to call the new sd_resume() function. For non-ATA devices, this result in
no functional changes.

In order for libata to explicitly execute sd_resume() when a device is
resumed during system restart, the function scsi_resume_device() is
introduced. libata calls this function from the revalidation work executed
on devie resume, a state that is indicated with the new device flag
ATA_DFLAG_RESUMING. Doing so, locked TCG OPAL enabled devices are unlocked
on resume, allowing normal operation.

Fixes: 3cc2ffe5c16d ("scsi: sd: Differentiate system and runtime start/stop management")
Link: https://bugzilla.kernel.org/show_bug.cgi?id=218538
Cc: stable@vger.kernel.org
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Link: https://lore.kernel.org/r/20240319071209.1179257-1-dlemoal@kernel.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ata/libata-eh.c
drivers/ata/libata-scsi.c
drivers/scsi/scsi_scan.c
drivers/scsi/sd.c
include/linux/libata.h
include/scsi/scsi_driver.h
include/scsi/scsi_host.h