|
@@ -275,14 +275,8 @@ no_merge:
|
|
|
int ll_back_merge_fn(struct request_queue *q, struct request *req,
|
|
|
struct bio *bio)
|
|
|
{
|
|
|
- unsigned short max_sectors;
|
|
|
-
|
|
|
- if (unlikely(req->cmd_type == REQ_TYPE_BLOCK_PC))
|
|
|
- max_sectors = queue_max_hw_sectors(q);
|
|
|
- else
|
|
|
- max_sectors = queue_max_sectors(q);
|
|
|
-
|
|
|
- if (blk_rq_sectors(req) + bio_sectors(bio) > max_sectors) {
|
|
|
+ if (blk_rq_sectors(req) + bio_sectors(bio) >
|
|
|
+ blk_rq_get_max_sectors(req)) {
|
|
|
req->cmd_flags |= REQ_NOMERGE;
|
|
|
if (req == q->last_merge)
|
|
|
q->last_merge = NULL;
|
|
@@ -299,15 +293,8 @@ 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)
|
|
|
{
|
|
|
- unsigned short max_sectors;
|
|
|
-
|
|
|
- if (unlikely(req->cmd_type == REQ_TYPE_BLOCK_PC))
|
|
|
- max_sectors = queue_max_hw_sectors(q);
|
|
|
- else
|
|
|
- max_sectors = queue_max_sectors(q);
|
|
|
-
|
|
|
-
|
|
|
- if (blk_rq_sectors(req) + bio_sectors(bio) > max_sectors) {
|
|
|
+ if (blk_rq_sectors(req) + bio_sectors(bio) >
|
|
|
+ blk_rq_get_max_sectors(req)) {
|
|
|
req->cmd_flags |= REQ_NOMERGE;
|
|
|
if (req == q->last_merge)
|
|
|
q->last_merge = NULL;
|
|
@@ -338,7 +325,8 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
|
|
|
/*
|
|
|
* Will it become too large?
|
|
|
*/
|
|
|
- if ((blk_rq_sectors(req) + blk_rq_sectors(next)) > queue_max_sectors(q))
|
|
|
+ if ((blk_rq_sectors(req) + blk_rq_sectors(next)) >
|
|
|
+ blk_rq_get_max_sectors(req))
|
|
|
return 0;
|
|
|
|
|
|
total_phys_segments = req->nr_phys_segments + next->nr_phys_segments;
|
|
@@ -417,6 +405,9 @@ static int attempt_merge(struct request_queue *q, struct request *req,
|
|
|
if (!rq_mergeable(req) || !rq_mergeable(next))
|
|
|
return 0;
|
|
|
|
|
|
+ if (!blk_check_merge_flags(req->cmd_flags, next->cmd_flags))
|
|
|
+ return 0;
|
|
|
+
|
|
|
/*
|
|
|
* not contiguous
|
|
|
*/
|
|
@@ -512,6 +503,9 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
|
|
|
if (!rq_mergeable(rq) || !bio_mergeable(bio))
|
|
|
return false;
|
|
|
|
|
|
+ if (!blk_check_merge_flags(rq->cmd_flags, bio->bi_rw))
|
|
|
+ return false;
|
|
|
+
|
|
|
/* different data direction or already started, don't merge */
|
|
|
if (bio_data_dir(bio) != rq_data_dir(rq))
|
|
|
return false;
|