debugfs: separate cache for debugfs inodes
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>pull/1136/head
parent
ee9c69388e
commit
268b36116f
|
|
@ -208,16 +208,34 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root)
|
||||||
return 0;
|
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)
|
static void debugfs_free_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
if (S_ISLNK(inode->i_mode))
|
if (S_ISLNK(inode->i_mode))
|
||||||
kfree(inode->i_link);
|
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 = {
|
static const struct super_operations debugfs_super_operations = {
|
||||||
.statfs = simple_statfs,
|
.statfs = simple_statfs,
|
||||||
.show_options = debugfs_show_options,
|
.show_options = debugfs_show_options,
|
||||||
|
.alloc_inode = debugfs_alloc_inode,
|
||||||
.free_inode = debugfs_free_inode,
|
.free_inode = debugfs_free_inode,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -939,12 +957,22 @@ static int __init debugfs_init(void)
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
retval = register_filesystem(&debug_fs_type);
|
debugfs_inode_cachep = kmem_cache_create("debugfs_inode_cache",
|
||||||
if (retval)
|
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");
|
sysfs_remove_mount_point(kernel_kobj, "debug");
|
||||||
else
|
return -ENOMEM;
|
||||||
debugfs_registered = true;
|
}
|
||||||
|
|
||||||
|
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;
|
return retval;
|
||||||
|
}
|
||||||
|
debugfs_registered = true;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
core_initcall(debugfs_init);
|
core_initcall(debugfs_init);
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,15 @@
|
||||||
|
|
||||||
struct file_operations;
|
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 */
|
/* declared over in file.c */
|
||||||
extern const struct file_operations debugfs_noop_file_operations;
|
extern const struct file_operations debugfs_noop_file_operations;
|
||||||
extern const struct file_operations debugfs_open_proxy_file_operations;
|
extern const struct file_operations debugfs_open_proxy_file_operations;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue