Commit 5ac14e7f authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Yu Kuai
Browse files

block: remove per-disk debugfs files in blk_unregister_queue

mainline inclusion
from mainline-v5.19-rc4
commit 99d055b4
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IAGRKP
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=99d055b4fd4bbb309c6cdb51a0d420669f777944



--------------------------------

The block debugfs files are created in blk_register_queue, which is
called by add_disk and use a naming scheme based on the disk_name.
After del_gendisk returns that name can be reused and thus we must not
leave these debugfs files around, otherwise the kernel is unhappy
and spews messages like:

	Directory XXXXX with parent 'block' already present!

and the newly created devices will not have working debugfs files.

Move the unregistration to blk_unregister_queue instead (which matches
the sysfs unregistration) to make sure the debugfs life time rules match
those of the disk name.

As part of the move also make sure the whole debugfs unregistration is
inside a single debugfs_mutex critical section.

Note that this breaks blktests block/002, which checks that the debugfs
directory has not been removed while blktests is running, but that
particular check should simply be removed from the test case.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20220614074827.458955-4-hch@lst.de


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Conflicts:
	block/blk-mq-debugfs.h
	block/blk-mq-debugfs.c
	block/blk-rq-qos.c
	block/blk-sysfs.c
[Context conflicts]
Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
parent 8196738e
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -895,13 +895,6 @@ static void __blk_release_queue(struct work_struct *work)
		blk_mq_release(q);
	}

	mutex_lock(&q->debugfs_mutex);
	blk_trace_shutdown(q);
	debugfs_remove_recursive(q->debugfs_dir);
	q->debugfs_dir = NULL;
	q->sched_debugfs_dir = NULL;
	mutex_unlock(&q->debugfs_mutex);

	bioset_exit(&q->bio_split);

	ida_simple_remove(&blk_queue_ida, q->id);
@@ -1076,6 +1069,13 @@ void blk_unregister_queue(struct gendisk *disk)
	mutex_unlock(&q->sysfs_lock);
	mutex_unlock(&queue_to_wrapper(q)->sysfs_dir_lock);

	mutex_lock(&q->debugfs_mutex);
	blk_trace_shutdown(q);
	debugfs_remove_recursive(q->debugfs_dir);
	q->debugfs_dir = NULL;
	q->sched_debugfs_dir = NULL;
	mutex_unlock(&q->debugfs_mutex);

	/* Now that we've deleted all child objects, we can delete the queue. */
	kobject_uevent(&q->kobj, KOBJ_REMOVE);
	kobject_del(&q->kobj);