| From 1c69d3b6eb73e466ecbb8edaf1bc7fd585b288da Mon Sep 17 00:00:00 2001 |
| From: Ken Xue <ken.xue@amd.com> |
| Date: Tue, 1 Dec 2015 14:45:23 +0800 |
| Subject: Revert "SCSI: Fix NULL pointer dereference in runtime PM" |
| |
| From: Ken Xue <ken.xue@amd.com> |
| |
| commit 1c69d3b6eb73e466ecbb8edaf1bc7fd585b288da upstream. |
| |
| 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> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/scsi/scsi_pm.c | 20 ++++++++++---------- |
| 1 file changed, 10 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/scsi/scsi_pm.c |
| +++ b/drivers/scsi/scsi_pm.c |
| @@ -151,13 +151,13 @@ static int sdev_runtime_suspend(struct d |
| struct scsi_device *sdev = to_scsi_device(dev); |
| int err = 0; |
| |
| - if (pm && pm->runtime_suspend) { |
| - err = blk_pre_runtime_suspend(sdev->request_queue); |
| - if (err) |
| - return err; |
| + err = blk_pre_runtime_suspend(sdev->request_queue); |
| + if (err) |
| + return err; |
| + if (pm && pm->runtime_suspend) |
| err = pm->runtime_suspend(dev); |
| - blk_post_runtime_suspend(sdev->request_queue, err); |
| - } |
| + blk_post_runtime_suspend(sdev->request_queue, err); |
| + |
| return err; |
| } |
| |
| @@ -180,11 +180,11 @@ static int sdev_runtime_resume(struct de |
| const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL; |
| int err = 0; |
| |
| - if (pm && pm->runtime_resume) { |
| - blk_pre_runtime_resume(sdev->request_queue); |
| + blk_pre_runtime_resume(sdev->request_queue); |
| + if (pm && pm->runtime_resume) |
| err = pm->runtime_resume(dev); |
| - blk_post_runtime_resume(sdev->request_queue, err); |
| - } |
| + blk_post_runtime_resume(sdev->request_queue, err); |
| + |
| return err; |
| } |
| |