|
|
@@ -438,6 +438,8 @@ no_merge:
|
|
|
int ll_back_merge_fn(struct request_queue *q, struct request *req,
|
|
|
struct bio *bio)
|
|
|
{
|
|
|
+ if (req_gap_back_merge(req, bio))
|
|
|
+ return 0;
|
|
|
if (blk_rq_sectors(req) + bio_sectors(bio) >
|
|
|
blk_rq_get_max_sectors(req)) {
|
|
|
req->cmd_flags |= REQ_NOMERGE;
|
|
|
@@ -456,6 +458,9 @@ int ll_back_merge_fn(struct request_queue *q, struct request *req,
|
|
|
int ll_front_merge_fn(struct request_queue *q, struct request *req,
|
|
|
struct bio *bio)
|
|
|
{
|
|
|
+
|
|
|
+ if (req_gap_front_merge(req, bio))
|
|
|
+ return 0;
|
|
|
if (blk_rq_sectors(req) + bio_sectors(bio) >
|
|
|
blk_rq_get_max_sectors(req)) {
|
|
|
req->cmd_flags |= REQ_NOMERGE;
|
|
|
@@ -482,14 +487,6 @@ 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 bio *next)
|
|
|
-{
|
|
|
- struct bio *prev = req->biotail;
|
|
|
-
|
|
|
- return bvec_gap_to_prev(req->q, &prev->bi_io_vec[prev->bi_vcnt - 1],
|
|
|
- next->bi_io_vec[0].bv_offset);
|
|
|
-}
|
|
|
-
|
|
|
static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
|
|
|
struct request *next)
|
|
|
{
|
|
|
@@ -504,7 +501,7 @@ 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 (req_gap_to_prev(req, next->bio))
|
|
|
+ if (req_gap_back_merge(req, next->bio))
|
|
|
return 0;
|
|
|
|
|
|
/*
|
|
|
@@ -712,10 +709,6 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
|
|
|
!blk_write_same_mergeable(rq->bio, bio))
|
|
|
return false;
|
|
|
|
|
|
- /* Only check gaps if the bio carries data */
|
|
|
- if (bio_has_data(bio) && req_gap_to_prev(rq, bio))
|
|
|
- return false;
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
|