Commit abb31aea authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen

scsi: qla2xxx: Fix login timeout

Multipath errors were seen during failback due to login timeout.  The
remote device sent LOGO, the local host tore down the session and did
relogin. The RSCN arrived indicates remote device is going through failover
after which the relogin is in a 20s timeout phase.  At this point the
driver is stuck in the relogin process.  Add a fix to delete the session as
part of abort/flush the login.

Link: https://lore.kernel.org/r/20200806111014.28434-5-njavali@marvell.comReviewed-by: default avatarHimanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: default avatarQuinn Tran <qutran@marvell.com>
Signed-off-by: default avatarNilesh Javali <njavali@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4709272f
...@@ -3538,10 +3538,22 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) ...@@ -3538,10 +3538,22 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp)
} }
if (fcport->scan_state != QLA_FCPORT_FOUND) { if (fcport->scan_state != QLA_FCPORT_FOUND) {
bool do_delete = false;
if (fcport->scan_needed &&
fcport->disc_state == DSC_LOGIN_PEND) {
/* Cable got disconnected after we sent
* a login. Do delete to prevent timeout.
*/
fcport->logout_on_delete = 1;
do_delete = true;
}
fcport->scan_needed = 0; fcport->scan_needed = 0;
if ((qla_dual_mode_enabled(vha) || if (((qla_dual_mode_enabled(vha) ||
qla_ini_mode_enabled(vha)) && qla_ini_mode_enabled(vha)) &&
atomic_read(&fcport->state) == FCS_ONLINE) { atomic_read(&fcport->state) == FCS_ONLINE) ||
do_delete) {
if (fcport->loop_id != FC_NO_LOOP_ID) { if (fcport->loop_id != FC_NO_LOOP_ID) {
if (fcport->flags & FCF_FCP2_DEVICE) if (fcport->flags & FCF_FCP2_DEVICE)
fcport->logout_on_delete = 0; fcport->logout_on_delete = 0;
......
...@@ -1270,7 +1270,7 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess) ...@@ -1270,7 +1270,7 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
qla24xx_chk_fcp_state(sess); qla24xx_chk_fcp_state(sess);
ql_dbg(ql_dbg_tgt, sess->vha, 0xe001, ql_dbg(ql_dbg_disc, sess->vha, 0xe001,
"Scheduling sess %p for deletion %8phC\n", "Scheduling sess %p for deletion %8phC\n",
sess, sess->port_name); sess, sess->port_name);
......
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