mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-21 03:33:59 +08:00
[SCSI] libiscsi: Fix recovery slowdown regression
We could be failing/stopping a connection due to libiscsi starting recovery/cleanup, but the xmit path or scsi eh thread path could be dropping the connection at the same time. As a result the session->state gets set to failed instead of in recovery. We end up not blocking the session and so the replacement timeout never gets started and we only end up failing the IO when scsi_softirq_done sees that the cmd has been running for (cmd->allowed + 1) * rq->timeout secs. We used to fail the IO right away so users are seeing a long delay when using dm-multipath. This problem was added in 2.6.28. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Cc: stable@kernel.org Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
b72c40949b
commit
4ae0a6c15e
@ -3087,14 +3087,15 @@ static void iscsi_start_session_recovery(struct iscsi_session *session,
|
|||||||
session->state = ISCSI_STATE_TERMINATE;
|
session->state = ISCSI_STATE_TERMINATE;
|
||||||
else if (conn->stop_stage != STOP_CONN_RECOVER)
|
else if (conn->stop_stage != STOP_CONN_RECOVER)
|
||||||
session->state = ISCSI_STATE_IN_RECOVERY;
|
session->state = ISCSI_STATE_IN_RECOVERY;
|
||||||
|
|
||||||
|
old_stop_stage = conn->stop_stage;
|
||||||
|
conn->stop_stage = flag;
|
||||||
spin_unlock_bh(&session->lock);
|
spin_unlock_bh(&session->lock);
|
||||||
|
|
||||||
del_timer_sync(&conn->transport_timer);
|
del_timer_sync(&conn->transport_timer);
|
||||||
iscsi_suspend_tx(conn);
|
iscsi_suspend_tx(conn);
|
||||||
|
|
||||||
spin_lock_bh(&session->lock);
|
spin_lock_bh(&session->lock);
|
||||||
old_stop_stage = conn->stop_stage;
|
|
||||||
conn->stop_stage = flag;
|
|
||||||
conn->c_stage = ISCSI_CONN_STOPPED;
|
conn->c_stage = ISCSI_CONN_STOPPED;
|
||||||
spin_unlock_bh(&session->lock);
|
spin_unlock_bh(&session->lock);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user