scsi_transport_srp: Fix fast_io_fail_tmo=dev_loss_tmo=off behavior
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> Cc: <stable@vger.kernel.org> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
64aa90f26c
commit
cd53eb686d
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue