]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/base/devtmpfs.c
Merge tag 'iommu-fixes-5.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / drivers / base / devtmpfs.c
index ba5c80903efec8ee4d94fec5dc6ed868cd0ee617..30d0523014e0d49e0ac6e16880a7bb08ecfbef27 100644 (file)
@@ -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 @@ static int devtmpfsd(void *p)
  */
 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);