diff options
author | Bart Van Assche <bvanassche@acm.org> | 2014-07-09 15:56:43 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-09-17 09:19:14 -0700 |
commit | 6c4e8e0a0108f8cc9095a4e23df75b1873f59c31 (patch) | |
tree | c653f9a71ef0965a9539790d5d323277a3c124b3 | |
parent | aeed424c53c76baac72c10892b10c3bfc5ffb5ee (diff) | |
download | linux-stable-6c4e8e0a0108f8cc9095a4e23df75b1873f59c31.tar.gz linux-stable-6c4e8e0a0108f8cc9095a4e23df75b1873f59c31.tar.bz2 linux-stable-6c4e8e0a0108f8cc9095a4e23df75b1873f59c31.zip |
scsi_transport_srp: Fix fast_io_fail_tmo=dev_loss_tmo=off behavior
commit cd53eb686d2418eda938aad3c9da42b7dfa9351f upstream.
If scsi_remove_host() is called while an rport is in the blocked state
then scsi_remove_host() will only finish if the rport is unblocked
from inside a timer function. Make sure that an rport only enters the
blocked state if a timer will be started that will unblock it. This
avoids that unloading the ib_srp kernel module after having
disconnected the initiator from the target system results in a
deadlock if both the fast_io_fail_tmo and dev_loss_tmo parameters have
been set to "off".
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Reviewed-by: David Dillow <dave@thedillows.org>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/scsi/scsi_transport_srp.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c index d47ffc8d3e43..e3e794ee7ddd 100644 --- a/drivers/scsi/scsi_transport_srp.c +++ b/drivers/scsi/scsi_transport_srp.c @@ -473,7 +473,8 @@ static void __srp_start_tl_fail_timers(struct srp_rport *rport) if (delay > 0) queue_delayed_work(system_long_wq, &rport->reconnect_work, 1UL * delay * HZ); - if (srp_rport_set_state(rport, SRP_RPORT_BLOCKED) == 0) { + if ((fast_io_fail_tmo >= 0 || dev_loss_tmo >= 0) && + srp_rport_set_state(rport, SRP_RPORT_BLOCKED) == 0) { pr_debug("%s new state: %d\n", dev_name(&shost->shost_gendev), rport->state); scsi_target_block(&shost->shost_gendev); |