blk-mq: don't lose flags passed in to blk_mq_alloc_request()
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>
This commit is contained in:
parent
200e86b337
commit
5a797e00dc
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue