Commit 5365bf99 authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: qla2xxx: Make qla2x00_mem_free() easier to verify

Instead of clearing all freed pointers at the end of qla2x00_mem_free(),
clear freed pointers immediately after having freed the memory these
pointers point at.

Cc: Himanshu Madhani <hmadhani@marvell.com>
Cc: Giridhar Malavali <gmalavali@marvell.com>
Signed-off-by: default avatarBart Van Assche <bvanassche@acm.org>
Acked-by: default avatarHimanshu Madhani <hmadhani@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 0a59cea4
...@@ -4680,28 +4680,37 @@ qla2x00_mem_free(struct qla_hw_data *ha) ...@@ -4680,28 +4680,37 @@ qla2x00_mem_free(struct qla_hw_data *ha)
if (ha->mctp_dump) if (ha->mctp_dump)
dma_free_coherent(&ha->pdev->dev, MCTP_DUMP_SIZE, ha->mctp_dump, dma_free_coherent(&ha->pdev->dev, MCTP_DUMP_SIZE, ha->mctp_dump,
ha->mctp_dump_dma); ha->mctp_dump_dma);
ha->mctp_dump = NULL;
mempool_destroy(ha->srb_mempool); mempool_destroy(ha->srb_mempool);
ha->srb_mempool = NULL;
if (ha->dcbx_tlv) if (ha->dcbx_tlv)
dma_free_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE, dma_free_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE,
ha->dcbx_tlv, ha->dcbx_tlv_dma); ha->dcbx_tlv, ha->dcbx_tlv_dma);
ha->dcbx_tlv = NULL;
if (ha->xgmac_data) if (ha->xgmac_data)
dma_free_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE, dma_free_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE,
ha->xgmac_data, ha->xgmac_data_dma); ha->xgmac_data, ha->xgmac_data_dma);
ha->xgmac_data = NULL;
if (ha->sns_cmd) if (ha->sns_cmd)
dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt), dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt),
ha->sns_cmd, ha->sns_cmd_dma); ha->sns_cmd, ha->sns_cmd_dma);
ha->sns_cmd = NULL;
ha->sns_cmd_dma = 0;
if (ha->ct_sns) if (ha->ct_sns)
dma_free_coherent(&ha->pdev->dev, sizeof(struct ct_sns_pkt), dma_free_coherent(&ha->pdev->dev, sizeof(struct ct_sns_pkt),
ha->ct_sns, ha->ct_sns_dma); ha->ct_sns, ha->ct_sns_dma);
ha->ct_sns = NULL;
ha->ct_sns_dma = 0;
if (ha->sfp_data) if (ha->sfp_data)
dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, ha->sfp_data, dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, ha->sfp_data,
ha->sfp_data_dma); ha->sfp_data_dma);
ha->sfp_data = NULL;
if (ha->flt) if (ha->flt)
dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE,
...@@ -4709,19 +4718,28 @@ qla2x00_mem_free(struct qla_hw_data *ha) ...@@ -4709,19 +4718,28 @@ qla2x00_mem_free(struct qla_hw_data *ha)
if (ha->ms_iocb) if (ha->ms_iocb)
dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma); dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma);
ha->ms_iocb = NULL;
ha->ms_iocb_dma = 0;
if (ha->ex_init_cb) if (ha->ex_init_cb)
dma_pool_free(ha->s_dma_pool, dma_pool_free(ha->s_dma_pool,
ha->ex_init_cb, ha->ex_init_cb_dma); ha->ex_init_cb, ha->ex_init_cb_dma);
ha->ex_init_cb = NULL;
ha->ex_init_cb_dma = 0;
if (ha->async_pd) if (ha->async_pd)
dma_pool_free(ha->s_dma_pool, ha->async_pd, ha->async_pd_dma); dma_pool_free(ha->s_dma_pool, ha->async_pd, ha->async_pd_dma);
ha->async_pd = NULL;
ha->async_pd_dma = 0;
dma_pool_destroy(ha->s_dma_pool); dma_pool_destroy(ha->s_dma_pool);
ha->s_dma_pool = NULL;
if (ha->gid_list) if (ha->gid_list)
dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha), dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
ha->gid_list, ha->gid_list_dma); ha->gid_list, ha->gid_list_dma);
ha->gid_list = NULL;
ha->gid_list_dma = 0;
if (IS_QLA82XX(ha)) { if (IS_QLA82XX(ha)) {
if (!list_empty(&ha->gbl_dsd_list)) { if (!list_empty(&ha->gbl_dsd_list)) {
...@@ -4739,10 +4757,13 @@ qla2x00_mem_free(struct qla_hw_data *ha) ...@@ -4739,10 +4757,13 @@ qla2x00_mem_free(struct qla_hw_data *ha)
} }
dma_pool_destroy(ha->dl_dma_pool); dma_pool_destroy(ha->dl_dma_pool);
ha->dl_dma_pool = NULL;
dma_pool_destroy(ha->fcp_cmnd_dma_pool); dma_pool_destroy(ha->fcp_cmnd_dma_pool);
ha->fcp_cmnd_dma_pool = NULL;
mempool_destroy(ha->ctx_mempool); mempool_destroy(ha->ctx_mempool);
ha->ctx_mempool = NULL;
if (ql2xenabledif) { if (ql2xenabledif) {
struct dsd_dma *dsd, *nxt; struct dsd_dma *dsd, *nxt;
...@@ -4775,47 +4796,19 @@ qla2x00_mem_free(struct qla_hw_data *ha) ...@@ -4775,47 +4796,19 @@ qla2x00_mem_free(struct qla_hw_data *ha)
if (ha->init_cb) if (ha->init_cb)
dma_free_coherent(&ha->pdev->dev, ha->init_cb_size, dma_free_coherent(&ha->pdev->dev, ha->init_cb_size,
ha->init_cb, ha->init_cb_dma); ha->init_cb, ha->init_cb_dma);
ha->init_cb = NULL;
ha->init_cb_dma = 0;
vfree(ha->optrom_buffer); vfree(ha->optrom_buffer);
ha->optrom_buffer = NULL;
kfree(ha->nvram); kfree(ha->nvram);
ha->nvram = NULL;
kfree(ha->npiv_info); kfree(ha->npiv_info);
ha->npiv_info = NULL;
kfree(ha->swl); kfree(ha->swl);
ha->swl = NULL;
kfree(ha->loop_id_map); kfree(ha->loop_id_map);
ha->srb_mempool = NULL;
ha->ctx_mempool = NULL;
ha->sns_cmd = NULL;
ha->sns_cmd_dma = 0;
ha->ct_sns = NULL;
ha->ct_sns_dma = 0;
ha->ms_iocb = NULL;
ha->ms_iocb_dma = 0;
ha->init_cb = NULL;
ha->init_cb_dma = 0;
ha->ex_init_cb = NULL;
ha->ex_init_cb_dma = 0;
ha->async_pd = NULL;
ha->async_pd_dma = 0;
ha->loop_id_map = NULL; ha->loop_id_map = NULL;
ha->npiv_info = NULL;
ha->optrom_buffer = NULL;
ha->swl = NULL;
ha->nvram = NULL;
ha->mctp_dump = NULL;
ha->dcbx_tlv = NULL;
ha->xgmac_data = NULL;
ha->sfp_data = NULL;
ha->s_dma_pool = NULL;
ha->dl_dma_pool = NULL;
ha->fcp_cmnd_dma_pool = NULL;
ha->gid_list = NULL;
ha->gid_list_dma = 0;
ha->tgt.atio_ring = NULL;
ha->tgt.atio_dma = 0;
ha->tgt.tgt_vp_map = NULL;
} }
struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht, struct scsi_qla_host *qla2x00_create_host(struct scsi_host_template *sht,
......
...@@ -7347,7 +7347,10 @@ qlt_mem_free(struct qla_hw_data *ha) ...@@ -7347,7 +7347,10 @@ qlt_mem_free(struct qla_hw_data *ha)
sizeof(struct atio_from_isp), ha->tgt.atio_ring, sizeof(struct atio_from_isp), ha->tgt.atio_ring,
ha->tgt.atio_dma); ha->tgt.atio_dma);
} }
ha->tgt.atio_ring = NULL;
ha->tgt.atio_dma = 0;
kfree(ha->tgt.tgt_vp_map); kfree(ha->tgt.tgt_vp_map);
ha->tgt.tgt_vp_map = NULL;
} }
/* vport_slock to be held by the caller */ /* vport_slock to be held by the caller */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment