提交 b0066312 编写于 作者: A Alexey Khoroshilov 提交者: Ulf Hansson

mmc: mmc_spi: add checks for dma mapping error

There is no checks for dma mapping errors in mmc_spi.
Tha patch fixes that and by the way it adds dma_unmap_single(ones_dma)
that was left on a failure path mmc_spi_probe().

Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: NAlexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: NUlf Hansson <ulf.hansson@linaro.org>
上级 2df9d58f
...@@ -925,6 +925,10 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd, ...@@ -925,6 +925,10 @@ mmc_spi_data_do(struct mmc_spi_host *host, struct mmc_command *cmd,
dma_addr = dma_map_page(dma_dev, sg_page(sg), 0, dma_addr = dma_map_page(dma_dev, sg_page(sg), 0,
PAGE_SIZE, dir); PAGE_SIZE, dir);
if (dma_mapping_error(dma_dev, dma_addr)) {
data->error = -EFAULT;
break;
}
if (direction == DMA_TO_DEVICE) if (direction == DMA_TO_DEVICE)
t->tx_dma = dma_addr + sg->offset; t->tx_dma = dma_addr + sg->offset;
else else
...@@ -1393,10 +1397,12 @@ static int mmc_spi_probe(struct spi_device *spi) ...@@ -1393,10 +1397,12 @@ static int mmc_spi_probe(struct spi_device *spi)
host->dma_dev = dev; host->dma_dev = dev;
host->ones_dma = dma_map_single(dev, ones, host->ones_dma = dma_map_single(dev, ones,
MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE); MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE);
if (dma_mapping_error(dev, host->ones_dma))
goto fail_ones_dma;
host->data_dma = dma_map_single(dev, host->data, host->data_dma = dma_map_single(dev, host->data,
sizeof(*host->data), DMA_BIDIRECTIONAL); sizeof(*host->data), DMA_BIDIRECTIONAL);
if (dma_mapping_error(dev, host->data_dma))
/* REVISIT in theory those map operations can fail... */ goto fail_data_dma;
dma_sync_single_for_cpu(host->dma_dev, dma_sync_single_for_cpu(host->dma_dev,
host->data_dma, sizeof(*host->data), host->data_dma, sizeof(*host->data),
...@@ -1462,6 +1468,11 @@ static int mmc_spi_probe(struct spi_device *spi) ...@@ -1462,6 +1468,11 @@ static int mmc_spi_probe(struct spi_device *spi)
if (host->dma_dev) if (host->dma_dev)
dma_unmap_single(host->dma_dev, host->data_dma, dma_unmap_single(host->dma_dev, host->data_dma,
sizeof(*host->data), DMA_BIDIRECTIONAL); sizeof(*host->data), DMA_BIDIRECTIONAL);
fail_data_dma:
if (host->dma_dev)
dma_unmap_single(host->dma_dev, host->ones_dma,
MMC_SPI_BLOCKSIZE, DMA_TO_DEVICE);
fail_ones_dma:
kfree(host->data); kfree(host->data);
fail_nobuf1: fail_nobuf1:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册