Commit 7dd2fb68 authored by Jens Axboe's avatar Jens Axboe

blk-mq: update hardware and software queues for sleeping alloc

If we end up sleeping due to running out of requests, we should
update the hardware and software queues in the map ctx structure.
Otherwise we could end up having rq->mq_ctx point to the pre-sleep
context, and risk corrupting ctx->rq_list since we'll be
grabbing the wrong lock when inserting the request.
Reported-by: default avatarDave Jones <davej@codemonkey.org.uk>
Reported-by: default avatarChris Mason <clm@fb.com>
Tested-by: default avatarChris Mason <clm@fb.com>
Fixes: 63581af3 ("blk-mq: remove non-blocking pass in blk_mq_map_request")
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent ff269568
...@@ -1217,9 +1217,9 @@ static struct request *blk_mq_map_request(struct request_queue *q, ...@@ -1217,9 +1217,9 @@ static struct request *blk_mq_map_request(struct request_queue *q,
blk_mq_set_alloc_data(&alloc_data, q, 0, ctx, hctx); blk_mq_set_alloc_data(&alloc_data, q, 0, ctx, hctx);
rq = __blk_mq_alloc_request(&alloc_data, op, op_flags); rq = __blk_mq_alloc_request(&alloc_data, op, op_flags);
hctx->queued++; data->hctx = alloc_data.hctx;
data->hctx = hctx; data->ctx = alloc_data.ctx;
data->ctx = ctx; data->hctx->queued++;
return rq; return rq;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment