Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 854fbb9c authored by Keith Busch's avatar Keith Busch Committed by Jens Axboe
Browse files

block: prevent request-to-request merging with gaps if not allowed



If the queue has SG_GAPS set, we must not merge across an sg gap.
This is caught for the bio case, but currently not for the
more rare case of merging two requests directly.

Signed-off-by: default avatarKeith Busch <keith.busch@intel.com>

Cut the dm bits, those will go through the dm tree, and fixed
the test_bit() test.

Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 201f201c
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -385,6 +385,14 @@ static bool req_no_special_merge(struct request *req)
	return !q->mq_ops && req->special;
}

static int req_gap_to_prev(struct request *req, struct request *next)
{
	struct bio *prev = req->biotail;

	return bvec_gap_to_prev(&prev->bi_io_vec[prev->bi_vcnt - 1],
				next->bio->bi_io_vec[0].bv_offset);
}

static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
				struct request *next)
{
@@ -399,6 +407,10 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
	if (req_no_special_merge(req) || req_no_special_merge(next))
		return 0;

	if (test_bit(QUEUE_FLAG_SG_GAPS, &q->queue_flags) &&
	    req_gap_to_prev(req, next))
		return 0;

	/*
	 * Will it become too large?
	 */