lkml.org 
[lkml]   [2016]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 019/206] scsi: Add intermediate STARGET_REMOVE state to scsi_target_state
    Date
    4.2.8-ckt12 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    From: Johannes Thumshirn <jthumshirn@suse.de>

    commit f05795d3d771f30a7bdc3a138bf714b06d42aa95 upstream.

    Add intermediate STARGET_REMOVE state to scsi_target_state to avoid
    running into the BUG_ON() in scsi_target_reap(). The STARGET_REMOVE
    state is only valid in the path from scsi_remove_target() to
    scsi_target_destroy() indicating this target is going to be removed.

    This re-fixes the problem introduced in commits bc3f02a795d3 ("[SCSI]
    scsi_remove_target: fix softlockup regression on hot remove") and
    40998193560d ("scsi: restart list search after unlock in
    scsi_remove_target") in a more comprehensive way.

    [mkp: Included James' fix for scsi_target_destroy()]

    Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
    Fixes: 40998193560dab6c3ce8d25f4fa58a23e252ef38
    Reported-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Tested-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Reviewed-by: Ewan D. Milne <emilne@redhat.com>
    Reviewed-by: Hannes Reinecke <hare@suse.com>
    Reviewed-by: James Bottomley <jejb@linux.vnet.ibm.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    drivers/scsi/scsi_scan.c | 1 +
    drivers/scsi/scsi_sysfs.c | 2 ++
    include/scsi/scsi_device.h | 1 +
    3 files changed, 4 insertions(+)

    diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
    index f9f3f82..f16829f 100644
    --- a/drivers/scsi/scsi_scan.c
    +++ b/drivers/scsi/scsi_scan.c
    @@ -314,6 +314,7 @@ static void scsi_target_destroy(struct scsi_target *starget)
    struct Scsi_Host *shost = dev_to_shost(dev->parent);
    unsigned long flags;

    + BUG_ON(starget->state == STARGET_DEL);
    starget->state = STARGET_DEL;
    transport_destroy_device(dev);
    spin_lock_irqsave(shost->host_lock, flags);
    diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
    index 168a509..c6126e0 100644
    --- a/drivers/scsi/scsi_sysfs.c
    +++ b/drivers/scsi/scsi_sysfs.c
    @@ -1155,11 +1155,13 @@ restart:
    spin_lock_irqsave(shost->host_lock, flags);
    list_for_each_entry(starget, &shost->__targets, siblings) {
    if (starget->state == STARGET_DEL ||
    + starget->state == STARGET_REMOVE ||
    starget == last_target)
    continue;
    if (starget->dev.parent == dev || &starget->dev == dev) {
    kref_get(&starget->reap_ref);
    last_target = starget;
    + starget->state = STARGET_REMOVE;
    spin_unlock_irqrestore(shost->host_lock, flags);
    __scsi_remove_target(starget);
    scsi_target_reap(starget);
    diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
    index ae84b22..0403c1b 100644
    --- a/include/scsi/scsi_device.h
    +++ b/include/scsi/scsi_device.h
    @@ -259,6 +259,7 @@ scmd_printk(const char *, const struct scsi_cmnd *, const char *, ...);
    enum scsi_target_state {
    STARGET_CREATED = 1,
    STARGET_RUNNING,
    + STARGET_REMOVE,
    STARGET_DEL,
    };

    --
    2.7.4
    \
     
     \ /
      Last update: 2016-06-10 01:01    [W:4.046 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site