From 36ff37c6ca7b2fb21079f4ce2353260ee3f7fa8b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20L=C3=BCtke-Stetzkamp?= Date: Wed, 4 Apr 2018 22:15:36 +0200 Subject: [PATCH] staging: mt7621-mmc: Fix bug on dma_alloc_coherent fail MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In case of dma_alloc_coherent failing the current code just called BUG_ON. By adding error handling for that case this can be avoided. This also fixes a memory leek in case of a fail later on in the probe function. Signed-off-by: Christian Lütke-Stetzkamp Reviewed-by: NeilBrown Signed-off-by: Greg Kroah-Hartman --- drivers/staging/mt7621-mmc/sd.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c index ab5d5c864c135..9e507cd2506f0 100644 --- a/drivers/staging/mt7621-mmc/sd.c +++ b/drivers/staging/mt7621-mmc/sd.c @@ -2787,7 +2787,10 @@ static int msdc_drv_probe(struct platform_device *pdev) /* using dma_alloc_coherent*/ /* todo: using 1, for all 4 slots */ host->dma.gpd = dma_alloc_coherent(NULL, MAX_GPD_NUM * sizeof(struct gpd), &host->dma.gpd_addr, GFP_KERNEL); host->dma.bd = dma_alloc_coherent(NULL, MAX_BD_NUM * sizeof(struct bd), &host->dma.bd_addr, GFP_KERNEL); - BUG_ON((!host->dma.gpd) || (!host->dma.bd)); + if (!host->dma.gpd || !host->dma.bd) { + ret = -ENOMEM; + goto release_mem; + } msdc_init_gpd_bd(host, &host->dma); /*for emmc*/ msdc_6575_host[pdev->id] = host; @@ -2855,6 +2858,13 @@ release: cancel_delayed_work_sync(&host->card_delaywork); #endif +release_mem: + if (host->dma.gpd) + dma_free_coherent(NULL, MAX_GPD_NUM * sizeof(struct gpd), + host->dma.gpd, host->dma.gpd_addr); + if (host->dma.bd) + dma_free_coherent(NULL, MAX_BD_NUM * sizeof(struct bd), + host->dma.bd, host->dma.bd_addr); host_free: mmc_free_host(mmc); -- 2.30.2