Commit 0f1298b5 authored by Damien Le Moal's avatar Damien Le Moal Committed by Lee Jones
Browse files

UPSTREAM: ata: libata-scsi: Avoid deadlock on rescan after device resume



When an ATA port is resumed from sleep, the port is reset and a power
management request issued to libata EH to reset the port and rescanning
the device(s) attached to the port. Device rescanning is done by
scheduling an ata_scsi_dev_rescan() work, which will execute
scsi_rescan_device().

However, scsi_rescan_device() takes the generic device lock, which is
also taken by dpm_resume() when the SCSI device is resumed as well. If
a device rescan execution starts before the completion of the SCSI
device resume, the rcu locking used to refresh the cached VPD pages of
the device, combined with the generic device locking from
scsi_rescan_device() and from dpm_resume() can cause a deadlock.

Avoid this situation by changing struct ata_port scsi_rescan_task to be
a delayed work instead of a simple work_struct. ata_scsi_dev_rescan() is
modified to check if the SCSI device associated with the ATA device that
must be rescanned is not suspended. If the SCSI device is still
suspended, ata_scsi_dev_rescan() returns early and reschedule itself for
execution after an arbitrary delay of 5ms.

Bug: 254441685
Reported-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Reported-by: default avatarJoe Breuer <linux-kernel@jmbreuer.net>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217530


Fixes: a19a93e4 ("scsi: core: pm: Rely on the device driver core for async power management")
Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Tested-by: default avatarKai-Heng Feng <kai.heng.feng@canonical.com>
Tested-by: default avatarJoe Breuer <linux-kernel@jmbreuer.net>
(cherry picked from commit 6aa0365a)
Signed-off-by: default avatarLee Jones <joneslee@google.com>
Change-Id: Ia94104783eb1d244f3e480ab56c7345b9bcd4225
parent a6cbc280
Loading
Loading
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment