]> Pileus Git - ~andy/linux/blobdiff - block/blk-core.c
block: fix q->flush_rq NULL pointer crash on dm-mpath flush
[~andy/linux] / block / blk-core.c
index c00e0bdeab4ab4724c42b379717200d405d9c584..4cd5ffc184427cc808808cdd9cb6acbc86b381d9 100644 (file)
@@ -708,6 +708,10 @@ blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn,
        if (!q)
                return NULL;
 
+       q->flush_rq = kzalloc(sizeof(struct request), GFP_KERNEL);
+       if (!q->flush_rq)
+               return NULL;
+
        if (blk_init_rl(&q->root_rl, q, GFP_KERNEL))
                return NULL;
 
@@ -1127,7 +1131,7 @@ static struct request *blk_old_get_request(struct request_queue *q, int rw,
 struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask)
 {
        if (q->mq_ops)
-               return blk_mq_alloc_request(q, rw, gfp_mask, false);
+               return blk_mq_alloc_request(q, rw, gfp_mask);
        else
                return blk_old_get_request(q, rw, gfp_mask);
 }
@@ -1278,6 +1282,11 @@ void __blk_put_request(struct request_queue *q, struct request *req)
        if (unlikely(!q))
                return;
 
+       if (q->mq_ops) {
+               blk_mq_free_request(req);
+               return;
+       }
+
        blk_pm_put_request(req);
 
        elv_completed_request(q, req);