lkml.org 
[lkml]   [2020]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 239/477] scsi: core: Fix incorrect usage of shost_for_each_device
    Date
    From: Ye Bin <yebin10@huawei.com>

    [ Upstream commit 4dea170f4fb225984b4f2f1cf0a41d485177b905 ]

    shost_for_each_device(sdev, shost) \
    for ((sdev) = __scsi_iterate_devices((shost), NULL); \
    (sdev); \
    (sdev) = __scsi_iterate_devices((shost), (sdev)))

    When terminating shost_for_each_device() iteration with break or return,
    scsi_device_put() should be used to prevent stale scsi device references
    from being left behind.

    Link: https://lore.kernel.org/r/20200518074420.39275-1-yebin10@huawei.com
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Signed-off-by: Ye Bin <yebin10@huawei.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/scsi_error.c | 2 ++
    drivers/scsi/scsi_lib.c | 4 +++-
    2 files changed, 5 insertions(+), 1 deletion(-)

    diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
    index 978be1602f718..927b1e6418423 100644
    --- a/drivers/scsi/scsi_error.c
    +++ b/drivers/scsi/scsi_error.c
    @@ -1412,6 +1412,7 @@ static int scsi_eh_stu(struct Scsi_Host *shost,
    sdev_printk(KERN_INFO, sdev,
    "%s: skip START_UNIT, past eh deadline\n",
    current->comm));
    + scsi_device_put(sdev);
    break;
    }
    stu_scmd = NULL;
    @@ -1478,6 +1479,7 @@ static int scsi_eh_bus_device_reset(struct Scsi_Host *shost,
    sdev_printk(KERN_INFO, sdev,
    "%s: skip BDR, past eh deadline\n",
    current->comm));
    + scsi_device_put(sdev);
    break;
    }
    bdr_scmd = NULL;
    diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
    index 3ecdae18597d1..b8b4366f12001 100644
    --- a/drivers/scsi/scsi_lib.c
    +++ b/drivers/scsi/scsi_lib.c
    @@ -2865,8 +2865,10 @@ scsi_host_unblock(struct Scsi_Host *shost, int new_state)

    shost_for_each_device(sdev, shost) {
    ret = scsi_internal_device_unblock(sdev, new_state);
    - if (ret)
    + if (ret) {
    + scsi_device_put(sdev);
    break;
    + }
    }
    return ret;
    }
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-23 22:13    [W:2.800 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site