• Mike Christie's avatar
    [SCSI] Fix regressions in scsi_internal_device_block · 986fe6c7
    Mike Christie authored
    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:
    5c10e63c
    [SCSI] limit state transitions in scsi_internal_device_unblock
    
    Fix by rejecting offline and cancel in the state transition.
    Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
    [jejb: Original patch by Christof Schmitt, modified by Mike Christie]
    Cc: Stable Tree <stable@kernel.org>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    986fe6c7
scsi_lib.c 64.6 KB