path: root/block
diff options
authorJunichi Nomura <>2015-12-22 10:23:44 -0700
committerJens Axboe <>2015-12-22 10:26:53 -0700
commit23688bf4f830a89866fd0ed3501e342a7360fe4f (patch)
tree39614e2d840c745b28d09adb14f3761082beb75b /block
parentb5875222de2fb91339db79a753677ba4f68120d0 (diff)
block: ensure to split after potentially bouncing a bio
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: Tested-by: Artem S. Tashkinov <> Signed-off-by: Jens Axboe <>
Diffstat (limited to 'block')
1 files changed, 2 insertions, 2 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 3636be469fa2..c487b94c59e3 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1689,8 +1689,6 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio)
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
@@ -1698,6 +1696,8 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio)
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;