Message ID | 20220308082048.9774-8-njavali@marvell.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | qla2xxx driver fixes | expand |
> On Mar 8, 2022, at 12:20 AM, Nilesh Javali <njavali@marvell.com> wrote: > > From: Quinn Tran <qutran@marvell.com> > > User experience device lost. The log shows Get port data base > command was queued up, failed, and requeued again. Every time > it is requeued, it set the FCF_ASYNC_ACTIVE. This prevents any > recovery code from occurring because driver thinks a recovery is in > progress for this session. In essence, this session is hung. > The reason it gets into this place is the session deletion got > in front of this call due to link perturbation. > > Break the requeue cycle and exit. > The session deletion code will trigger a session relogin. > > Cc: stable@vger.kernel.org > Fixes: 726b85487067 ("qla2xxx: Add framework for async fabric discovery") > Signed-off-by: Quinn Tran <qutran@marvell.com> > Signed-off-by: Nilesh Javali <njavali@marvell.com> > --- > drivers/scsi/qla2xxx/qla_def.h | 4 ++++ > drivers/scsi/qla2xxx/qla_init.c | 19 +++++++++++++++++-- > 2 files changed, 21 insertions(+), 2 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h > index 47d7fa1c7ae8..b0579bce5b88 100644 > --- a/drivers/scsi/qla2xxx/qla_def.h > +++ b/drivers/scsi/qla2xxx/qla_def.h > @@ -5437,4 +5437,8 @@ struct ql_vnd_tgt_stats_resp { > #include "qla_gbl.h" > #include "qla_dbg.h" > #include "qla_inline.h" > + > +#define SESSION_DELETE(_fcport) (_fcport->disc_state == DSC_DELETE_PEND || \ > + _fcport->disc_state == DSC_DELETED) > + would you be open to changing the macro name to IS_SESSION_DELETED(). Since you are checking for pending deletion in progress or deleted for session, name SESSION_DELETE is not reader friendly. > #endif > diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c > index 6ffe44b805b6..3c58a2911937 100644 > --- a/drivers/scsi/qla2xxx/qla_init.c > +++ b/drivers/scsi/qla2xxx/qla_init.c > @@ -575,6 +575,14 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport, > struct srb_iocb *lio; > int rval = QLA_FUNCTION_FAILED; > > + if (SESSION_DELETE(fcport)) { > + ql_log(ql_log_warn, vha, 0xffff, > + "%s: %8phC is being delete - not sending command.\n", > + __func__, fcport->port_name); > + fcport->flags &= ~FCF_ASYNC_ACTIVE; > + return rval; > + } > + > if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) > return rval; > > @@ -1338,8 +1346,15 @@ int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt) > struct port_database_24xx *pd; > struct qla_hw_data *ha = vha->hw; > > - if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) || > - fcport->loop_id == FC_NO_LOOP_ID) { > + if (SESSION_DELETE(fcport)) { > + ql_log(ql_log_warn, vha, 0xffff, > + "%s: %8phC is being delete - not sending command.\n", > + __func__, fcport->port_name); > + fcport->flags &= ~FCF_ASYNC_ACTIVE; > + return rval; > + } > + > + if (!vha->flags.online || fcport->flags & FCF_ASYNC_SENT) { > ql_log(ql_log_warn, vha, 0xffff, > "%s: %8phC online %d flags %x - not sending command.\n", > __func__, fcport->port_name, vha->flags.online, fcport->flags); > -- > 2.19.0.rc0 > -- Himanshu Madhani Oracle Linux Engineering
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 47d7fa1c7ae8..b0579bce5b88 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -5437,4 +5437,8 @@ struct ql_vnd_tgt_stats_resp { #include "qla_gbl.h" #include "qla_dbg.h" #include "qla_inline.h" + +#define SESSION_DELETE(_fcport) (_fcport->disc_state == DSC_DELETE_PEND || \ + _fcport->disc_state == DSC_DELETED) + #endif diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 6ffe44b805b6..3c58a2911937 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -575,6 +575,14 @@ qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport, struct srb_iocb *lio; int rval = QLA_FUNCTION_FAILED; + if (SESSION_DELETE(fcport)) { + ql_log(ql_log_warn, vha, 0xffff, + "%s: %8phC is being delete - not sending command.\n", + __func__, fcport->port_name); + fcport->flags &= ~FCF_ASYNC_ACTIVE; + return rval; + } + if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT)) return rval; @@ -1338,8 +1346,15 @@ int qla24xx_async_gpdb(struct scsi_qla_host *vha, fc_port_t *fcport, u8 opt) struct port_database_24xx *pd; struct qla_hw_data *ha = vha->hw; - if (!vha->flags.online || (fcport->flags & FCF_ASYNC_SENT) || - fcport->loop_id == FC_NO_LOOP_ID) { + if (SESSION_DELETE(fcport)) { + ql_log(ql_log_warn, vha, 0xffff, + "%s: %8phC is being delete - not sending command.\n", + __func__, fcport->port_name); + fcport->flags &= ~FCF_ASYNC_ACTIVE; + return rval; + } + + if (!vha->flags.online || fcport->flags & FCF_ASYNC_SENT) { ql_log(ql_log_warn, vha, 0xffff, "%s: %8phC online %d flags %x - not sending command.\n", __func__, fcport->port_name, vha->flags.online, fcport->flags);