Input: edt-ft5x06 - no need to check return value of debugfs_create functions
[platform/kernel/linux-rpi.git] / block / blk-mq-sched.c
index 2766066..c9d183d 100644 (file)
@@ -224,7 +224,7 @@ void blk_mq_sched_dispatch_requests(struct blk_mq_hw_ctx *hctx)
 }
 
 bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio,
-                           struct request **merged_request)
+               unsigned int nr_segs, struct request **merged_request)
 {
        struct request *rq;
 
@@ -232,7 +232,7 @@ bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio,
        case ELEVATOR_BACK_MERGE:
                if (!blk_mq_sched_allow_merge(q, rq, bio))
                        return false;
-               if (!bio_attempt_back_merge(q, rq, bio))
+               if (!bio_attempt_back_merge(rq, bio, nr_segs))
                        return false;
                *merged_request = attempt_back_merge(q, rq);
                if (!*merged_request)
@@ -241,7 +241,7 @@ bool blk_mq_sched_try_merge(struct request_queue *q, struct bio *bio,
        case ELEVATOR_FRONT_MERGE:
                if (!blk_mq_sched_allow_merge(q, rq, bio))
                        return false;
-               if (!bio_attempt_front_merge(q, rq, bio))
+               if (!bio_attempt_front_merge(rq, bio, nr_segs))
                        return false;
                *merged_request = attempt_front_merge(q, rq);
                if (!*merged_request)
@@ -260,7 +260,7 @@ EXPORT_SYMBOL_GPL(blk_mq_sched_try_merge);
  * of them.
  */
 bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list,
-                          struct bio *bio)
+                          struct bio *bio, unsigned int nr_segs)
 {
        struct request *rq;
        int checked = 8;
@@ -277,11 +277,13 @@ bool blk_mq_bio_list_merge(struct request_queue *q, struct list_head *list,
                switch (blk_try_merge(rq, bio)) {
                case ELEVATOR_BACK_MERGE:
                        if (blk_mq_sched_allow_merge(q, rq, bio))
-                               merged = bio_attempt_back_merge(q, rq, bio);
+                               merged = bio_attempt_back_merge(rq, bio,
+                                               nr_segs);
                        break;
                case ELEVATOR_FRONT_MERGE:
                        if (blk_mq_sched_allow_merge(q, rq, bio))
-                               merged = bio_attempt_front_merge(q, rq, bio);
+                               merged = bio_attempt_front_merge(rq, bio,
+                                               nr_segs);
                        break;
                case ELEVATOR_DISCARD_MERGE:
                        merged = bio_attempt_discard_merge(q, rq, bio);
@@ -304,13 +306,14 @@ EXPORT_SYMBOL_GPL(blk_mq_bio_list_merge);
  */
 static bool blk_mq_attempt_merge(struct request_queue *q,
                                 struct blk_mq_hw_ctx *hctx,
-                                struct blk_mq_ctx *ctx, struct bio *bio)
+                                struct blk_mq_ctx *ctx, struct bio *bio,
+                                unsigned int nr_segs)
 {
        enum hctx_type type = hctx->type;
 
        lockdep_assert_held(&ctx->lock);
 
-       if (blk_mq_bio_list_merge(q, &ctx->rq_lists[type], bio)) {
+       if (blk_mq_bio_list_merge(q, &ctx->rq_lists[type], bio, nr_segs)) {
                ctx->rq_merged++;
                return true;
        }
@@ -318,7 +321,8 @@ static bool blk_mq_attempt_merge(struct request_queue *q,
        return false;
 }
 
-bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio)
+bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio,
+               unsigned int nr_segs)
 {
        struct elevator_queue *e = q->elevator;
        struct blk_mq_ctx *ctx = blk_mq_get_ctx(q);
@@ -326,21 +330,18 @@ bool __blk_mq_sched_bio_merge(struct request_queue *q, struct bio *bio)
        bool ret = false;
        enum hctx_type type;
 
-       if (e && e->type->ops.bio_merge) {
-               blk_mq_put_ctx(ctx);
-               return e->type->ops.bio_merge(hctx, bio);
-       }
+       if (e && e->type->ops.bio_merge)
+               return e->type->ops.bio_merge(hctx, bio, nr_segs);
 
        type = hctx->type;
        if ((hctx->flags & BLK_MQ_F_SHOULD_MERGE) &&
                        !list_empty_careful(&ctx->rq_lists[type])) {
                /* default per sw-queue merge */
                spin_lock(&ctx->lock);
-               ret = blk_mq_attempt_merge(q, hctx, ctx, bio);
+               ret = blk_mq_attempt_merge(q, hctx, ctx, bio, nr_segs);
                spin_unlock(&ctx->lock);
        }
 
-       blk_mq_put_ctx(ctx);
        return ret;
 }