• Wei Fang's avatar
    scsi: avoid a permanent stop of the scsi device's request queue · d2a14525
    Wei Fang authored
    A race between scanning and fc_remote_port_delete() may result in a
    permanent stop if the device gets blocked before scsi_sysfs_add_sdev()
    and unblocked after.  The reason is that blocking a device sets both the
    SDEV_BLOCKED state and the QUEUE_FLAG_STOPPED.  However,
    scsi_sysfs_add_sdev() unconditionally sets SDEV_RUNNING which causes the
    device to be ignored by scsi_target_unblock() and thus never have its
    QUEUE_FLAG_STOPPED cleared leading to a device which is apparently
    running but has a stopped queue.
    
    We actually have two places where SDEV_RUNNING is set: once in
    scsi_add_lun() which respects the blocked flag and once in
    scsi_sysfs_add_sdev() which doesn't.  Since the second set is entirely
    spurious, simply remove it to fix the problem.
    
    Cc: <stable@vger.kernel.org>
    Reported-by: default avatarZengxi Chen <chenzengxi@huawei.com>
    Signed-off-by: default avatarWei Fang <fangwei1@huawei.com>
    Reviewed-by: default avatarEwan D. Milne <emilne@redhat.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    d2a14525
scsi_sysfs.c 37.6 KB