diff options
Diffstat (limited to 'block/blk-merge.c')
-rw-r--r-- | block/blk-merge.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c index 89b97b5e0881..9476b1528ded 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
@@ -385,6 +385,14 @@ static bool req_no_special_merge(struct request *req) | |||
385 | return !q->mq_ops && req->special; | 385 | return !q->mq_ops && req->special; |
386 | } | 386 | } |
387 | 387 | ||
388 | static int req_gap_to_prev(struct request *req, struct request *next) | ||
389 | { | ||
390 | struct bio *prev = req->biotail; | ||
391 | |||
392 | return bvec_gap_to_prev(&prev->bi_io_vec[prev->bi_vcnt - 1], | ||
393 | next->bio->bi_io_vec[0].bv_offset); | ||
394 | } | ||
395 | |||
388 | static int ll_merge_requests_fn(struct request_queue *q, struct request *req, | 396 | static int ll_merge_requests_fn(struct request_queue *q, struct request *req, |
389 | struct request *next) | 397 | struct request *next) |
390 | { | 398 | { |
@@ -399,6 +407,10 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req, | |||
399 | if (req_no_special_merge(req) || req_no_special_merge(next)) | 407 | if (req_no_special_merge(req) || req_no_special_merge(next)) |
400 | return 0; | 408 | return 0; |
401 | 409 | ||
410 | if (test_bit(QUEUE_FLAG_SG_GAPS, &q->queue_flags) && | ||
411 | req_gap_to_prev(req, next)) | ||
412 | return 0; | ||
413 | |||
402 | /* | 414 | /* |
403 | * Will it become too large? | 415 | * Will it become too large? |
404 | */ | 416 | */ |