[SCSI] lpfc 8.3.29: Locking fix and Memory leak Fixes
authorJames Smart <james.smart@emulex.com>
Wed, 18 Jan 2012 21:25:38 +0000 (16:25 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Sun, 19 Feb 2012 14:08:53 +0000 (08:08 -0600)
Locking fix and Memory leak Fixes

- Fix Locking code raises IRQ twice (NA)
- Fix mailbox and vpi memory leaks (126818)

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_hbadisc.c
drivers/scsi/lpfc/lpfc_init.c
drivers/scsi/lpfc/lpfc_nportdisc.c
drivers/scsi/lpfc/lpfc_sli.c

index 2cadb82..343d87b 100644 (file)
@@ -2977,9 +2977,9 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
                                "topology\n");
                                /* Get Loop Map information */
                if (bf_get(lpfc_mbx_read_top_il, la)) {
-                       spin_lock_irq(shost->host_lock);
+                       spin_lock(shost->host_lock);
                        vport->fc_flag |= FC_LBIT;
-                       spin_unlock_irq(shost->host_lock);
+                       spin_unlock(shost->host_lock);
                }
 
                vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la);
@@ -3029,9 +3029,9 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
                                phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
                }
                vport->fc_myDID = phba->fc_pref_DID;
-               spin_lock_irq(shost->host_lock);
+               spin_lock(shost->host_lock);
                vport->fc_flag |= FC_LBIT;
-               spin_unlock_irq(shost->host_lock);
+               spin_unlock(shost->host_lock);
        }
        spin_unlock_irq(&phba->hbalock);
 
index a919149..b38f99f 100644 (file)
@@ -8178,6 +8178,9 @@ lpfc_unset_hba(struct lpfc_hba *phba)
        vport->load_flag |= FC_UNLOADING;
        spin_unlock_irq(shost->host_lock);
 
+       kfree(phba->vpi_bmask);
+       kfree(phba->vpi_ids);
+
        lpfc_stop_hba_timers(phba);
 
        phba->pport->work_port_events = 0;
@@ -8710,6 +8713,9 @@ lpfc_pci_remove_one_s3(struct pci_dev *pdev)
        /* Final cleanup of txcmplq and reset the HBA */
        lpfc_sli_brdrestart(phba);
 
+       kfree(phba->vpi_bmask);
+       kfree(phba->vpi_ids);
+
        lpfc_stop_hba_timers(phba);
        spin_lock_irq(&phba->hbalock);
        list_del_init(&vport->listentry);
index 32b6d72..7b6b2aa 100644 (file)
@@ -481,6 +481,7 @@ lpfc_mbx_cmpl_resume_rpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
                        ndlp, NULL);
        }
        kfree(elsiocb);
+       mempool_free(mboxq, phba->mbox_mem_pool);
 }
 
 static int
index 73da1c0..e5d22b1 100644 (file)
@@ -14840,7 +14840,8 @@ lpfc_sli4_resume_rpi(struct lpfc_nodelist *ndlp,
                mboxq->mbox_cmpl = cmpl;
                mboxq->context1 = arg;
                mboxq->context2 = ndlp;
-       }
+       } else
+               mboxq->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
        mboxq->vport = ndlp->vport;
        rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT);
        if (rc == MBX_NOT_FINISHED) {