Support iterating over all requests in a tag set, including requests that have not yet been started. A later patch will call this function from scsi_device_busy(). Cc: Jens Axboe Cc: Christoph Hellwig Cc: Ming Lei Cc: John Garry Cc: Hannes Reinecke Signed-off-by: Bart Van Assche --- block/blk-mq-tag.c | 19 +++++++++++++++++++ include/linux/blk-mq.h | 2 ++ 2 files changed, 21 insertions(+) diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index f169beeded64..f277ed7e7743 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -456,6 +456,25 @@ void blk_mq_tagset_busy_iter(struct blk_mq_tag_set *tagset, } EXPORT_SYMBOL(blk_mq_tagset_busy_iter); +/** + * blk_mq_tagset_iter - iterate over all requests in a tag set + * @tagset: Tag set to iterate over. + * @fn: Pointer to the function that will be called for each request. + * @fn will be called as follows: @fn(rq, @priv) where rq is a + * pointer to a request. Return true to continue iterating tags, + * false to stop. + * @priv: Will be passed as second argument to @fn. + * + * We grab one request reference before calling @fn and release it after + * @fn returns. + */ +void blk_mq_tagset_iter(struct blk_mq_tag_set *tagset, blk_mq_rq_iter_fn *fn, + void *priv) +{ + __blk_mq_tagset_iter(tagset, fn, priv, 0); +} +EXPORT_SYMBOL(blk_mq_tagset_iter); + static bool blk_mq_tagset_count_completed_rqs(struct request *rq, void *data) { unsigned *count = data; diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 3467cacb281c..20a22c1cd067 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -927,6 +927,8 @@ void blk_mq_run_hw_queues(struct request_queue *q, bool async); void blk_mq_delay_run_hw_queues(struct request_queue *q, unsigned long msecs); void blk_mq_tagset_busy_iter(struct blk_mq_tag_set *tagset, blk_mq_rq_iter_fn *fn, void *priv); +void blk_mq_tagset_iter(struct blk_mq_tag_set *tagset, blk_mq_rq_iter_fn *fn, + void *priv); void blk_mq_tagset_wait_completed_request(struct blk_mq_tag_set *tagset); void blk_mq_freeze_queue_nomemsave(struct request_queue *q); void blk_mq_unfreeze_queue_nomemrestore(struct request_queue *q);