diff options
Diffstat (limited to 'drivers/base/devtmpfs.c')
| -rw-r--r-- | drivers/base/devtmpfs.c | 38 | 
1 files changed, 29 insertions, 9 deletions
diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index ba5c80903efe..30d0523014e0 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c @@ -56,20 +56,32 @@ static int __init mount_param(char *str)  }  __setup("devtmpfs.mount=", mount_param); -static struct dentry *dev_mount(struct file_system_type *fs_type, int flags, +static struct vfsmount *mnt; + +static struct dentry *public_dev_mount(struct file_system_type *fs_type, int flags,  		      const char *dev_name, void *data)  { +	struct super_block *s = mnt->mnt_sb; +	atomic_inc(&s->s_active); +	down_write(&s->s_umount); +	return dget(s->s_root); +} + +static struct file_system_type internal_fs_type = { +	.name = "devtmpfs",  #ifdef CONFIG_TMPFS -	return mount_single(fs_type, flags, data, shmem_fill_super); +	.init_fs_context = shmem_init_fs_context, +	.parameters	= &shmem_fs_parameters,  #else -	return mount_single(fs_type, flags, data, ramfs_fill_super); +	.init_fs_context = ramfs_init_fs_context, +	.parameters	= &ramfs_fs_parameters,  #endif -} +	.kill_sb = kill_litter_super, +};  static struct file_system_type dev_fs_type = {  	.name = "devtmpfs", -	.mount = dev_mount, -	.kill_sb = kill_litter_super, +	.mount = public_dev_mount,  };  #ifdef CONFIG_BLOCK @@ -378,12 +390,11 @@ static int handle(const char *name, umode_t mode, kuid_t uid, kgid_t gid,  static int devtmpfsd(void *p)  { -	char options[] = "mode=0755";  	int *err = p;  	*err = ksys_unshare(CLONE_NEWNS);  	if (*err)  		goto out; -	*err = ksys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, options); +	*err = ksys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);  	if (*err)  		goto out;  	ksys_chdir("/.."); /* will traverse into overmounted root */ @@ -420,7 +431,16 @@ out:   */  int __init devtmpfs_init(void)  { -	int err = register_filesystem(&dev_fs_type); +	char opts[] = "mode=0755"; +	int err; + +	mnt = vfs_kern_mount(&internal_fs_type, 0, "devtmpfs", opts); +	if (IS_ERR(mnt)) { +		printk(KERN_ERR "devtmpfs: unable to create devtmpfs %ld\n", +				PTR_ERR(mnt)); +		return PTR_ERR(mnt); +	} +	err = register_filesystem(&dev_fs_type);  	if (err) {  		printk(KERN_ERR "devtmpfs: unable to register devtmpfs "  		       "type %i\n", err);  |