Merge branch 'akpm' (fixes from Andrew)
[linux-drm-fsl-dcu.git] / block / blk-exec.c
index ae4f27d7944e9a662ddbb51464bd18e10f4707a4..c3edf9dff566f47883f3fac946b72e1e208c5286 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/module.h>
 #include <linux/bio.h>
 #include <linux/blkdev.h>
+#include <linux/blk-mq.h>
 #include <linux/sched/sysctl.h>
 
 #include "blk.h"
@@ -24,7 +25,6 @@ static void blk_end_sync_rq(struct request *rq, int error)
        struct completion *waiting = rq->end_io_data;
 
        rq->end_io_data = NULL;
-       __blk_put_request(rq->q, rq);
 
        /*
         * complete last, if this is a stack request the process (and thus
@@ -59,6 +59,12 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk,
 
        rq->rq_disk = bd_disk;
        rq->end_io = done;
+
+       if (q->mq_ops) {
+               blk_mq_insert_request(q, rq, true);
+               return;
+       }
+
        /*
         * need to check this before __blk_run_queue(), because rq can
         * be freed before that returns.
@@ -103,12 +109,6 @@ int blk_execute_rq(struct request_queue *q, struct gendisk *bd_disk,
        int err = 0;
        unsigned long hang_check;
 
-       /*
-        * we need an extra reference to the request, so we can look at
-        * it after io completion
-        */
-       rq->ref_count++;
-
        if (!rq->sense) {
                memset(sense, 0, sizeof(sense));
                rq->sense = sense;