Message ID | 20180222084937.59664-4-hare@suse.de (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
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 --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
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(-)