Disallow the SDEV_TRANSPORT_OFFLINE to SDEV_CANCEL transition such that no I/O is sent to devices for which the transport is offline. Notes: - Functions like sd_shutdown() use scsi_execute_req() and hence set the REQ_PREEMPT flag. Such requests are passed to the LLD queuecommand callback in the SDEV_CANCEL state. - This patch does not affect Fibre Channel LLD drivers since these drivers invoke fc_remote_port_chkready() before submitting a SCSI request to the HBA. That prevents a timeout to occur in state SDEV_CANCEL if the transport is offline. Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> Cc: Mike Christie <michaelc@xxxxxxxxxxx> Cc: James Bottomley <JBottomley@xxxxxxxxxxxxx> Cc: Hannes Reinecke <hare@xxxxxxx> Cc: Tejun Heo <tj@xxxxxxxxxx> --- drivers/scsi/scsi_lib.c | 1 - drivers/scsi/scsi_sysfs.c | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 6a4fde7..63875c3 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -2180,7 +2180,6 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state) case SDEV_RUNNING: case SDEV_QUIESCE: case SDEV_OFFLINE: - case SDEV_TRANSPORT_OFFLINE: case SDEV_BLOCK: break; default: diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index dfbaa34..666b741 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -959,14 +959,16 @@ void __scsi_remove_device(struct scsi_device *sdev) { struct Scsi_Host *shost = sdev->host; struct device *dev = &sdev->sdev_gendev; + enum scsi_device_state sdev_state; int res; if (sdev->is_visible) { spin_lock_irq(shost->host_lock); + sdev_state = sdev->sdev_state; res = scsi_device_set_state(sdev, SDEV_CANCEL); spin_unlock_irq(shost->host_lock); - if (res != 0) + if (res != 0 && sdev_state != SDEV_TRANSPORT_OFFLINE) return; bsg_unregister_queue(sdev->request_queue); -- 1.7.10.4 -- 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