diff options
author | Adrian Hunter <adrian.hunter@intel.com> | 2017-09-07 03:40:35 -0400 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2017-09-08 09:37:51 -0400 |
commit | 01f5bbd17a8066b58dba9b5049fad504bce67322 (patch) | |
tree | d710d106f349d26790cfa5ea45ad9af0acb155e0 /drivers/mmc/core/queue.c | |
parent | c16a854e4463078aedad601fac76341760a66dd1 (diff) |
mmc: block: Fix incorrectly initialized requests
mmc_init_request() depends on card->bouncesz so it must be calculated
before blk_init_allocated_queue() starts allocating requests.
Reported-by: Seraphime Kirkovski <kirkseraph@gmail.com>
Fixes: 304419d8a7e9 ("mmc: core: Allocate per-request data using the..")
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Tested-by: Seraphime Kirkovski <kirkseraph@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Tested-by: Pavel Machek <pavel@ucw.cz>
Diffstat (limited to 'drivers/mmc/core/queue.c')
-rw-r--r-- | drivers/mmc/core/queue.c | 7 |
1 files changed, 6 insertions, 1 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); |