proc: Convert proc_mount to use mount_ns.
[cascardo/linux.git] / fs / proc / root.c
index 55bc7d6..8d3e484 100644 (file)
 
 #include "internal.h"
 
-static int proc_test_super(struct super_block *sb, void *data)
-{
-       return sb->s_fs_info == data;
-}
-
-static int proc_set_super(struct super_block *sb, void *data)
-{
-       int err = set_anon_super(sb, NULL);
-       if (!err) {
-               struct pid_namespace *ns = (struct pid_namespace *)data;
-               sb->s_fs_info = get_pid_ns(ns);
-       }
-       return err;
-}
-
 enum {
        Opt_gid, Opt_hidepid, Opt_err,
 };
@@ -48,7 +33,7 @@ static const match_table_t tokens = {
        {Opt_err, NULL},
 };
 
-static int proc_parse_options(char *options, struct pid_namespace *pid)
+int proc_parse_options(char *options, struct pid_namespace *pid)
 {
        char *p;
        substring_t args[MAX_OPT_ARGS];
@@ -100,45 +85,16 @@ int proc_remount(struct super_block *sb, int *flags, char *data)
 static struct dentry *proc_mount(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data)
 {
-       int err;
-       struct super_block *sb;
        struct pid_namespace *ns;
-       char *options;
 
        if (flags & MS_KERNMOUNT) {
-               ns = (struct pid_namespace *)data;
-               options = NULL;
+               ns = data;
+               data = NULL;
        } else {
                ns = task_active_pid_ns(current);
-               options = data;
-
-               /* Does the mounter have privilege over the pid namespace? */
-               if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN))
-                       return ERR_PTR(-EPERM);
-       }
-
-       sb = sget(fs_type, proc_test_super, proc_set_super, flags, ns);
-       if (IS_ERR(sb))
-               return ERR_CAST(sb);
-
-       if (!proc_parse_options(options, ns)) {
-               deactivate_locked_super(sb);
-               return ERR_PTR(-EINVAL);
-       }
-
-       if (!sb->s_root) {
-               err = proc_fill_super(sb);
-               if (err) {
-                       deactivate_locked_super(sb);
-                       return ERR_PTR(err);
-               }
-
-               sb->s_flags |= MS_ACTIVE;
-               /* User space would break if executables appear on proc */
-               sb->s_iflags |= SB_I_NOEXEC;
        }
 
-       return dget(sb->s_root);
+       return mount_ns(fs_type, flags, data, ns, ns->user_ns, proc_fill_super);
 }
 
 static void proc_kill_sb(struct super_block *sb)
@@ -158,7 +114,7 @@ static struct file_system_type proc_fs_type = {
        .name           = "proc",
        .mount          = proc_mount,
        .kill_sb        = proc_kill_sb,
-       .fs_flags       = FS_USERNS_VISIBLE | FS_USERNS_MOUNT,
+       .fs_flags       = FS_USERNS_MOUNT,
 };
 
 void __init proc_root_init(void)