scsi: lpfc: Clear NLP_IN_DEV_LOSS flag if already in rediscovery
authorJustin Tee <justin.tee@broadcom.com>
Tue, 23 May 2023 18:31:59 +0000 (11:31 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 31 May 2023 22:14:20 +0000 (18:14 -0400)
In dev_loss_tmo callback routine, we early return if the ndlp is in a state
of rediscovery.  This occurs when a target proactively PLOGIs or PRLIs
after an RSCN before the dev_loss_tmo callback routine is scheduled to run.
Move clear of the NLP_IN_DEV_LOSS flag before the ndlp state check in such
cases.

Signed-off-by: Justin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20230523183206.7728-3-justintee8345@gmail.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_hbadisc.c

index 63e42e3..f99b5c2 100644 (file)
@@ -556,6 +556,9 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
                                 ndlp->nlp_DID, ndlp->nlp_flag,
                                 ndlp->nlp_state, ndlp->nlp_rpi);
        }
+       spin_lock_irqsave(&ndlp->lock, iflags);
+       ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
+       spin_unlock_irqrestore(&ndlp->lock, iflags);
 
        /* If we are devloss, but we are in the process of rediscovering the
         * ndlp, don't issue a NLP_EVT_DEVICE_RM event.
@@ -565,9 +568,6 @@ lpfc_dev_loss_tmo_handler(struct lpfc_nodelist *ndlp)
                return fcf_inuse;
        }
 
-       spin_lock_irqsave(&ndlp->lock, iflags);
-       ndlp->nlp_flag &= ~NLP_IN_DEV_LOSS;
-       spin_unlock_irqrestore(&ndlp->lock, iflags);
        if (!(ndlp->fc4_xpt_flags & NVME_XPT_REGD))
                lpfc_disc_state_machine(vport, ndlp, NULL, NLP_EVT_DEVICE_RM);