scsi: lpfc: Fix ADISC handling that never frees nodes
[linux-2.6-microblaze.git] / drivers / scsi / lpfc / lpfc_els.c
index 0e92a0b..9f81113 100644 (file)
@@ -1608,7 +1608,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
        struct lpfc_nodelist *new_ndlp;
        struct serv_parm *sp;
        uint8_t  name[sizeof(struct lpfc_name)];
-       uint32_t rc, keepDID = 0, keep_nlp_flag = 0;
+       uint32_t keepDID = 0, keep_nlp_flag = 0;
        uint32_t keep_new_nlp_flag = 0;
        uint16_t keep_nlp_state;
        u32 keep_nlp_fc4_type = 0;
@@ -1630,7 +1630,7 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
        new_ndlp = lpfc_findnode_wwpn(vport, &sp->portName);
 
        /* return immediately if the WWPN matches ndlp */
-       if (new_ndlp == ndlp)
+       if (!new_ndlp || (new_ndlp == ndlp))
                return ndlp;
 
        if (phba->sli_rev == LPFC_SLI_REV4) {
@@ -1649,30 +1649,11 @@ lpfc_plogi_confirm_nport(struct lpfc_hba *phba, uint32_t *prsp,
                         (new_ndlp ? new_ndlp->nlp_flag : 0),
                         (new_ndlp ? new_ndlp->nlp_fc4_type : 0));
 
-       if (!new_ndlp) {
-               rc = memcmp(&ndlp->nlp_portname, name,
-                           sizeof(struct lpfc_name));
-               if (!rc) {
-                       if (active_rrqs_xri_bitmap)
-                               mempool_free(active_rrqs_xri_bitmap,
-                                            phba->active_rrq_pool);
-                       return ndlp;
-               }
-               new_ndlp = lpfc_nlp_init(vport, ndlp->nlp_DID);
-               if (!new_ndlp) {
-                       if (active_rrqs_xri_bitmap)
-                               mempool_free(active_rrqs_xri_bitmap,
-                                            phba->active_rrq_pool);
-                       return ndlp;
-               }
-       } else {
-               keepDID = new_ndlp->nlp_DID;
-               if (phba->sli_rev == LPFC_SLI_REV4 &&
-                   active_rrqs_xri_bitmap)
-                       memcpy(active_rrqs_xri_bitmap,
-                              new_ndlp->active_rrqs_xri_bitmap,
-                              phba->cfg_rrq_xri_bitmap_sz);
-       }
+       keepDID = new_ndlp->nlp_DID;
+
+       if (phba->sli_rev == LPFC_SLI_REV4 && active_rrqs_xri_bitmap)
+               memcpy(active_rrqs_xri_bitmap, new_ndlp->active_rrqs_xri_bitmap,
+                      phba->cfg_rrq_xri_bitmap_sz);
 
        /* At this point in this routine, we know new_ndlp will be
         * returned. however, any previous GID_FTs that were done