scsi: qla2xxx: Make qla2x00_mem_free() easier to verify
authorBart Van Assche <bvanassche@acm.org>
Wed, 17 Apr 2019 21:44:22 +0000 (14:44 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 29 Apr 2019 21:24:49 +0000 (17:24 -0400)
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: Bart Van Assche <bvanassche@acm.org>
Acked-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/qla2xxx/qla_target.c

index 5cfdf0cc38466ff496dc238f56dabe3a2bb95aaa..b90eed1c989e080d59232eb1a6405ba73b57b682 100644 (file)
@@ -4680,28 +4680,37 @@ qla2x00_mem_free(struct qla_hw_data *ha)
        if (ha->mctp_dump)
                dma_free_coherent(&ha->pdev->dev, MCTP_DUMP_SIZE, ha->mctp_dump,
                    ha->mctp_dump_dma);
+       ha->mctp_dump = NULL;
 
        mempool_destroy(ha->srb_mempool);
+       ha->srb_mempool = NULL;
 
        if (ha->dcbx_tlv)
                dma_free_coherent(&ha->pdev->dev, DCBX_TLV_DATA_SIZE,
                    ha->dcbx_tlv, ha->dcbx_tlv_dma);
+       ha->dcbx_tlv = NULL;
 
        if (ha->xgmac_data)
                dma_free_coherent(&ha->pdev->dev, XGMAC_DATA_SIZE,
                    ha->xgmac_data, ha->xgmac_data_dma);
+       ha->xgmac_data = NULL;
 
        if (ha->sns_cmd)
                dma_free_coherent(&ha->pdev->dev, sizeof(struct sns_cmd_pkt),
                ha->sns_cmd, ha->sns_cmd_dma);
+       ha->sns_cmd = NULL;
+       ha->sns_cmd_dma = 0;
 
        if (ha->ct_sns)
                dma_free_coherent(&ha->pdev->dev, sizeof(struct ct_sns_pkt),
                ha->ct_sns, ha->ct_sns_dma);
+       ha->ct_sns = NULL;
+       ha->ct_sns_dma = 0;
 
        if (ha->sfp_data)
                dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE, ha->sfp_data,
                    ha->sfp_data_dma);
+       ha->sfp_data = NULL;
 
        if (ha->flt)
                dma_free_coherent(&ha->pdev->dev, SFP_DEV_SIZE,
@@ -4709,19 +4718,28 @@ qla2x00_mem_free(struct qla_hw_data *ha)
 
        if (ha->ms_iocb)
                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)
                dma_pool_free(ha->s_dma_pool,
                        ha->ex_init_cb, ha->ex_init_cb_dma);
+       ha->ex_init_cb = NULL;
+       ha->ex_init_cb_dma = 0;
 
        if (ha->async_pd)
                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);
+       ha->s_dma_pool = NULL;
 
        if (ha->gid_list)
                dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
                ha->gid_list, ha->gid_list_dma);
+       ha->gid_list = NULL;
+       ha->gid_list_dma = 0;
 
        if (IS_QLA82XX(ha)) {
                if (!list_empty(&ha->gbl_dsd_list)) {
@@ -4739,10 +4757,13 @@ qla2x00_mem_free(struct qla_hw_data *ha)
        }
 
        dma_pool_destroy(ha->dl_dma_pool);
+       ha->dl_dma_pool = NULL;
 
        dma_pool_destroy(ha->fcp_cmnd_dma_pool);
+       ha->fcp_cmnd_dma_pool = NULL;
 
        mempool_destroy(ha->ctx_mempool);
+       ha->ctx_mempool = NULL;
 
        if (ql2xenabledif) {
                struct dsd_dma *dsd, *nxt;
@@ -4775,47 +4796,19 @@ qla2x00_mem_free(struct qla_hw_data *ha)
        if (ha->init_cb)
                dma_free_coherent(&ha->pdev->dev, ha->init_cb_size,
                        ha->init_cb, ha->init_cb_dma);
+       ha->init_cb = NULL;
+       ha->init_cb_dma = 0;
 
        vfree(ha->optrom_buffer);
+       ha->optrom_buffer = NULL;
        kfree(ha->nvram);
+       ha->nvram = NULL;
        kfree(ha->npiv_info);
+       ha->npiv_info = NULL;
        kfree(ha->swl);
+       ha->swl = NULL;
        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->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,
index bb16280a8d72c56c54f5c602775c91e03e77d878..bf5b800e5326dcb3b5fa9113dd48699894b02b1c 100644 (file)
@@ -7347,7 +7347,10 @@ qlt_mem_free(struct qla_hw_data *ha)
                    sizeof(struct atio_from_isp), ha->tgt.atio_ring,
                    ha->tgt.atio_dma);
        }
+       ha->tgt.atio_ring = NULL;
+       ha->tgt.atio_dma = 0;
        kfree(ha->tgt.tgt_vp_map);
+       ha->tgt.tgt_vp_map = NULL;
 }
 
 /* vport_slock to be held by the caller */