Commit 99398d2
committed
scsi: sd: Do not issue commands to suspended disks on shutdown
If an error occurs when resuming a host adapter before the devices
attached to the adapter are resumed, the adapter low level driver may
remove the scsi host, resulting in a call to sd_remove() for the
disks of the host. This in turn results in a call to sd_shutdown() which
will issue a synchronize cache command and a start stop unit command to
spindown the disk. sd_shutdown() issues the commands only if the device
is not already runtime suspended but does not check the power state for
system-wide suspend/resume. That is, the commands may be issued with the
device in a suspended state, which causes PM resume to hang, forcing a
reset of the machine to recover.
Fix this by tracking the suspended state of a disk by introducing the
suspended boolean field in the scsi_disk structure. This flag is set to
true when the disk is suspended is sd_suspend_common() and resumed with
sd_resume(). When suspended is true, sd_shutdown() is not executed from
sd_remove().
Cc: stable@vger.kernel.org
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>1 parent 75e2bd5 commit 99398d2
2 files changed
Lines changed: 14 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3741 | 3741 | | |
3742 | 3742 | | |
3743 | 3743 | | |
3744 | | - | |
| 3744 | + | |
| 3745 | + | |
3745 | 3746 | | |
3746 | 3747 | | |
3747 | 3748 | | |
| |||
3872 | 3873 | | |
3873 | 3874 | | |
3874 | 3875 | | |
| 3876 | + | |
| 3877 | + | |
| 3878 | + | |
3875 | 3879 | | |
3876 | 3880 | | |
3877 | 3881 | | |
| |||
3891 | 3895 | | |
3892 | 3896 | | |
3893 | 3897 | | |
3894 | | - | |
| 3898 | + | |
3895 | 3899 | | |
3896 | 3900 | | |
3897 | 3901 | | |
3898 | 3902 | | |
3899 | | - | |
| 3903 | + | |
| 3904 | + | |
3900 | 3905 | | |
| 3906 | + | |
3901 | 3907 | | |
3902 | 3908 | | |
3903 | 3909 | | |
3904 | 3910 | | |
3905 | 3911 | | |
3906 | 3912 | | |
3907 | | - | |
| 3913 | + | |
3908 | 3914 | | |
| 3915 | + | |
| 3916 | + | |
| 3917 | + | |
3909 | 3918 | | |
3910 | 3919 | | |
3911 | 3920 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
131 | 131 | | |
132 | 132 | | |
133 | 133 | | |
| 134 | + | |
134 | 135 | | |
135 | 136 | | |
136 | 137 | | |
| |||
0 commit comments