]> Git Repo - linux.git/blobdiff - drivers/base/devtmpfs.c
KVM: VMX: Handle preemption timer fastpath
[linux.git] / drivers / base / devtmpfs.c
index 6cdbf15312387f93455bafb2b816e691def1cb94..c9017e0584c003b96daaa23da7241df3266da533 100644 (file)
 
 static struct task_struct *thread;
 
-#if defined CONFIG_DEVTMPFS_MOUNT
-static int mount_dev = 1;
-#else
-static int mount_dev;
-#endif
+static int __initdata mount_dev = IS_ENABLED(CONFIG_DEVTMPFS_MOUNT);
 
 static DEFINE_SPINLOCK(req_lock);
 
@@ -71,10 +67,10 @@ static struct file_system_type internal_fs_type = {
        .name = "devtmpfs",
 #ifdef CONFIG_TMPFS
        .init_fs_context = shmem_init_fs_context,
-       .parameters     = &shmem_fs_parameters,
+       .parameters     = shmem_fs_parameters,
 #else
        .init_fs_context = ramfs_init_fs_context,
-       .parameters     = &ramfs_fs_parameters,
+       .parameters     = ramfs_fs_parameters,
 #endif
        .kill_sb = kill_litter_super,
 };
@@ -93,6 +89,23 @@ static inline int is_blockdev(struct device *dev)
 static inline int is_blockdev(struct device *dev) { return 0; }
 #endif
 
+static int devtmpfs_submit_req(struct req *req, const char *tmp)
+{
+       init_completion(&req->done);
+
+       spin_lock(&req_lock);
+       req->next = requests;
+       requests = req;
+       spin_unlock(&req_lock);
+
+       wake_up_process(thread);
+       wait_for_completion(&req->done);
+
+       kfree(tmp);
+
+       return req->err;
+}
+
 int devtmpfs_create_node(struct device *dev)
 {
        const char *tmp = NULL;
@@ -117,19 +130,7 @@ int devtmpfs_create_node(struct device *dev)
 
        req.dev = dev;
 
-       init_completion(&req.done);
-
-       spin_lock(&req_lock);
-       req.next = requests;
-       requests = &req;
-       spin_unlock(&req_lock);
-
-       wake_up_process(thread);
-       wait_for_completion(&req.done);
-
-       kfree(tmp);
-
-       return req.err;
+       return devtmpfs_submit_req(&req, tmp);
 }
 
 int devtmpfs_delete_node(struct device *dev)
@@ -147,18 +148,7 @@ int devtmpfs_delete_node(struct device *dev)
        req.mode = 0;
        req.dev = dev;
 
-       init_completion(&req.done);
-
-       spin_lock(&req_lock);
-       req.next = requests;
-       requests = &req;
-       spin_unlock(&req_lock);
-
-       wake_up_process(thread);
-       wait_for_completion(&req.done);
-
-       kfree(tmp);
-       return req.err;
+       return devtmpfs_submit_req(&req, tmp);
 }
 
 static int dev_mkdir(const char *name, umode_t mode)
@@ -359,7 +349,7 @@ static int handle_remove(const char *nodename, struct device *dev)
  * If configured, or requested by the commandline, devtmpfs will be
  * auto-mounted after the kernel mounted the root filesystem.
  */
-int devtmpfs_mount(void)
+int __init devtmpfs_mount(void)
 {
        int err;
 
@@ -388,18 +378,30 @@ static int handle(const char *name, umode_t mode, kuid_t uid, kgid_t gid,
                return handle_remove(name, dev);
 }
 
-static int devtmpfsd(void *p)
+static int devtmpfs_setup(void *p)
 {
-       int *err = p;
-       *err = ksys_unshare(CLONE_NEWNS);
-       if (*err)
+       int err;
+
+       err = ksys_unshare(CLONE_NEWNS);
+       if (err)
                goto out;
-       *err = do_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);
-       if (*err)
+       err = do_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);
+       if (err)
                goto out;
        ksys_chdir("/.."); /* will traverse into overmounted root */
        ksys_chroot(".");
+out:
+       *(int *)p = err;
        complete(&setup_done);
+       return err;
+}
+
+static int devtmpfsd(void *p)
+{
+       int err = devtmpfs_setup(p);
+
+       if (err)
+               return err;
        while (1) {
                spin_lock(&req_lock);
                while (requests) {
@@ -420,9 +422,6 @@ static int devtmpfsd(void *p)
                schedule();
        }
        return 0;
-out:
-       complete(&setup_done);
-       return *err;
 }
 
 /*
This page took 0.035827 seconds and 4 git commands to generate.