Commit 8b4d946
committed
ata: libata-scsi: Fix delayed scsi_rescan_device() execution
Commit 6aa0365 ("ata: libata-scsi: Avoid deadlock on rescan after
device resume") modified ata_scsi_dev_rescan() to check the scsi device
"is_suspended" power field to ensure that the scsi device associated
with an ATA device is fully resumed when scsi_rescan_device() is
executed. However, this fix is problematic as:
1) It relies on a PM internal field that should not be used without PM
device locking protection.
2) The check for is_suspended and the call to scsi_rescan_device() are
not atomic and a suspend PM event may be triggered between them,
casuing scsi_rescan_device() to be called on a suspended device and
in that function blocking while holding the scsi device lock. This
would deadlock a following resume operation.
These problems can trigger PM deadlocks on resume, especially with
resume operations triggered quickly after or during suspend operations.
E.g., a simple bash script like:
for (( i=0; i<10; i++ )); do
echo "+2 > /sys/class/rtc/rtc0/wakealarm
echo mem > /sys/power/state
done
that triggers a resume 2 seconds after starting suspending a system can
quickly lead to a PM deadlock preventing the system from correctly
resuming.
Fix this by replacing the check on is_suspended with a check on the
return value given by scsi_rescan_device() as that function will fail if
called against a suspended device. Also make sure rescan tasks already
scheduled are first cancelled before suspending an ata port.
Fixes: 6aa0365 ("ata: libata-scsi: Avoid deadlock on rescan after device resume")
Cc: stable@vger.kernel.org
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Niklas Cassel <niklas.cassel@wdc.com>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>1 parent ff48b37 commit 8b4d946
2 files changed
Lines changed: 31 additions & 18 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5168 | 5168 | | |
5169 | 5169 | | |
5170 | 5170 | | |
| 5171 | + | |
| 5172 | + | |
| 5173 | + | |
| 5174 | + | |
| 5175 | + | |
| 5176 | + | |
| 5177 | + | |
| 5178 | + | |
5171 | 5179 | | |
5172 | 5180 | | |
5173 | 5181 | | |
5174 | 5182 | | |
5175 | 5183 | | |
| 5184 | + | |
| 5185 | + | |
| 5186 | + | |
| 5187 | + | |
| 5188 | + | |
| 5189 | + | |
| 5190 | + | |
| 5191 | + | |
5176 | 5192 | | |
5177 | 5193 | | |
5178 | 5194 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4756 | 4756 | | |
4757 | 4757 | | |
4758 | 4758 | | |
4759 | | - | |
| 4759 | + | |
4760 | 4760 | | |
4761 | 4761 | | |
4762 | 4762 | | |
| |||
4765 | 4765 | | |
4766 | 4766 | | |
4767 | 4767 | | |
| 4768 | + | |
| 4769 | + | |
| 4770 | + | |
| 4771 | + | |
| 4772 | + | |
| 4773 | + | |
| 4774 | + | |
4768 | 4775 | | |
4769 | 4776 | | |
4770 | 4777 | | |
4771 | 4778 | | |
4772 | 4779 | | |
4773 | | - | |
4774 | | - | |
4775 | | - | |
4776 | | - | |
4777 | | - | |
4778 | | - | |
4779 | | - | |
4780 | | - | |
4781 | | - | |
4782 | | - | |
4783 | | - | |
4784 | | - | |
4785 | | - | |
4786 | | - | |
4787 | | - | |
4788 | 4780 | | |
4789 | | - | |
| 4781 | + | |
4790 | 4782 | | |
4791 | 4783 | | |
| 4784 | + | |
| 4785 | + | |
| 4786 | + | |
4792 | 4787 | | |
4793 | 4788 | | |
4794 | 4789 | | |
| 4790 | + | |
4795 | 4791 | | |
4796 | 4792 | | |
4797 | 4793 | | |
4798 | | - | |
| 4794 | + | |
| 4795 | + | |
4799 | 4796 | | |
4800 | 4797 | | |
4801 | 4798 | | |
0 commit comments