nbd has a defect that blk_mq_tag_to_rq() might return a freed request in nbd_read_stat(). We need a new mechanism if we want to fix this in nbd driver, which is rather complicated. Thus use blk_mq_find_and_get_req() to replace blk_mq_tag_to_rq(), which can make sure the returned request is not freed, and then we can do more checking while 'cmd->lock' is hold. Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> --- block/blk-mq-tag.c | 5 +++-- block/blk-mq.c | 1 + include/linux/blk-mq.h | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 86f87346232a..b4f66b75b4d1 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -200,8 +200,8 @@ struct bt_iter_data { bool reserved; }; -static struct request *blk_mq_find_and_get_req(struct blk_mq_tags *tags, - unsigned int bitnr) +struct request *blk_mq_find_and_get_req(struct blk_mq_tags *tags, + unsigned int bitnr) { struct request *rq; unsigned long flags; @@ -213,6 +213,7 @@ static struct request *blk_mq_find_and_get_req(struct blk_mq_tags *tags, spin_unlock_irqrestore(&tags->lock, flags); return rq; } +EXPORT_SYMBOL(blk_mq_find_and_get_req); static bool bt_iter(struct sbitmap *bitmap, unsigned int bitnr, void *data) { diff --git a/block/blk-mq.c b/block/blk-mq.c index 08626cb0534c..5113aa3788a2 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -916,6 +916,7 @@ void blk_mq_put_rq_ref(struct request *rq) else if (refcount_dec_and_test(&rq->ref)) __blk_mq_free_request(rq); } +EXPORT_SYMBOL(blk_mq_put_rq_ref); static bool blk_mq_check_expired(struct blk_mq_hw_ctx *hctx, struct request *rq, void *priv, bool reserved) diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 13ba1861e688..03e02990609d 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -637,4 +637,7 @@ blk_qc_t blk_mq_submit_bio(struct bio *bio); void blk_mq_hctx_set_fq_lock_class(struct blk_mq_hw_ctx *hctx, struct lock_class_key *key); +void blk_mq_put_rq_ref(struct request *rq); +struct request *blk_mq_find_and_get_req(struct blk_mq_tags *tags, + unsigned int bitnr); #endif -- 2.31.1