Commit 3b182641 authored by Bart Van Assche's avatar Bart Van Assche Committed by Greg Kroah-Hartman

scsi_transport_srp: Fix fast_io_fail_tmo=dev_loss_tmo=off behavior

commit cd53eb68 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: default avatarBart Van Assche <bvanassche@acm.org>
Reviewed-by: default avatarSagi Grimberg <sagig@mellanox.com>
Reviewed-by: default avatarDavid Dillow <dave@thedillows.org>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 1633efbd
...@@ -473,7 +473,8 @@ static void __srp_start_tl_fail_timers(struct srp_rport *rport) ...@@ -473,7 +473,8 @@ static void __srp_start_tl_fail_timers(struct srp_rport *rport)
if (delay > 0) if (delay > 0)
queue_delayed_work(system_long_wq, &rport->reconnect_work, queue_delayed_work(system_long_wq, &rport->reconnect_work,
1UL * delay * HZ); 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), pr_debug("%s new state: %d\n", dev_name(&shost->shost_gendev),
rport->state); rport->state);
scsi_target_block(&shost->shost_gendev); scsi_target_block(&shost->shost_gendev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment