OSDN Git Service

[SCSI] lpfc 8.3.34: Fixed leaking memory from pci dma pool
authorJames Smart <james.smart@emulex.com>
Tue, 14 Aug 2012 18:26:35 +0000 (14:26 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 14 Sep 2012 16:59:25 +0000 (17:59 +0100)
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_mbox.c

index eba4b02..e9845d2 100644 (file)
@@ -3509,7 +3509,7 @@ lpfc_create_static_vport(struct lpfc_hba *phba)
        LPFC_MBOXQ_t *pmb = NULL;
        MAILBOX_t *mb;
        struct static_vport_info *vport_info;
-       int rc = 0, i;
+       int mbx_wait_rc = 0, i;
        struct fc_vport_identifiers vport_id;
        struct fc_vport *new_fc_vport;
        struct Scsi_Host *shost;
@@ -3526,7 +3526,7 @@ lpfc_create_static_vport(struct lpfc_hba *phba)
                                " allocate mailbox memory\n");
                return;
        }
-
+       memset(pmb, 0, sizeof(LPFC_MBOXQ_t));
        mb = &pmb->u.mb;
 
        vport_info = kzalloc(sizeof(struct static_vport_info), GFP_KERNEL);
@@ -3540,24 +3540,31 @@ lpfc_create_static_vport(struct lpfc_hba *phba)
 
        vport_buff = (uint8_t *) vport_info;
        do {
+               /* free dma buffer from previous round */
+               if (pmb->context1) {
+                       mp = (struct lpfc_dmabuf *)pmb->context1;
+                       lpfc_mbuf_free(phba, mp->virt, mp->phys);
+                       kfree(mp);
+               }
                if (lpfc_dump_static_vport(phba, pmb, offset))
                        goto out;
 
                pmb->vport = phba->pport;
-               rc = lpfc_sli_issue_mbox_wait(phba, pmb, LPFC_MBOX_TMO);
+               mbx_wait_rc = lpfc_sli_issue_mbox_wait(phba, pmb,
+                                                       LPFC_MBOX_TMO);
 
-               if ((rc != MBX_SUCCESS) || mb->mbxStatus) {
+               if ((mbx_wait_rc != MBX_SUCCESS) || mb->mbxStatus) {
                        lpfc_printf_log(phba, KERN_WARNING, LOG_INIT,
                                "0544 lpfc_create_static_vport failed to"
                                " issue dump mailbox command ret 0x%x "
                                "status 0x%x\n",
-                               rc, mb->mbxStatus);
+                               mbx_wait_rc, mb->mbxStatus);
                        goto out;
                }
 
                if (phba->sli_rev == LPFC_SLI_REV4) {
                        byte_count = pmb->u.mqe.un.mb_words[5];
-                       mp = (struct lpfc_dmabuf *) pmb->context2;
+                       mp = (struct lpfc_dmabuf *)pmb->context1;
                        if (byte_count > sizeof(struct static_vport_info) -
                                        offset)
                                byte_count = sizeof(struct static_vport_info)
@@ -3621,9 +3628,9 @@ lpfc_create_static_vport(struct lpfc_hba *phba)
 
 out:
        kfree(vport_info);
-       if (rc != MBX_TIMEOUT) {
-               if (pmb->context2) {
-                       mp = (struct lpfc_dmabuf *) pmb->context2;
+       if (mbx_wait_rc != MBX_TIMEOUT) {
+               if (pmb->context1) {
+                       mp = (struct lpfc_dmabuf *)pmb->context1;
                        lpfc_mbuf_free(phba, mp->virt, mp->phys);
                        kfree(mp);
                }
index 721ce1f..efc9cd9 100644 (file)
@@ -92,7 +92,7 @@ lpfc_dump_static_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb,
        memset(mp->virt, 0, LPFC_BPL_SIZE);
        INIT_LIST_HEAD(&mp->list);
        /* save address for completion */
-       pmb->context2 = (uint8_t *) mp;
+       pmb->context1 = (uint8_t *)mp;
        mb->un.varWords[3] = putPaddrLow(mp->phys);
        mb->un.varWords[4] = putPaddrHigh(mp->phys);
        mb->un.varDmp.sli4_length = sizeof(struct static_vport_info);