Message ID | 20200806111014.28434-5-njavali@marvell.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | qla2xxx driver bug fixes | expand |
> On Aug 6, 2020, at 6:10 AM, Nilesh Javali <njavali@marvell.com> wrote: > > From: Quinn Tran <qutran@marvell.com> > > Multipath errors were seen during failback due to login timeout. > The remote device sent LOGO, the local host teared 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. > > Signed-off-by: Quinn Tran <qutran@marvell.com> > Signed-off-by: Nilesh Javali <njavali@marvell.com> > --- > drivers/scsi/qla2xxx/qla_gs.c | 19 ++++++++++++++++--- > drivers/scsi/qla2xxx/qla_target.c | 2 +- > 2 files changed, 17 insertions(+), 4 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c > index 8c30d9dbb48c..2d7a47a2873b 100644 > --- a/drivers/scsi/qla2xxx/qla_gs.c > +++ b/drivers/scsi/qla2xxx/qla_gs.c > @@ -3536,10 +3536,23 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) > } > > if (fcport->scan_state != QLA_FCPORT_FOUND) { > + bool do_delete = false; > + > + if (fcport->scan_needed && > + fcport->disc_state == DSC_LOGIN_PEND) { > + /* his cable just got disconnected after we > + * send him a login. Do delete to prevent > + * timeout > + */ Small nit.. the comment should describe who is “his” in this case > + fcport->logout_on_delete = 1; > + do_delete = true; > + } > + > fcport->scan_needed = 0; > - if ((qla_dual_mode_enabled(vha) || > - qla_ini_mode_enabled(vha)) && > - atomic_read(&fcport->state) == FCS_ONLINE) { > + if (((qla_dual_mode_enabled(vha) || > + qla_ini_mode_enabled(vha)) && > + atomic_read(&fcport->state) == FCS_ONLINE) || > + do_delete) { > if (fcport->loop_id != FC_NO_LOOP_ID) { > if (fcport->flags & FCF_FCP2_DEVICE) > fcport->logout_on_delete = 0; > diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c > index fbb80a043b4f..90289162dbd4 100644 > --- a/drivers/scsi/qla2xxx/qla_target.c > +++ b/drivers/scsi/qla2xxx/qla_target.c > @@ -1270,7 +1270,7 @@ void qlt_schedule_sess_for_deletion(struct fc_port *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", > sess, sess->port_name); > > -- > 2.19.0.rc0 > Other than small nit. Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> -- Himanshu Madhani Oracle Linux Engineering
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 8c30d9dbb48c..2d7a47a2873b 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c @@ -3536,10 +3536,23 @@ void qla24xx_async_gnnft_done(scsi_qla_host_t *vha, srb_t *sp) } if (fcport->scan_state != QLA_FCPORT_FOUND) { + bool do_delete = false; + + if (fcport->scan_needed && + fcport->disc_state == DSC_LOGIN_PEND) { + /* his cable just got disconnected after we + * send him a login. Do delete to prevent + * timeout + */ + fcport->logout_on_delete = 1; + do_delete = true; + } + fcport->scan_needed = 0; - if ((qla_dual_mode_enabled(vha) || - qla_ini_mode_enabled(vha)) && - atomic_read(&fcport->state) == FCS_ONLINE) { + if (((qla_dual_mode_enabled(vha) || + qla_ini_mode_enabled(vha)) && + atomic_read(&fcport->state) == FCS_ONLINE) || + do_delete) { if (fcport->loop_id != FC_NO_LOOP_ID) { if (fcport->flags & FCF_FCP2_DEVICE) fcport->logout_on_delete = 0; diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index fbb80a043b4f..90289162dbd4 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -1270,7 +1270,7 @@ void qlt_schedule_sess_for_deletion(struct fc_port *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", sess, sess->port_name);