diff options
author | Ken Xue <ken.xue@amd.com> | 2015-12-01 01:45:23 -0500 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2015-12-10 12:24:44 -0500 |
commit | 1c69d3b6eb73e466ecbb8edaf1bc7fd585b288da (patch) | |
tree | 5b0a2eb7bd68f8c902b75d6b0fc7b252e532f92c | |
parent | 527e9316f8ec44bd53d90fb9f611fa7ffff52bb9 (diff) |
Revert "SCSI: Fix NULL pointer dereference in runtime PM"
This reverts commit 49718f0fb8c9 ("SCSI: Fix NULL pointer dereference in
runtime PM")
The old commit may lead to a issue that blk_{pre|post}_runtime_suspend and
blk_{pre|post}_runtime_resume may not be called in pairs.
Take sr device as example, when sr device goes to runtime suspend,
blk_{pre|post}_runtime_suspend will be called since sr device defined
pm->runtime_suspend. But blk_{pre|post}_runtime_resume will not be called
since sr device doesn't have pm->runtime_resume. so, sr device can not
resume correctly anymore.
More discussion can be found from below link.
http://marc.info/?l=linux-scsi&m=144163730531875&w=2
Signed-off-by: Ken Xue <Ken.Xue@amd.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Cc: Xiangliang Yu <Xiangliang.Yu@amd.com>
Cc: James E.J. Bottomley <JBottomley@odin.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Michael Terry <Michael.terry@canonical.com>
Cc: stable@vger.kernel.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/scsi_pm.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c index e4b799837948..459abe1dcc87 100644 --- a/drivers/scsi/scsi_pm.c +++ b/drivers/scsi/scsi_pm.c | |||
@@ -219,13 +219,13 @@ static int sdev_runtime_suspend(struct device *dev) | |||
219 | struct scsi_device *sdev = to_scsi_device(dev); | 219 | struct scsi_device *sdev = to_scsi_device(dev); |
220 | int err = 0; | 220 | int err = 0; |
221 | 221 | ||
222 | if (pm && pm->runtime_suspend) { | 222 | err = blk_pre_runtime_suspend(sdev->request_queue); |
223 | err = blk_pre_runtime_suspend(sdev->request_queue); | 223 | if (err) |
224 | if (err) | 224 | return err; |
225 | return err; | 225 | if (pm && pm->runtime_suspend) |
226 | err = pm->runtime_suspend(dev); | 226 | err = pm->runtime_suspend(dev); |
227 | blk_post_runtime_suspend(sdev->request_queue, err); | 227 | blk_post_runtime_suspend(sdev->request_queue, err); |
228 | } | 228 | |
229 | return err; | 229 | return err; |
230 | } | 230 | } |
231 | 231 | ||
@@ -248,11 +248,11 @@ static int sdev_runtime_resume(struct device *dev) | |||
248 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; | 248 | const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
249 | int err = 0; | 249 | int err = 0; |
250 | 250 | ||
251 | if (pm && pm->runtime_resume) { | 251 | blk_pre_runtime_resume(sdev->request_queue); |
252 | blk_pre_runtime_resume(sdev->request_queue); | 252 | if (pm && pm->runtime_resume) |
253 | err = pm->runtime_resume(dev); | 253 | err = pm->runtime_resume(dev); |
254 | blk_post_runtime_resume(sdev->request_queue, err); | 254 | blk_post_runtime_resume(sdev->request_queue, err); |
255 | } | 255 | |
256 | return err; | 256 | return err; |
257 | } | 257 | } |
258 | 258 | ||