40 lines
1.4 KiB
Diff
40 lines
1.4 KiB
Diff
From: Junichi Nomura <j-nomura@ce.jp.nec.com>
|
|
Date: Tue, 22 Dec 2015 10:23:44 -0700
|
|
Subject: block: ensure to split after potentially bouncing a bio
|
|
Origin: https://git.kernel.org/linus/23688bf4f830a89866fd0ed3501e342a7360fe4f
|
|
Bug-Debian: https://bugs.debian.org/809082
|
|
|
|
blk_queue_bio() does split then bounce, which makes the segment
|
|
counting based on pages before bouncing and could go wrong. Move
|
|
the split to after bouncing, like we do for blk-mq, and the we
|
|
fix the issue of having the bio count for segments be wrong.
|
|
|
|
Fixes: 54efd50bfd87 ("block: make generic_make_request handle arbitrarily sized bios")
|
|
Cc: stable@vger.kernel.org
|
|
Tested-by: Artem S. Tashkinov <t.artem@lycos.com>
|
|
Signed-off-by: Jens Axboe <axboe@fb.com>
|
|
---
|
|
block/blk-core.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
--- a/block/blk-core.c
|
|
+++ b/block/blk-core.c
|
|
@@ -1616,8 +1616,6 @@ static void blk_queue_bio(struct request
|
|
struct request *req;
|
|
unsigned int request_count = 0;
|
|
|
|
- blk_queue_split(q, &bio, q->bio_split);
|
|
-
|
|
/*
|
|
* low level driver can indicate that it wants pages above a
|
|
* certain limit bounced to low memory (ie for highmem, or even
|
|
@@ -1625,6 +1623,8 @@ static void blk_queue_bio(struct request
|
|
*/
|
|
blk_queue_bounce(q, &bio);
|
|
|
|
+ blk_queue_split(q, &bio, q->bio_split);
|
|
+
|
|
if (bio_integrity_enabled(bio) && bio_integrity_prep(bio)) {
|
|
bio->bi_error = -EIO;
|
|
bio_endio(bio);
|