Commit 5a797e00 authored by Jens Axboe's avatar Jens Axboe
Browse files

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: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 200e86b3
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -117,7 +117,7 @@ struct request *blk_mq_sched_get_request(struct request_queue *q,
	ctx = blk_mq_get_ctx(q);
	ctx = blk_mq_get_ctx(q);
	hctx = blk_mq_map_queue(q, ctx->cpu);
	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) {
	if (e) {
		data->flags |= BLK_MQ_REQ_INTERNAL;
		data->flags |= BLK_MQ_REQ_INTERNAL;
+3 −3
Original line number Original line Diff line number Diff line
@@ -253,7 +253,7 @@ EXPORT_SYMBOL_GPL(__blk_mq_alloc_request);
struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
struct request *blk_mq_alloc_request(struct request_queue *q, int rw,
		unsigned int flags)
		unsigned int flags)
{
{
	struct blk_mq_alloc_data alloc_data;
	struct blk_mq_alloc_data alloc_data = { .flags = flags };
	struct request *rq;
	struct request *rq;
	int ret;
	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_sync = op_is_sync(bio->bi_opf);
	const int is_flush_fua = bio->bi_opf & (REQ_PREFLUSH | REQ_FUA);
	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;
	struct request *rq;
	unsigned int request_count = 0, srcu_idx;
	unsigned int request_count = 0, srcu_idx;
	struct blk_plug *plug;
	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);
	const int is_flush_fua = bio->bi_opf & (REQ_PREFLUSH | REQ_FUA);
	struct blk_plug *plug;
	struct blk_plug *plug;
	unsigned int request_count = 0;
	unsigned int request_count = 0;
	struct blk_mq_alloc_data data;
	struct blk_mq_alloc_data data = { .flags = 0 };
	struct request *rq;
	struct request *rq;
	blk_qc_t cookie;
	blk_qc_t cookie;
	unsigned int wb_acct;
	unsigned int wb_acct;