blk_mq_tag_to_rq() is used from within the driver to map a tag to a request. As such it should only return requests which are already started (ie passed to the driver); otherwise the driver might trip over requests which it has never seen and random crashes will occur. Signed-off-by: Hannes Reinecke <hare@xxxxxxx> --- block/blk-mq.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 4f57d27bfa73..f02d18113f9e 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -815,9 +815,13 @@ EXPORT_SYMBOL(blk_mq_delay_kick_requeue_list); struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag) { + struct request *rq; + if (tag < tags->nr_tags) { prefetch(tags->rqs[tag]); - return tags->rqs[tag]; + rq = tags->rqs[tag]; + if (blk_mq_request_started(rq)) + return rq; } return NULL; -- 2.16.4