[SCSI] lpfc 8.3.29: FC Discovery state machine fixes
authorJames Smart <james.smart@emulex.com>
Wed, 18 Jan 2012 21:25:25 +0000 (16:25 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 19 Feb 2012 14:08:53 +0000 (08:08 -0600)
FC Discovery state machine fixes.

- Fix bug with driver returning the inactive ndlp (125743)
- Fix discovery problem when in pt2pt by copying old ndlp state before
  state change (126887)
- Fix ndlp nodelist not empty wait timeout during driver unloading (127052)

Signed-off-by: Alex Iannicelli <alex.iannicelli@emulex.com>
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc_els.c
drivers/scsi/lpfc/lpfc_hbadisc.c
drivers/scsi/lpfc/lpfc_init.c

index 2e7709f..8db2fb3 100644 (file)
@@ -1526,7 +1526,6 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
                        memcpy(&ndlp->active_rrqs.xri_bitmap,
                                &rrq.xri_bitmap,
                                sizeof(ndlp->active_rrqs.xri_bitmap));
-               lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
                /* Since we are swapping the ndlp passed in with the new one
                 * and the did has already been swapped, copy over the
                 * state and names.
@@ -1536,6 +1535,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
                memcpy(&new_ndlp->nlp_nodename, &ndlp->nlp_nodename,
                        sizeof(struct lpfc_name));
                new_ndlp->nlp_state = ndlp->nlp_state;
+               lpfc_nlp_set_state(vport, ndlp, NLP_STE_NPR_NODE);
                /* Fix up the rport accordingly */
                rport = ndlp->rport;
                if (rport) {
index 678a4b1..2cadb82 100644 (file)
@@ -5332,6 +5332,10 @@ lpfc_filter_by_rpi(struct lpfc_nodelist *ndlp, void *param)
 {
        uint16_t *rpi = param;
 
+       /* check for active node */
+       if (!NLP_CHK_NODE_ACT(ndlp))
+               return 0;
+
        return ndlp->nlp_rpi == *rpi;
 }
 
index d962877..a919149 100644 (file)
@@ -2341,13 +2341,20 @@ lpfc_cleanup(struct lpfc_vport *vport)
                        continue;
                }
 
+               /* take care of nodes in unused state before the state
+                * machine taking action.
+                */
+               if (ndlp->nlp_state == NLP_STE_UNUSED_NODE) {
+                       lpfc_nlp_put(ndlp);
+                       continue;
+               }
+
                if (ndlp->nlp_type & NLP_FABRIC)
                        lpfc_disc_state_machine(vport, ndlp, NULL,
                                        NLP_EVT_DEVICE_RECOVERY);
 
                lpfc_disc_state_machine(vport, ndlp, NULL,
                                             NLP_EVT_DEVICE_RM);
-
        }
 
        /* At this point, ALL ndlp's should be gone