A scan work can run simultaneously with fc_remote_port_delete(). If a scsi device is added to the ->__devices list in the scan work, it can be touched and will be blocked in scsi_target_block(), which will be called in fc_remote_port_delete(), and QUEUE_FLAG_STOPPED flag will be setted to the scsi device's request queue. The scsi device is being setted to the SDEV_RUNNING state at the end of the scan work. When the remote port reappears, scsi_target_unblock() will be called, but the QUEUE_FLAG_STOPPED flag will not be cleared, since scsi_internal_device_unblock() ignores SCSI devices in SDEV_RUNNING state. It results in a permanent stop of the scsi device's request queue. Every requests sended to it will be blocked. It looks like it's a regression caused by: commit 5c10e63c943b ("[SCSI] limit state transitions in scsi_internal_device_unblock") Fix this by restarting the device queue if the state is SDEV_RUNNING. Reported-by: Zengxi Chen <chenzengxi@xxxxxxxxxx> Signed-off-by: Wei Fang <fangwei1@xxxxxxxxxx> --- drivers/scsi/scsi_lib.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 9ca1f17..253ee74 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -2942,7 +2942,8 @@ scsi_internal_device_unblock(struct scsi_device *sdev, else sdev->sdev_state = SDEV_CREATED; } else if (sdev->sdev_state != SDEV_CANCEL && - sdev->sdev_state != SDEV_OFFLINE) + sdev->sdev_state != SDEV_OFFLINE && + sdev->sdev_state != SDEV_RUNNING) return -EINVAL; if (q->mq_ops) { -- 2.4.11 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html