diff mbox

[3/3] qla2xxx: ensure async flags are reset correctly

Message ID 20180222084937.59664-4-hare@suse.de (mailing list archive)
State Accepted
Headers show

Commit Message

Hannes Reinecke Feb. 22, 2018, 8:49 a.m. UTC
The fcport flags FCF_ASYNC_ACTIVE and FCF_ASYNC_SENT are used
to throttle the state machine, so we need to ensure to always
set and unset them correctly. Not doing so will lead to the
state machine getting confused and no login attempt into
remote ports.

Cc: Quinn Tran <quinn.tran@cavium.com>
Cc: Himanshu Madhani <himanshu.madhani@cavium.com>
Fixes: 3dbec59bdf63 ("scsi: qla2xxx: Prevent multiple active discovery commands per session")
Signed-off-by: Hannes Reinecke <hare@suse.com>
---
 drivers/scsi/qla2xxx/qla_gs.c   |  2 ++
 drivers/scsi/qla2xxx/qla_init.c | 13 ++++++++++---
 2 files changed, 12 insertions(+), 3 deletions(-)

Comments

Madhani, Himanshu Feb. 22, 2018, 6:04 p.m. UTC | #1
On Thu, 22 Feb 2018, 12:49am, Hannes Reinecke wrote:

> The fcport flags FCF_ASYNC_ACTIVE and FCF_ASYNC_SENT are used
> to throttle the state machine, so we need to ensure to always
> set and unset them correctly. Not doing so will lead to the
> state machine getting confused and no login attempt into
> remote ports.
> 
> Cc: Quinn Tran <quinn.tran@cavium.com>
> Cc: Himanshu Madhani <himanshu.madhani@cavium.com>
> Fixes: 3dbec59bdf63 ("scsi: qla2xxx: Prevent multiple active discovery commands per session")
> Signed-off-by: Hannes Reinecke <hare@suse.com>
> ---
>  drivers/scsi/qla2xxx/qla_gs.c   |  2 ++
>  drivers/scsi/qla2xxx/qla_init.c | 13 ++++++++++---
>  2 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
> index e4d404c24506..3cb05c1bd7bf 100644
> --- a/drivers/scsi/qla2xxx/qla_gs.c
> +++ b/drivers/scsi/qla2xxx/qla_gs.c
> @@ -3177,6 +3177,7 @@ int qla24xx_async_gidpn(scsi_qla_host_t *vha, fc_port_t *fcport)
>  	sp->free(sp);
>  	fcport->flags &= ~FCF_ASYNC_SENT;
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> @@ -3368,6 +3369,7 @@ int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport)
>  	sp->free(sp);
>  	fcport->flags &= ~FCF_ASYNC_SENT;
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
> index a19ed53ba6d9..df31c396d206 100644
> --- a/drivers/scsi/qla2xxx/qla_init.c
> +++ b/drivers/scsi/qla2xxx/qla_init.c
> @@ -228,6 +228,7 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
>  	sp->free(sp);
>  	fcport->flags &= ~FCF_ASYNC_SENT;
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> @@ -280,7 +281,7 @@ qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
>  done_free_sp:
>  	sp->free(sp);
>  done:
> -	fcport->flags &= ~FCF_ASYNC_SENT;
> +	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
>  	return rval;
>  }
>  
> @@ -288,6 +289,7 @@ void
>  qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>      uint16_t *data)
>  {
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	/* Don't re-login in target mode */
>  	if (!fcport->tgt_session)
>  		qla2x00_mark_device_lost(vha, fcport, 1, 0);
> @@ -301,6 +303,7 @@ qla2x00_async_prlo_sp_done(void *s, int res)
>  	struct srb_iocb *lio = &sp->u.iocb_cmd;
>  	struct scsi_qla_host *vha = sp->vha;
>  
> +	sp->fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	if (!test_bit(UNLOADING, &vha->dpc_flags))
>  		qla2x00_post_async_prlo_done_work(sp->fcport->vha, sp->fcport,
>  		    lio->u.logio.data);
> @@ -339,6 +342,7 @@ qla2x00_async_prlo(struct scsi_qla_host *vha, fc_port_t *fcport)
>  done_free_sp:
>  	sp->free(sp);
>  done:
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return rval;
>  }
>  
> @@ -392,6 +396,8 @@ qla2x00_async_adisc_sp_done(void *ptr, int res)
>  	    "Async done-%s res %x %8phC\n",
>  	    sp->name, res, sp->fcport->port_name);
>  
> +	sp->fcport->flags &= ~FCF_ASYNC_SENT;
> +
>  	memset(&ea, 0, sizeof(ea));
>  	ea.event = FCME_ADISC_DONE;
>  	ea.rc = res;
> @@ -442,7 +448,7 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
>  done_free_sp:
>  	sp->free(sp);
>  done:
> -	fcport->flags &= ~FCF_ASYNC_SENT;
> +	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
>  	qla2x00_post_async_adisc_work(vha, fcport, data);
>  	return rval;
>  }
> @@ -1815,6 +1821,7 @@ qla2x00_async_logout_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>  	qla2x00_mark_device_lost(vha, fcport, 1, 0);
>  	qlt_logo_completion_handler(fcport, data[0]);
>  	fcport->login_gen++;
> +	fcport->flags &= ~FCF_ASYNC_ACTIVE;
>  	return;
>  }
>  
> @@ -1822,6 +1829,7 @@ void
>  qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>      uint16_t *data)
>  {
> +	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
>  	if (data[0] == MBS_COMMAND_COMPLETE) {
>  		qla2x00_update_fcport(vha, fcport);
>  
> @@ -1829,7 +1837,6 @@ qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
>  	}
>  
>  	/* Retry login. */
> -	fcport->flags &= ~FCF_ASYNC_SENT;
>  	if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
>  		set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
>  	else
> 

Thanks for the patch. Looks good.

Acked-by: Himanshu Madhani <himanshu.madhani@cavium.com>
diff mbox

Patch

diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c
index e4d404c24506..3cb05c1bd7bf 100644
--- a/drivers/scsi/qla2xxx/qla_gs.c
+++ b/drivers/scsi/qla2xxx/qla_gs.c
@@ -3177,6 +3177,7 @@  int qla24xx_async_gidpn(scsi_qla_host_t *vha, fc_port_t *fcport)
 	sp->free(sp);
 	fcport->flags &= ~FCF_ASYNC_SENT;
 done:
+	fcport->flags &= ~FCF_ASYNC_ACTIVE;
 	return rval;
 }
 
@@ -3368,6 +3369,7 @@  int qla24xx_async_gpsc(scsi_qla_host_t *vha, fc_port_t *fcport)
 	sp->free(sp);
 	fcport->flags &= ~FCF_ASYNC_SENT;
 done:
+	fcport->flags &= ~FCF_ASYNC_ACTIVE;
 	return rval;
 }
 
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index a19ed53ba6d9..df31c396d206 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -228,6 +228,7 @@  qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
 	sp->free(sp);
 	fcport->flags &= ~FCF_ASYNC_SENT;
 done:
+	fcport->flags &= ~FCF_ASYNC_ACTIVE;
 	return rval;
 }
 
@@ -280,7 +281,7 @@  qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
 done_free_sp:
 	sp->free(sp);
 done:
-	fcport->flags &= ~FCF_ASYNC_SENT;
+	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
 	return rval;
 }
 
@@ -288,6 +289,7 @@  void
 qla2x00_async_prlo_done(struct scsi_qla_host *vha, fc_port_t *fcport,
     uint16_t *data)
 {
+	fcport->flags &= ~FCF_ASYNC_ACTIVE;
 	/* Don't re-login in target mode */
 	if (!fcport->tgt_session)
 		qla2x00_mark_device_lost(vha, fcport, 1, 0);
@@ -301,6 +303,7 @@  qla2x00_async_prlo_sp_done(void *s, int res)
 	struct srb_iocb *lio = &sp->u.iocb_cmd;
 	struct scsi_qla_host *vha = sp->vha;
 
+	sp->fcport->flags &= ~FCF_ASYNC_ACTIVE;
 	if (!test_bit(UNLOADING, &vha->dpc_flags))
 		qla2x00_post_async_prlo_done_work(sp->fcport->vha, sp->fcport,
 		    lio->u.logio.data);
@@ -339,6 +342,7 @@  qla2x00_async_prlo(struct scsi_qla_host *vha, fc_port_t *fcport)
 done_free_sp:
 	sp->free(sp);
 done:
+	fcport->flags &= ~FCF_ASYNC_ACTIVE;
 	return rval;
 }
 
@@ -392,6 +396,8 @@  qla2x00_async_adisc_sp_done(void *ptr, int res)
 	    "Async done-%s res %x %8phC\n",
 	    sp->name, res, sp->fcport->port_name);
 
+	sp->fcport->flags &= ~FCF_ASYNC_SENT;
+
 	memset(&ea, 0, sizeof(ea));
 	ea.event = FCME_ADISC_DONE;
 	ea.rc = res;
@@ -442,7 +448,7 @@  qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
 done_free_sp:
 	sp->free(sp);
 done:
-	fcport->flags &= ~FCF_ASYNC_SENT;
+	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
 	qla2x00_post_async_adisc_work(vha, fcport, data);
 	return rval;
 }
@@ -1815,6 +1821,7 @@  qla2x00_async_logout_done(struct scsi_qla_host *vha, fc_port_t *fcport,
 	qla2x00_mark_device_lost(vha, fcport, 1, 0);
 	qlt_logo_completion_handler(fcport, data[0]);
 	fcport->login_gen++;
+	fcport->flags &= ~FCF_ASYNC_ACTIVE;
 	return;
 }
 
@@ -1822,6 +1829,7 @@  void
 qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
     uint16_t *data)
 {
+	fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE);
 	if (data[0] == MBS_COMMAND_COMPLETE) {
 		qla2x00_update_fcport(vha, fcport);
 
@@ -1829,7 +1837,6 @@  qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
 	}
 
 	/* Retry login. */
-	fcport->flags &= ~FCF_ASYNC_SENT;
 	if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
 		set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
 	else