Skip to content

Commit

Permalink
debugfs: separate cache for debugfs inodes
Browse files Browse the repository at this point in the history
Embed them into container (struct debugfs_inode_info, with nothing
else in it at the moment), set the cache up, etc.

Just the infrastructure changes letting us augment debugfs inodes
here; adding stuff will come at the next step.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Reviewed-by: Christian Brauner <brauner@kernel.org>
Link: https://lore.kernel.org/r/20250112080705.141166-1-viro@zeniv.linux.org.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Al Viro authored and Greg Kroah-Hartman committed Jan 15, 2025
1 parent ee9c693 commit 268b361
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 6 deletions.
40 changes: 34 additions & 6 deletions fs/debugfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,16 +208,34 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root)
return 0;
}

static struct kmem_cache *debugfs_inode_cachep __ro_after_init;

static void init_once(void *foo)
{
struct debugfs_inode_info *info = foo;
inode_init_once(&info->vfs_inode);
}

static struct inode *debugfs_alloc_inode(struct super_block *sb)
{
struct debugfs_inode_info *info;
info = alloc_inode_sb(sb, debugfs_inode_cachep, GFP_KERNEL);
if (!info)
return NULL;
return &info->vfs_inode;
}

static void debugfs_free_inode(struct inode *inode)
{
if (S_ISLNK(inode->i_mode))
kfree(inode->i_link);
free_inode_nonrcu(inode);
kmem_cache_free(debugfs_inode_cachep, DEBUGFS_I(inode));
}

static const struct super_operations debugfs_super_operations = {
.statfs = simple_statfs,
.show_options = debugfs_show_options,
.alloc_inode = debugfs_alloc_inode,
.free_inode = debugfs_free_inode,
};

Expand Down Expand Up @@ -939,12 +957,22 @@ static int __init debugfs_init(void)
if (retval)
return retval;

retval = register_filesystem(&debug_fs_type);
if (retval)
debugfs_inode_cachep = kmem_cache_create("debugfs_inode_cache",
sizeof(struct debugfs_inode_info), 0,
SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT,
init_once);
if (debugfs_inode_cachep == NULL) {
sysfs_remove_mount_point(kernel_kobj, "debug");
else
debugfs_registered = true;
return -ENOMEM;
}

return retval;
retval = register_filesystem(&debug_fs_type);
if (retval) { // Really not going to happen
sysfs_remove_mount_point(kernel_kobj, "debug");
kmem_cache_destroy(debugfs_inode_cachep);
return retval;
}
debugfs_registered = true;
return 0;
}
core_initcall(debugfs_init);
9 changes: 9 additions & 0 deletions fs/debugfs/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@

struct file_operations;

struct debugfs_inode_info {
struct inode vfs_inode;
};

static inline struct debugfs_inode_info *DEBUGFS_I(struct inode *inode)
{
return container_of(inode, struct debugfs_inode_info, vfs_inode);
}

/* declared over in file.c */
extern const struct file_operations debugfs_noop_file_operations;
extern const struct file_operations debugfs_open_proxy_file_operations;
Expand Down

0 comments on commit 268b361

Please sign in to comment.