Replace the freeze depth check with blk_queue_enter()/blk_queue_exit() which properly waits for the queue to be unfrozen and prevents new freezes while creating debugfs files. This provides correct synchronization without false warnings. If the queue is dying (blk_queue_enter returns error), skip creating the debugfs files as the queue is being torn down anyway. Reported-by: Shinichiro Kawasaki Closes: https://lore.kernel.org/all/aYWQR7CtYdk3K39g@shinmob/ Signed-off-by: Yu Kuai --- block/blk-mq-debugfs.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index faeaa1fc86a7..03583d0d3972 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -613,11 +613,6 @@ static void debugfs_create_files(struct request_queue *q, struct dentry *parent, const struct blk_mq_debugfs_attr *attr) { lockdep_assert_held(&q->debugfs_mutex); - /* - * Creating new debugfs entries with queue freezed has the risk of - * deadlock. - */ - WARN_ON_ONCE(q->mq_freeze_depth != 0); /* * debugfs_mutex should not be nested under other locks that can be * grabbed while queue is frozen. @@ -628,9 +623,19 @@ static void debugfs_create_files(struct request_queue *q, struct dentry *parent, if (IS_ERR_OR_NULL(parent)) return; + /* + * Avoid creating debugfs files while the queue is frozen, wait for + * the queue to be unfrozen and prevent new freeze while creating + * debugfs files. + */ + if (blk_queue_enter(q, 0)) + return; + for (; attr->name; attr++) debugfs_create_file_aux(attr->name, attr->mode, parent, (void *)attr, data, &blk_mq_debugfs_fops); + + blk_queue_exit(q); } void blk_mq_debugfs_register(struct request_queue *q) -- 2.51.0