summaryrefslogtreecommitdiffstats
path: root/drivers/block/loop/loop_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/loop/loop_main.c')
-rw-r--r--drivers/block/loop/loop_main.c30
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);
}