• Damien Le Moal's avatar
    scsi: sd: Fix TCG OPAL unlock on system resume · 0c76106c
    Damien Le Moal authored
    Commit 3cc2ffe5 ("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: 3cc2ffe5 ("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: default avatarDamien Le Moal <dlemoal@kernel.org>
    Link: https://lore.kernel.org/r/20240319071209.1179257-1-dlemoal@kernel.orgSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    0c76106c
libata-scsi.c 118 KB