> On Oct 21, 2021, at 2:31 AM, Nilesh Javali <njavali@xxxxxxxxxxx> wrote: > > From: Quinn Tran <qutran@xxxxxxxxxxx> > > For RSCN of type "Area, Domain, or Fabric", which indicate > a portion or entire fabric was disturbed. Current driver > does not set the scan_need flag to indicate a session was > affected by the disturbance. This in turn, can lead to > IO timeout and delay of relogin. Hence initiate relogin > in the event of fabric disturbance. > > Fixes: 1560bafdff9e ("scsi: qla2xxx: Use complete switch scan for RSCN events") > Signed-off-by: Quinn Tran <qutran@xxxxxxxxxxx> > Signed-off-by: Nilesh Javali <njavali@xxxxxxxxxxx> > --- > drivers/scsi/qla2xxx/qla_init.c | 54 +++++++++++++++++++++++++++------ > 1 file changed, 45 insertions(+), 9 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c > index a9a4243cb15a..339aa3b2737a 100644 > --- a/drivers/scsi/qla2xxx/qla_init.c > +++ b/drivers/scsi/qla2xxx/qla_init.c > @@ -1786,16 +1786,52 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea) > fc_port_t *fcport; > unsigned long flags; > > - fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1); > - if (fcport) { > - if (fcport->flags & FCF_FCP2_DEVICE) { > - ql_dbg(ql_dbg_disc, vha, 0x2115, > - "Delaying session delete for FCP2 portid=%06x %8phC ", > - fcport->d_id.b24, fcport->port_name); > - return; > + switch (ea->id.b.rsvd_1) { > + case RSCN_PORT_ADDR: > + fcport = qla2x00_find_fcport_by_nportid(vha, &ea->id, 1); > + if (fcport) { > + if (fcport->flags & FCF_FCP2_DEVICE) { > + ql_dbg(ql_dbg_disc, vha, 0x2115, > + "Delaying session delete for FCP2 portid=%06x %8phC ", > + fcport->d_id.b24, fcport->port_name); > + return; > + } > + fcport->scan_needed = 1; > + fcport->rscn_gen++; > + } > + break; > + case RSCN_AREA_ADDR: > + list_for_each_entry(fcport, &vha->vp_fcports, list) { > + if (fcport->flags & FCF_FCP2_DEVICE) > + continue; > + > + if ((ea->id.b24 & 0xffff00) == (fcport->d_id.b24 & 0xffff00)) { > + fcport->scan_needed = 1; > + fcport->rscn_gen++; > + } > } > - fcport->scan_needed = 1; > - fcport->rscn_gen++; > + break; > + case RSCN_DOM_ADDR: > + list_for_each_entry(fcport, &vha->vp_fcports, list) { > + if (fcport->flags & FCF_FCP2_DEVICE) > + continue; > + > + if ((ea->id.b24 & 0xff0000) == (fcport->d_id.b24 & 0xff0000)) { > + fcport->scan_needed = 1; > + fcport->rscn_gen++; > + } > + } > + break; > + case RSCN_FAB_ADDR: > + default: > + list_for_each_entry(fcport, &vha->vp_fcports, list) { > + if (fcport->flags & FCF_FCP2_DEVICE) > + continue; > + > + fcport->scan_needed = 1; > + fcport->rscn_gen++; > + } > + break; > } > > spin_lock_irqsave(&vha->work_lock, flags); > -- > 2.19.0.rc0 > Reviewed-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx> -- Himanshu Madhani Oracle Linux Engineering