blk-mq: don't lose flags passed in to blk_mq_alloc_request()
authorJens Axboe <axboe@fb.com>
Thu, 26 Jan 2017 19:22:11 +0000 (12:22 -0700)
committerJens Axboe <axboe@fb.com>
Thu, 26 Jan 2017 19:22:11 +0000 (12:22 -0700)
If we come in from blk_mq_alloc_requst() with NOWAIT set in flags,
we must ensure that we don't later overwrite that in
blk_mq_sched_get_request(). Initialize alloc_data->flags before
passing it in.

Reported-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq-sched.c
block/blk-mq.c

index d05061f..56b92db 100644 (file)
@@ -117,7 +117,7 @@ struct request *blk_mq_sched_get_request(struct request_queue *q,
        ctx = blk_mq_get_ctx(q);
        hctx = blk_mq_map_queue(q, ctx->cpu);
 
-       blk_mq_set_alloc_data(data, q, 0, ctx, hctx);
+       blk_mq_set_alloc_data(data, q, data->flags, ctx, hctx);
 
        if (e) {
                data->flags |= BLK_MQ_REQ_INTERNAL;
index dcb5676..84d13b5 100644 (file)
@@ -253,7 +253,7 @@ EXPORT_SYMBOL_GPL(__blk_mq_alloc_request);
 struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
                unsigned int flags)
 {
-       struct blk_mq_alloc_data alloc_data;
+       struct blk_mq_alloc_data alloc_data = { .flags = flags };
        struct request *rq;
        int ret;
 
@@ -1382,7 +1382,7 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)
 {
        const int is_sync = op_is_sync(bio->bi_opf);
        const int is_flush_fua = bio->bi_opf & (REQ_PREFLUSH | REQ_FUA);
-       struct blk_mq_alloc_data data;
+       struct blk_mq_alloc_data data = { .flags = 0 };
        struct request *rq;
        unsigned int request_count = 0, srcu_idx;
        struct blk_plug *plug;
@@ -1504,7 +1504,7 @@ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio)
        const int is_flush_fua = bio->bi_opf & (REQ_PREFLUSH | REQ_FUA);
        struct blk_plug *plug;
        unsigned int request_count = 0;
-       struct blk_mq_alloc_data data;
+       struct blk_mq_alloc_data data = { .flags = 0 };
        struct request *rq;
        blk_qc_t cookie;
        unsigned int wb_acct;