[v2,04/11] qla2xxx: fix login timeout
diff mbox series

Message ID 20200806111014.28434-5-njavali@marvell.com
State Accepted
Headers show
Series
  • qla2xxx driver bug fixes
Related show

Commit Message

Nilesh Javali Aug. 6, 2020, 11:10 a.m. UTC
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(-)

Comments

Himanshu Madhani Aug. 12, 2020, 7:42 p.m. UTC | #1
> 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

Patch
diff mbox series

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);