diff options
Diffstat (limited to 'drivers/block/loop/loop_main.c')
-rw-r--r-- | drivers/block/loop/loop_main.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/block/loop/loop_main.c b/drivers/block/loop/loop_main.c index 09f001f0690c..1150956974fb 100644 --- a/drivers/block/loop/loop_main.c +++ b/drivers/block/loop/loop_main.c @@ -1667,6 +1667,8 @@ static const struct blk_mq_ops loop_mq_ops = { .complete = lo_complete_rq, }; +static struct dentry *loop_dbgfs_dir; + static int loop_add(struct loop_device **l, int i) { struct loop_device *lo; @@ -1766,6 +1768,21 @@ static int loop_add(struct loop_device **l, int i) sprintf(disk->disk_name, "loop%d", i); add_disk(disk); *l = lo; + + /* initialize debugfs entries */ + /* create for each loop device a debugfs directory under 'loop' if + * the 'block' directory exists, otherwise create the loop directory in + * the root directory */ +#ifdef CONFIG_DEBUG_FS + lo->lo_dbgfs_dir = debugfs_create_dir(disk->disk_name, loop_dbgfs_dir); + + if (IS_ERR_OR_NULL(lo->lo_dbgfs_dir)) { + err = -ENODEV; + lo->lo_dbgfs_dir = NULL; + goto out_free_file_fmt; + } +#endif + return lo->lo_number; out_free_file_fmt: @@ -1785,6 +1802,7 @@ out: static void loop_remove(struct loop_device *lo) { loop_file_fmt_free(lo->lo_fmt); + debugfs_remove(lo->lo_dbgfs_dir); del_gendisk(lo->lo_disk); blk_cleanup_queue(lo->lo_queue); blk_mq_free_tag_set(&lo->tag_set); @@ -1972,6 +1990,14 @@ static int __init loop_init(void) goto misc_out; } +#ifdef CONFIG_DEBUG_FS + loop_dbgfs_dir = debugfs_create_dir("loop", NULL); + if (IS_ERR_OR_NULL(loop_dbgfs_dir)) { + err = -ENODEV; + goto misc_out; + } +#endif + blk_register_region(MKDEV(LOOP_MAJOR, 0), range, THIS_MODULE, loop_probe, NULL, NULL); @@ -2010,6 +2036,10 @@ static void __exit loop_exit(void) blk_unregister_region(MKDEV(LOOP_MAJOR, 0), range); unregister_blkdev(LOOP_MAJOR, "loop"); +#ifdef CONFIG_DEBUG_FS + debugfs_remove(loop_dbgfs_dir); +#endif + misc_deregister(&loop_misc); } |