[PATCH 5/5] tiny-shmem: use call_once()

Akinobu Mita
2008-03-10T15:13:21Z

This patch defers mounting tmpfs till shmem_file_setup() is
called first time by using call_once().

Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
---
mm/tiny-shmem.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)

Index: 2.6-rc/mm/tiny-shmem.c
===================================================================
--- 2.6-rc.orig/mm/tiny-shmem.c
+++ 2.6-rc/mm/tiny-shmem.c
@@ -19,6 +19,7 @@
#include <linux/module.h>
#include <linux/swap.h>
#include <linux/ramfs.h>
+#include <linux/once.h>

static struct file_system_type tmpfs_fs_type = {
.name = "tmpfs",
@@ -26,19 +27,23 @@ static struct file_system_type tmpfs_fs_
.kill_sb = kill_litter_super,
};

-static struct vfsmount *shm_mnt;
-
static int __init init_tmpfs(void)
{
BUG_ON(register_filesystem(&tmpfs_fs_type) != 0);

- shm_mnt = kern_mount(&tmpfs_fs_type);
- BUG_ON(IS_ERR(shm_mnt));
-
return 0;
}
module_init(init_tmpfs)

+static struct vfsmount *shm_mnt;
+
+static int init_shm_mnt(void)
+{
+ shm_mnt = kern_mount(&tmpfs_fs_type);
+
+ return IS_ERR(shm_mnt) ? PTR_ERR(shm_mnt) : 0;
+}
+
/*
* shmem_file_setup - get an unlinked file living in tmpfs
*
@@ -53,9 +58,11 @@ struct file *shmem_file_setup(char *name
struct inode *inode;
struct dentry *dentry, *root;
struct qstr this;
+ static DEFINE_ONCE(once);

- if (IS_ERR(shm_mnt))
- return (void *)shm_mnt;
+ error = call_once(&once, init_shm_mnt);
+ if (error)
+ return ERR_PTR(error);

error = -ENOMEM;
this.name = name;