These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / block / blk-flush.c
index 20badd7..9c423e5 100644 (file)
@@ -73,6 +73,7 @@
 
 #include "blk.h"
 #include "blk-mq.h"
+#include "blk-mq-tag.h"
 
 /* FLUSH/FUA sequences */
 enum {
@@ -226,7 +227,12 @@ static void flush_end_io(struct request *flush_rq, int error)
        struct blk_flush_queue *fq = blk_get_flush_queue(q, flush_rq->mq_ctx);
 
        if (q->mq_ops) {
+               struct blk_mq_hw_ctx *hctx;
+
+               /* release the tag's ownership to the req cloned from */
                spin_lock_irqsave(&fq->mq_flush_lock, flags);
+               hctx = q->mq_ops->map_queue(q, flush_rq->mq_ctx->cpu);
+               blk_mq_tag_set_rq(hctx, flush_rq->tag, fq->orig_rq);
                flush_rq->tag = -1;
        }
 
@@ -308,11 +314,18 @@ static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq)
 
        /*
         * Borrow tag from the first request since they can't
-        * be in flight at the same time.
+        * be in flight at the same time. And acquire the tag's
+        * ownership for flush req.
         */
        if (q->mq_ops) {
+               struct blk_mq_hw_ctx *hctx;
+
                flush_rq->mq_ctx = first_rq->mq_ctx;
                flush_rq->tag = first_rq->tag;
+               fq->orig_rq = first_rq;
+
+               hctx = q->mq_ops->map_queue(q, first_rq->mq_ctx->cpu);
+               blk_mq_tag_set_rq(hctx, first_rq->tag, flush_rq);
        }
 
        flush_rq->cmd_type = REQ_TYPE_FS;