]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
scsi: lpfc: Fix discovery failures when target device connectivity bounces
authorJames Smart <jsmart2021@gmail.com>
Sun, 22 Sep 2019 03:58:55 +0000 (20:58 -0700)
committerKhalid Elmously <khalid.elmously@canonical.com>
Wed, 29 Jan 2020 05:05:10 +0000 (00:05 -0500)
BugLink: https://bugs.launchpad.net/bugs/1860816
[ Upstream commit 3f97aed6117c7677eb16756c4ec8b86000fd5822 ]

An issue was seen discovering all SCSI Luns when a target device undergoes
link bounce.

The driver currently does not qualify the FC4 support on the target.
Therefore it will send a SCSI PRLI and an NVMe PRLI. The expectation is
that the target will reject the PRLI if it is not supported. If a PRLI
times out, the driver will retry. The driver will not proceed with the
device until both SCSI and NVMe PRLIs are resolved.  In the failure case,
the device is FCP only and does not respond to the NVMe PRLI, thus
initiating the wait/retry loop in the driver.  During that time, a RSCN is
received (device bounced) causing the driver to issue a GID_FT.  The GID_FT
response comes back before the PRLI mess is resolved and it prematurely
cancels the PRLI retry logic and leaves the device in a STE_PRLI_ISSUE
state. Discovery with the target never completes or resets.

Fix by resetting the node state back to STE_NPR_NODE when GID_FT completes,
thereby restarting the discovery process for the node.

Link: https://lore.kernel.org/r/20190922035906.10977-10-jsmart2021@gmail.com
Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <jsmart2021@gmail.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/scsi/lpfc/lpfc_hbadisc.c

index 28ecaa7fc715ba900b85888df66a17ba2a9acac3..89a83d1a7278c084a16cdbbfb9dff5032ad921c5 100644 (file)
@@ -5368,9 +5368,14 @@ lpfc_setup_disc_node(struct lpfc_vport *vport, uint32_t did)
                        /* If we've already received a PLOGI from this NPort
                         * we don't need to try to discover it again.
                         */
-                       if (ndlp->nlp_flag & NLP_RCV_PLOGI)
+                       if (ndlp->nlp_flag & NLP_RCV_PLOGI &&
+                           !(ndlp->nlp_type &
+                            (NLP_FCP_TARGET | NLP_NVME_TARGET)))
                                return NULL;
 
+                       ndlp->nlp_prev_state = ndlp->nlp_state;
+                       lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
+
                        spin_lock_irq(shost->host_lock);
                        ndlp->nlp_flag |= NLP_NPR_2B_DISC;
                        spin_unlock_irq(shost->host_lock);