]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
scsi: lpfc: Fix plogi collision that causes illegal state transition
authorDick Kennedy <dick.kennedy@broadcom.com>
Wed, 23 Aug 2017 23:55:30 +0000 (16:55 -0700)
committerJack Vogel <jack.vogel@oracle.com>
Thu, 8 Mar 2018 04:24:41 +0000 (20:24 -0800)
Orabug: 27631736

Message "0271 Illegal State Transition: node" seen in logs, all luns are
unuseable for that target.

A window exists in the rcv_plogi path where if the state is plogi issue
but the driver has not issued a plogi, then two reglogins will be sent
for the same RPI. The first one to complete will advance the state to
prli issue the second one will be detected as an illegal state, and
leave the node in an unusable state.

Correct the completion routine for the PLOGI ACC that detects the state
change when the driver starts discovery on the node again and drop the
REGLOGIN mailbox command.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
(cherry picked from commit 1fe68477d235e42fb2613d01837d49545408c622)
Signed-off-by: Dick dkennedy <dick.kennedy@broadcom.com>
Signed-off-by: Dan Duval <dan.duval@oracle.com>
Reviewed-by: Jack Vogel <jack.vogel@oracle.com>
drivers/scsi/lpfc/lpfc_els.c

index 4f218f4c105aa2611e61a3816846902548e47871..c56f9298215a05bf9881aa912a5391a0ced42332 100644 (file)
@@ -3806,7 +3806,25 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
        if (mbox) {
                if ((rspiocb->iocb.ulpStatus == 0)
                    && (ndlp->nlp_flag & NLP_ACC_REGLOGIN)) {
-                       lpfc_unreg_rpi(vport, ndlp);
+                       if (!lpfc_unreg_rpi(vport, ndlp) &&
+                           (ndlp->nlp_state ==  NLP_STE_PLOGI_ISSUE ||
+                            ndlp->nlp_state == NLP_STE_REG_LOGIN_ISSUE)) {
+                               lpfc_printf_vlog(vport, KERN_INFO,
+                                       LOG_DISCOVERY,
+                                       "0314 PLOGI recov DID x%x "
+                                       "Data: x%x x%x x%x\n",
+                                       ndlp->nlp_DID, ndlp->nlp_state,
+                                       ndlp->nlp_rpi, ndlp->nlp_flag);
+                               mp = mbox->context1;
+                               if (mp) {
+                                       lpfc_mbuf_free(phba, mp->virt,
+                                                      mp->phys);
+                                       kfree(mp);
+                               }
+                               mempool_free(mbox, phba->mbox_mem_pool);
+                               goto out;
+                       }
+
                        /* Increment reference count to ndlp to hold the
                         * reference to ndlp for the callback function.
                         */