Skip to content

Commit

Permalink
block: remove per-disk debugfs files in blk_unregister_queue
Browse files Browse the repository at this point in the history
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: Christoph Hellwig <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
Christoph Hellwig authored and axboe committed Jun 17, 2022
1 parent 5cf9c91 commit 99d055b
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 25 deletions.
8 changes: 0 additions & 8 deletions block/blk-mq-debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -840,14 +840,6 @@ void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
debugfs_create_files(rqos->debugfs_dir, rqos, rqos->ops->debugfs_attrs);
}

void blk_mq_debugfs_unregister_queue_rqos(struct request_queue *q)
{
lockdep_assert_held(&q->debugfs_mutex);

debugfs_remove_recursive(q->rqos_debugfs_dir);
q->rqos_debugfs_dir = NULL;
}

void blk_mq_debugfs_register_sched_hctx(struct request_queue *q,
struct blk_mq_hw_ctx *hctx)
{
Expand Down
5 changes: 0 additions & 5 deletions block/blk-mq-debugfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hctx);

void blk_mq_debugfs_register_rqos(struct rq_qos *rqos);
void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos);
void blk_mq_debugfs_unregister_queue_rqos(struct request_queue *q);
#else
static inline void blk_mq_debugfs_register(struct request_queue *q)
{
Expand Down Expand Up @@ -82,10 +81,6 @@ static inline void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
static inline void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos)
{
}

static inline void blk_mq_debugfs_unregister_queue_rqos(struct request_queue *q)
{
}
#endif

#ifdef CONFIG_BLK_DEBUG_FS_ZONED
Expand Down
4 changes: 0 additions & 4 deletions block/blk-rq-qos.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,10 +294,6 @@ void rq_qos_wait(struct rq_wait *rqw, void *private_data,

void rq_qos_exit(struct request_queue *q)
{
mutex_lock(&q->debugfs_mutex);
blk_mq_debugfs_unregister_queue_rqos(q);
mutex_unlock(&q->debugfs_mutex);

while (q->rq_qos) {
struct rq_qos *rqos = q->rq_qos;
q->rq_qos = rqos->next;
Expand Down
16 changes: 8 additions & 8 deletions block/blk-sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -779,13 +779,6 @@ static void blk_release_queue(struct kobject *kobj)
if (queue_is_mq(q))
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);

if (blk_queue_has_srcu(q))
Expand Down Expand Up @@ -946,8 +939,15 @@ void blk_unregister_queue(struct gendisk *disk)
/* Now that we've deleted all child objects, we can delete the queue. */
kobject_uevent(&q->kobj, KOBJ_REMOVE);
kobject_del(&q->kobj);

mutex_unlock(&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;
q->rqos_debugfs_dir = NULL;
mutex_unlock(&q->debugfs_mutex);

kobject_put(&disk_to_dev(disk)->kobj);
}

0 comments on commit 99d055b

Please sign in to comment.