[RFC,1/1,linux-next] FS: consolidate inode cache initialization
diff mbox

Message ID 1435007305-19129-1-git-send-email-fabf@skynet.be
State New
Headers show

Commit Message

Fabian Frederick June 22, 2015, 9:08 p.m. UTC
Currently, all filesystems directly call kmem_cache_create() through
static init_inodecache() and generally use the same slab
flags with <fsname>_inode_cache.

This patch declares _init_inode_cache() in libfs which uses
file_system_fs name to forge cache name and applies the update on AFFS
as an example.

If the idea is interesting, should I send 1 patch for _init_inode_cache()
addition and 1 patch for each FS update ? 

Regards,
Fabian

Signed-off-by: Fabian Frederick <fabf@skynet.be>
---
 fs/affs/super.c    | 17 ++++-------------
 fs/libfs.c         | 15 +++++++++++++++
 include/linux/fs.h |  3 +++
 3 files changed, 22 insertions(+), 13 deletions(-)

Patch
diff mbox

diff --git a/fs/affs/super.c b/fs/affs/super.c
index 3f89c9e..e7068d6 100644
--- a/fs/affs/super.c
+++ b/fs/affs/super.c
@@ -126,18 +126,6 @@  static void init_once(void *foo)
 	inode_init_once(&ei->vfs_inode);
 }
 
-static int __init init_inodecache(void)
-{
-	affs_inode_cachep = kmem_cache_create("affs_inode_cache",
-					     sizeof(struct affs_inode_info),
-					     0, (SLAB_RECLAIM_ACCOUNT|
-						SLAB_MEM_SPREAD),
-					     init_once);
-	if (affs_inode_cachep == NULL)
-		return -ENOMEM;
-	return 0;
-}
-
 static void destroy_inodecache(void)
 {
 	/*
@@ -623,7 +611,10 @@  MODULE_ALIAS_FS("affs");
 
 static int __init init_affs_fs(void)
 {
-	int err = init_inodecache();
+	int err;
+
+	err = _init_inodecache(&affs_inode_cachep, &affs_fs_type,
+			       sizeof(struct affs_inode_info), init_once);
 	if (err)
 		goto out1;
 	err = register_filesystem(&affs_fs_type);
diff --git a/fs/libfs.c b/fs/libfs.c
index 88a4cb4..84531a9 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1203,3 +1203,18 @@  bool is_empty_dir_inode(struct inode *inode)
 	return (inode->i_fop == &empty_dir_operations) &&
 		(inode->i_op == &empty_dir_inode_operations);
 }
+
+int _init_inodecache(struct kmem_cache **cachep, struct file_system_type *fs,
+		     size_t fs_inodeinfo_len, void *init_once)
+{
+	char buf[32];
+
+	sprintf(buf, "%s_inode_cache", fs->name);
+	*cachep = kmem_cache_create(buf, fs_inodeinfo_len, 0,
+				    (SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD),
+				    init_once);
+	if (!*cachep)
+		return -ENOMEM;
+	return 0;
+}
+EXPORT_SYMBOL(_init_inodecache);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8a81fcb..036a8a2 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2834,6 +2834,9 @@  extern int generic_file_fsync(struct file *, loff_t, loff_t, int);
 
 extern int generic_check_addressable(unsigned, u64);
 
+extern int _init_inodecache(struct kmem_cache **, struct file_system_type *,
+			    size_t, void *);
+
 #ifdef CONFIG_MIGRATION
 extern int buffer_migrate_page(struct address_space *,
 				struct page *, struct page *,