lkml.org 
[lkml]   [2010]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[44/45] [SCSI] Fix regressions in scsi_internal_device_block
    2.6.32-stable review patch.  If anyone has any objections, please let us know.

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

    From: Mike Christie <michaelc@cs.wisc.edu>

    commit 986fe6c7f50974e871b8ab5a800f5310ea25b361 upstream.

    Deleting a SCSI device on a blocked fc_remote_port (before
    fast_io_fail_tmo fires) results in a hanging thread:

    STACK:
    0 schedule+1108 [0x5cac48]
    1 schedule_timeout+528 [0x5cb7fc]
    2 wait_for_common+266 [0x5ca6be]
    3 blk_execute_rq+160 [0x354054]
    4 scsi_execute+324 [0x3b7ef4]
    5 scsi_execute_req+162 [0x3b80ca]
    6 sd_sync_cache+138 [0x3cf662]
    7 sd_shutdown+138 [0x3cf91a]
    8 sd_remove+112 [0x3cfe4c]
    9 __device_release_driver+124 [0x3a08b8]
    10 device_release_driver+60 [0x3a0a5c]
    11 bus_remove_device+266 [0x39fa76]
    12 device_del+340 [0x39d818]
    13 __scsi_remove_device+204 [0x3bcc48]
    14 scsi_remove_device+66 [0x3bcc8e]
    15 sysfs_schedule_callback_work+50 [0x260d66]
    16 worker_thread+622 [0x162326]
    17 kthread+160 [0x1680b0]
    18 kernel_thread_starter+6 [0x10aaea]

    During the delete, the SCSI device is in moved to SDEV_CANCEL. When
    the FC transport class later calls scsi_target_unblock, this has no
    effect, since scsi_internal_device_unblock ignores SCSI devics in this
    state.

    It looks like all these are regressions caused by:
    5c10e63c943b4c67561ddc6bf61e01d4141f881f
    [SCSI] limit state transitions in scsi_internal_device_unblock

    Fix by rejecting offline and cancel in the state transition.

    Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
    [jejb: Original patch by Christof Schmitt, modified by Mike Christie]
    Signed-off-by: James Bottomley <James.Bottomley@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/scsi/scsi_lib.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    --- a/drivers/scsi/scsi_lib.c
    +++ b/drivers/scsi/scsi_lib.c
    @@ -2432,7 +2432,8 @@ scsi_internal_device_unblock(struct scsi
    sdev->sdev_state = SDEV_RUNNING;
    else if (sdev->sdev_state == SDEV_CREATED_BLOCK)
    sdev->sdev_state = SDEV_CREATED;
    - else
    + else if (sdev->sdev_state != SDEV_CANCEL &&
    + sdev->sdev_state != SDEV_OFFLINE)
    return -EINVAL;

    spin_lock_irqsave(q->queue_lock, flags);



    \
     
     \ /
      Last update: 2010-11-19 22:49    [W:4.130 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site