diff options
author | Tomas Henzl <thenzl@redhat.com> | 2014-07-07 11:19:58 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-07-25 17:17:05 -0400 |
commit | f3a0655f9ba293ff64bf0f74f79595f922db8f9e (patch) | |
tree | a240763c24be822da91e3f69760089674d1f36a8 | |
parent | 31d05e5b14f362c7ea99d1d9e977771ef434b820 (diff) |
pm8001: fix a memory leak in nvmd_resp
Instead of copying information to fw_control_context free it.
The task is forgotten thus also the reference to fw_control_context
and the completion thread takes the info from virt_ptr again.
Signed-off-by: Tomas Henzl <thenzl@redhat.com>
Acked-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
-rw-r--r-- | drivers/scsi/pm8001/pm8001_hwi.c | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c index 2e5eb4bae44f..173831016f5f 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.c +++ b/drivers/scsi/pm8001/pm8001_hwi.c | |||
@@ -3132,7 +3132,6 @@ void pm8001_mpi_set_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb) | |||
3132 | void | 3132 | void |
3133 | pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb) | 3133 | pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb) |
3134 | { | 3134 | { |
3135 | struct fw_control_ex *fw_control_context; | ||
3136 | struct get_nvm_data_resp *pPayload = | 3135 | struct get_nvm_data_resp *pPayload = |
3137 | (struct get_nvm_data_resp *)(piomb + 4); | 3136 | (struct get_nvm_data_resp *)(piomb + 4); |
3138 | u32 tag = le32_to_cpu(pPayload->tag); | 3137 | u32 tag = le32_to_cpu(pPayload->tag); |
@@ -3141,7 +3140,6 @@ pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb) | |||
3141 | u32 ir_tds_bn_dps_das_nvm = | 3140 | u32 ir_tds_bn_dps_das_nvm = |
3142 | le32_to_cpu(pPayload->ir_tda_bn_dps_das_nvm); | 3141 | le32_to_cpu(pPayload->ir_tda_bn_dps_das_nvm); |
3143 | void *virt_addr = pm8001_ha->memoryMap.region[NVMD].virt_ptr; | 3142 | void *virt_addr = pm8001_ha->memoryMap.region[NVMD].virt_ptr; |
3144 | fw_control_context = ccb->fw_control_context; | ||
3145 | 3143 | ||
3146 | PM8001_MSG_DBG(pm8001_ha, pm8001_printk("Get nvm data complete!\n")); | 3144 | PM8001_MSG_DBG(pm8001_ha, pm8001_printk("Get nvm data complete!\n")); |
3147 | if ((dlen_status & NVMD_STAT) != 0) { | 3145 | if ((dlen_status & NVMD_STAT) != 0) { |
@@ -3182,13 +3180,11 @@ pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb) | |||
3182 | pm8001_printk("Get NVMD success, IR=0, dataLen=%d\n", | 3180 | pm8001_printk("Get NVMD success, IR=0, dataLen=%d\n", |
3183 | (dlen_status & NVMD_LEN) >> 24)); | 3181 | (dlen_status & NVMD_LEN) >> 24)); |
3184 | } | 3182 | } |
3185 | memcpy(fw_control_context->usrAddr, | 3183 | kfree(ccb->fw_control_context); |
3186 | pm8001_ha->memoryMap.region[NVMD].virt_ptr, | ||
3187 | fw_control_context->len); | ||
3188 | complete(pm8001_ha->nvmd_completion); | ||
3189 | ccb->task = NULL; | 3184 | ccb->task = NULL; |
3190 | ccb->ccb_tag = 0xFFFFFFFF; | 3185 | ccb->ccb_tag = 0xFFFFFFFF; |
3191 | pm8001_tag_free(pm8001_ha, tag); | 3186 | pm8001_tag_free(pm8001_ha, tag); |
3187 | complete(pm8001_ha->nvmd_completion); | ||
3192 | } | 3188 | } |
3193 | 3189 | ||
3194 | int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb) | 3190 | int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb) |