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.t...@cavium.com>
> Cc: Himanshu Madhani <himanshu.madh...@cavium.com>
> Fixes: 3dbec59bdf63 ("scsi: qla2xxx: Prevent multiple active discovery 
> commands per session")
> Signed-off-by: Hannes Reinecke <h...@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.madh...@cavium.com>

Reply via email to