diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-18 11:44:51 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-09-18 11:44:51 -0400 |
commit | ebb2c2437d8008d46796902ff390653822af6cc4 (patch) | |
tree | 652ca0006e8b56873acacea4a05e404bfb3d2612 | |
parent | 0666f560b71b899cd11a7caf39fd45129e9030fd (diff) | |
parent | b917c6d18c031cfce11ec35139033845f205b1d0 (diff) |
Merge tag 'mmc-v4.14-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
Pull MMC fixes from Ulf Hansson:
"MMC core:
- Fix trivial typo in Kconfig
- Fixup initialization of mmc block requests
MMC host:
- cavium: Fix use-after-free bug reported by KASAN"
* tag 'mmc-v4.14-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc:
mmc: cavium: Fix use-after-free in of_platform_device_destroy
mmc: host: fix typo after MMC_DEBUG move
mmc: block: Fix incorrectly initialized requests
-rw-r--r-- | drivers/mmc/core/queue.c | 7 | ||||
-rw-r--r-- | drivers/mmc/host/Kconfig | 2 | ||||
-rw-r--r-- | drivers/mmc/host/cavium-thunderx.c | 6 |
3 files changed, 12 insertions, 3 deletions
diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index affa7370ba82..74c663b1c0a7 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c | |||
@@ -242,6 +242,12 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, | |||
242 | if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask) | 242 | if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask) |
243 | limit = (u64)dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT; | 243 | limit = (u64)dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT; |
244 | 244 | ||
245 | /* | ||
246 | * mmc_init_request() depends on card->bouncesz so it must be calculated | ||
247 | * before blk_init_allocated_queue() starts allocating requests. | ||
248 | */ | ||
249 | card->bouncesz = mmc_queue_calc_bouncesz(host); | ||
250 | |||
245 | mq->card = card; | 251 | mq->card = card; |
246 | mq->queue = blk_alloc_queue(GFP_KERNEL); | 252 | mq->queue = blk_alloc_queue(GFP_KERNEL); |
247 | if (!mq->queue) | 253 | if (!mq->queue) |
@@ -265,7 +271,6 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, | |||
265 | if (mmc_can_erase(card)) | 271 | if (mmc_can_erase(card)) |
266 | mmc_queue_setup_discard(mq->queue, card); | 272 | mmc_queue_setup_discard(mq->queue, card); |
267 | 273 | ||
268 | card->bouncesz = mmc_queue_calc_bouncesz(host); | ||
269 | if (card->bouncesz) { | 274 | if (card->bouncesz) { |
270 | blk_queue_max_hw_sectors(mq->queue, card->bouncesz / 512); | 275 | blk_queue_max_hw_sectors(mq->queue, card->bouncesz / 512); |
271 | blk_queue_max_segments(mq->queue, card->bouncesz / 512); | 276 | blk_queue_max_segments(mq->queue, card->bouncesz / 512); |
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig index 02179ed2a40d..8c15637178ff 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig | |||
@@ -5,7 +5,7 @@ | |||
5 | comment "MMC/SD/SDIO Host Controller Drivers" | 5 | comment "MMC/SD/SDIO Host Controller Drivers" |
6 | 6 | ||
7 | config MMC_DEBUG | 7 | config MMC_DEBUG |
8 | bool "MMC host drivers debugginG" | 8 | bool "MMC host drivers debugging" |
9 | depends on MMC != n | 9 | depends on MMC != n |
10 | help | 10 | help |
11 | This is an option for use by developers; most people should | 11 | This is an option for use by developers; most people should |
diff --git a/drivers/mmc/host/cavium-thunderx.c b/drivers/mmc/host/cavium-thunderx.c index b9cc95998799..eee08d81b242 100644 --- a/drivers/mmc/host/cavium-thunderx.c +++ b/drivers/mmc/host/cavium-thunderx.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * | 7 | * |
8 | * Copyright (C) 2016 Cavium Inc. | 8 | * Copyright (C) 2016 Cavium Inc. |
9 | */ | 9 | */ |
10 | #include <linux/device.h> | ||
10 | #include <linux/dma-mapping.h> | 11 | #include <linux/dma-mapping.h> |
11 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
12 | #include <linux/mmc/mmc.h> | 13 | #include <linux/mmc/mmc.h> |
@@ -149,8 +150,11 @@ error: | |||
149 | for (i = 0; i < CAVIUM_MAX_MMC; i++) { | 150 | for (i = 0; i < CAVIUM_MAX_MMC; i++) { |
150 | if (host->slot[i]) | 151 | if (host->slot[i]) |
151 | cvm_mmc_of_slot_remove(host->slot[i]); | 152 | cvm_mmc_of_slot_remove(host->slot[i]); |
152 | if (host->slot_pdev[i]) | 153 | if (host->slot_pdev[i]) { |
154 | get_device(&host->slot_pdev[i]->dev); | ||
153 | of_platform_device_destroy(&host->slot_pdev[i]->dev, NULL); | 155 | of_platform_device_destroy(&host->slot_pdev[i]->dev, NULL); |
156 | put_device(&host->slot_pdev[i]->dev); | ||
157 | } | ||
154 | } | 158 | } |
155 | clk_disable_unprepare(host->clk); | 159 | clk_disable_unprepare(host->clk); |
156 | return ret; | 160 | return ret; |