]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: protect debugfs attribute method hctx_busy_show
authorNilay Shroff <nilay@linux.ibm.com>
Thu, 13 Mar 2025 11:51:52 +0000 (17:21 +0530)
committerJens Axboe <axboe@kernel.dk>
Thu, 13 Mar 2025 13:23:43 +0000 (07:23 -0600)
The hctx_busy_show method in debugfs is currently unprotected. This
method iterates over all started requests in a tagset and prints them.
However, the tags can be updated concurrently via the sysfs attributes
'nr_requests' or 'scheduler' (elevator switch), leading to potential
race conditions.

Since sysfs attributes 'nr_requests' and 'scheduler' are already
protected using q->elevator_lock, extend this protection to the debugfs
'busy' attribute as well to ensure consistency.

Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250313115235.3707600-4-nilay@linux.ibm.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq-debugfs.c

index 1c958bbaddce142e94c15494b7033828776f6f89..3421b5521fe287be94010d7680a5c4ad72c7a296 100644 (file)
@@ -347,9 +347,14 @@ static int hctx_busy_show(void *data, struct seq_file *m)
 {
        struct blk_mq_hw_ctx *hctx = data;
        struct show_busy_params params = { .m = m, .hctx = hctx };
+       int res;
 
+       res = mutex_lock_interruptible(&hctx->queue->elevator_lock);
+       if (res)
+               return res;
        blk_mq_tagset_busy_iter(hctx->queue->tag_set, hctx_show_busy_rq,
                                &params);
+       mutex_unlock(&hctx->queue->elevator_lock);
 
        return 0;
 }