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@xxxxxxxxxx> > Cc: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx> > Fixes: 3dbec59bdf63 ("scsi: qla2xxx: Prevent multiple active discovery commands per session") > Signed-off-by: Hannes Reinecke <hare@xxxxxxxx> > --- > 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@xxxxxxxxxx>