[PATCH 2/4] lpfc: Fix FLOGI/PLOGI receive race condition in pt2pt discovery

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The driver is unable to successfully login with remote device. During
pt2pt login, the driver complete it's FLOGI request, with the
remote device having WWN precedence.  The remote device issues its own
(delayed) FLOGI after accepting the drivers, and upon transmitting the
FLOGI, immediately recognizes it has already processed the driver's
FLOGI thus it transitions to sending a PLOGI before waiting for an ACC
to its FLOGI.

In the driver, the FLOGI is received and an ACC sent, followed by the
PLOGI being received and an ACC sent. The issue is that the PLOGI
reception occurs before the response from the adapter from the FLOGI
ACC is received. Processing of the PLOGI sets state flags to perform
the REG_RPI mailbox command and proceed with the rest of discovery on
the port. The same completion routine used by both FLOGI and PLOGI is
generic in nature. One of the things it does is clear flags, and those
flags happen to drive the rest of discovery.  So what happened was the
PLOGI processing set the flags, the FLOGI ACC completion cleared them,
thus when the PLOGI ACC completes it doesn't see the flags and stops.

Fix by modifying the generic completion routine to not clear the rest
of discovery flag (NLP_ACC_REGLOGIN) unless the completion is also
associated with performing a mailbox command as part of it's handling.
For things such as FLOGI ACC, there isn't a subsequent action to perform
with the adapter, thus there is no mailbox cmd ptr. PLOGI ACC though
will perform REG_RPI upon completion, thus there is a mailbox cmd ptr.

Signed-off-by: Dick Kennedy <dick.kennedy@xxxxxxxxxxxx>
Signed-off-by: James Smart <james.smart@xxxxxxxxxxxx>

---
 drivers/scsi/lpfc/lpfc_els.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index 48dc63f22cca..abc6200d8881 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -4656,7 +4656,9 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
 out:
 	if (ndlp && NLP_CHK_NODE_ACT(ndlp) && shost) {
 		spin_lock_irq(shost->host_lock);
-		ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
+		if (mbox)
+			ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
+		ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI;
 		spin_unlock_irq(shost->host_lock);
 
 		/* If the node is not being used by another discovery thread,
-- 
2.26.2




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux