lkml.org 
[lkml]   [2018]   [Nov]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.18 114/144] Revert "SCSI: Fix NULL pointer dereference in runtime PM"
    Date
    3.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    [ Upstream commit 1c69d3b6eb73e466ecbb8edaf1bc7fd585b288da ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/scsi_pm.c | 20 ++++++++++----------
    1 file changed, 10 insertions(+), 10 deletions(-)

    diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
    index a2dcf6a54ec6..75320dad9677 100644
    --- a/drivers/scsi/scsi_pm.c
    +++ b/drivers/scsi/scsi_pm.c
    @@ -221,13 +221,13 @@ static int sdev_runtime_suspend(struct device *dev)
    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;
    }

    @@ -250,11 +250,11 @@ static int sdev_runtime_resume(struct device *dev)
    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;
    }

    --
    2.17.1


    \
     
     \ /
      Last update: 2018-11-08 23:41    [W:4.286 / U:0.368 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site