* be drained.  Check all the queues and counters.
                 */
                if (drain_all) {
-                       struct blk_flush_queue *fq = blk_get_flush_queue(q);
+                       struct blk_flush_queue *fq = blk_get_flush_queue(q, NULL);
                        drain |= !list_empty(&q->queue_head);
                        for (i = 0; i < 2; i++) {
                                drain |= q->nr_rqs[i];
 
        bool queued = false;
        struct request *rq, *n;
        unsigned long flags = 0;
-       struct blk_flush_queue *fq = blk_get_flush_queue(q);
+       struct blk_flush_queue *fq = blk_get_flush_queue(q, flush_rq->mq_ctx);
 
        if (q->mq_ops) {
                spin_lock_irqsave(&fq->mq_flush_lock, flags);
 static void flush_data_end_io(struct request *rq, int error)
 {
        struct request_queue *q = rq->q;
-       struct blk_flush_queue *fq = blk_get_flush_queue(q);
+       struct blk_flush_queue *fq = blk_get_flush_queue(q, NULL);
 
        /*
         * After populating an empty queue, kick it to avoid stall.  Read
 {
        struct request_queue *q = rq->q;
        struct blk_mq_hw_ctx *hctx;
-       struct blk_mq_ctx *ctx;
+       struct blk_mq_ctx *ctx = rq->mq_ctx;
        unsigned long flags;
-       struct blk_flush_queue *fq = blk_get_flush_queue(q);
+       struct blk_flush_queue *fq = blk_get_flush_queue(q, ctx);
 
-       ctx = rq->mq_ctx;
        hctx = q->mq_ops->map_queue(q, ctx->cpu);
 
        /*
        struct request_queue *q = rq->q;
        unsigned int fflags = q->flush_flags;   /* may change, cache */
        unsigned int policy = blk_flush_policy(fflags, rq);
-       struct blk_flush_queue *fq = blk_get_flush_queue(q);
+       struct blk_flush_queue *fq = blk_get_flush_queue(q, rq->mq_ctx);
 
        /*
         * @policy now records what operations need to be done.  Adjust
 
 struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag)
 {
        struct request *rq = tags->rqs[tag];
-       struct blk_flush_queue *fq = blk_get_flush_queue(rq->q);
+       /* mq_ctx of flush rq is always cloned from the corresponding req */
+       struct blk_flush_queue *fq = blk_get_flush_queue(rq->q, rq->mq_ctx);
 
        if (!is_flush_request(rq, fq, tag))
                return rq;
 
 extern struct ida blk_queue_ida;
 
 static inline struct blk_flush_queue *blk_get_flush_queue(
-               struct request_queue *q)
+               struct request_queue *q, struct blk_mq_ctx *ctx)
 {
        return q->fq;
 }
 static inline struct request *__elv_next_request(struct request_queue *q)
 {
        struct request *rq;
-       struct blk_flush_queue *fq = blk_get_flush_queue(q);
+       struct blk_flush_queue *fq = blk_get_flush_queue(q, NULL);
 
        while (1) {
                if (!list_empty(&q->queue_head)) {