select COMPAT_BINFMT_ELF if BINFMT_ELF
        select ARCH_WANT_OLD_COMPAT_IPC
        select COMPAT_OLD_SIGACTION
+       depends on MULTIUSER
        help
          Select this option if you want to enable your system kernel to
          handle system-calls from ELF binaries for 31 bit ESA.  This option
 
        select CRYPTO_SHA1
        select CRYPTO_SHA256
        select CRYPTO_SHA512
+       depends on MULTIUSER
        help
          This option enables Lustre file system client support. Choose Y
          here if you want to access a Lustre file system cluster. To compile
 
 config NFS_FS
        tristate "NFS client support"
-       depends on INET && FILE_LOCKING
+       depends on INET && FILE_LOCKING && MULTIUSER
        select LOCKD
        select SUNRPC
        select NFS_ACL_SUPPORT if NFS_V3_ACL
 
        select SUNRPC
        select EXPORTFS
        select NFS_ACL_SUPPORT if NFSD_V2_ACL
+       depends on MULTIUSER
        help
          Choose Y here if you want to allow other computers to access
          files residing on this system using Sun's Network File System
 
                           cap_intersect(permitted, __cap_nfsd_set));
 }
 
+#ifdef CONFIG_MULTIUSER
 extern bool has_capability(struct task_struct *t, int cap);
 extern bool has_ns_capability(struct task_struct *t,
                              struct user_namespace *ns, int cap);
                                      struct user_namespace *ns, int cap);
 extern bool capable(int cap);
 extern bool ns_capable(struct user_namespace *ns, int cap);
+#else
+static inline bool has_capability(struct task_struct *t, int cap)
+{
+       return true;
+}
+static inline bool has_ns_capability(struct task_struct *t,
+                             struct user_namespace *ns, int cap)
+{
+       return true;
+}
+static inline bool has_capability_noaudit(struct task_struct *t, int cap)
+{
+       return true;
+}
+static inline bool has_ns_capability_noaudit(struct task_struct *t,
+                                     struct user_namespace *ns, int cap)
+{
+       return true;
+}
+static inline bool capable(int cap)
+{
+       return true;
+}
+static inline bool ns_capable(struct user_namespace *ns, int cap)
+{
+       return true;
+}
+#endif /* CONFIG_MULTIUSER */
 extern bool capable_wrt_inode_uidgid(const struct inode *inode, int cap);
 extern bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap);
 
 
                groups_free(group_info);                \
 } while (0)
 
-extern struct group_info *groups_alloc(int);
 extern struct group_info init_groups;
+#ifdef CONFIG_MULTIUSER
+extern struct group_info *groups_alloc(int);
 extern void groups_free(struct group_info *);
+
+extern int in_group_p(kgid_t);
+extern int in_egroup_p(kgid_t);
+#else
+static inline void groups_free(struct group_info *group_info)
+{
+}
+
+static inline int in_group_p(kgid_t grp)
+{
+        return 1;
+}
+static inline int in_egroup_p(kgid_t grp)
+{
+        return 1;
+}
+#endif
 extern int set_current_groups(struct group_info *);
 extern void set_groups(struct cred *, struct group_info *);
 extern int groups_search(const struct group_info *, kgid_t);
 #define GROUP_AT(gi, i) \
        ((gi)->blocks[(i) / NGROUPS_PER_BLOCK][(i) % NGROUPS_PER_BLOCK])
 
-extern int in_group_p(kgid_t);
-extern int in_egroup_p(kgid_t);
-
 /*
  * The security context of a task
  *
 
 #define KUIDT_INIT(value) (kuid_t){ value }
 #define KGIDT_INIT(value) (kgid_t){ value }
 
+#ifdef CONFIG_MULTIUSER
 static inline uid_t __kuid_val(kuid_t uid)
 {
        return uid.val;
 {
        return gid.val;
 }
+#else
+static inline uid_t __kuid_val(kuid_t uid)
+{
+       return 0;
+}
+
+static inline gid_t __kgid_val(kgid_t gid)
+{
+       return 0;
+}
+#endif
 
 #define GLOBAL_ROOT_UID KUIDT_INIT(0)
 #define GLOBAL_ROOT_GID KGIDT_INIT(0)
 
 
 config BSD_PROCESS_ACCT
        bool "BSD Process Accounting"
+       depends on MULTIUSER
        help
          If you say Y here, a user level program will be able to instruct the
          kernel (via a special system call) to write process accounting
 config TASKSTATS
        bool "Export task/process statistics through netlink"
        depends on NET
+       depends on MULTIUSER
        default n
        help
          Export selected statistics for tasks/processes through the
 
 menuconfig NAMESPACES
        bool "Namespaces support" if EXPERT
+       depends on MULTIUSER
        default !EXPERT
        help
          Provides the way to make tasks work with different objects using
 
 config UID16
        bool "Enable 16-bit UID system calls" if EXPERT
-       depends on HAVE_UID16
+       depends on HAVE_UID16 && MULTIUSER
        default y
        help
          This enables the legacy 16-bit UID syscall wrappers.
 
+config MULTIUSER
+       bool "Multiple users, groups and capabilities support" if EXPERT
+       default y
+       help
+         This option enables support for non-root users, groups and
+         capabilities.
+
+         If you say N here, all processes will run with UID 0, GID 0, and all
+         possible capabilities.  Saying N here also compiles out support for
+         system calls related to UIDs, GIDs, and capabilities, such as setuid,
+         setgid, and capset.
+
+         If unsure, say Y here.
+
 config SGETMASK_SYSCALL
        bool "sgetmask/ssetmask syscalls support" if EXPERT
        def_bool PARISC || MN10300 || BLACKFIN || M68K || PPC || MIPS || X86 || SPARC || CRIS || MICROBLAZE || SUPERH
 
            extable.o params.o \
            kthread.o sys_ni.o nsproxy.o \
            notifier.o ksysfs.o cred.o reboot.o \
-           async.o range.o groups.o smpboot.o
+           async.o range.o smpboot.o
+
+obj-$(CONFIG_MULTIUSER) += groups.o
 
 ifdef CONFIG_FUNCTION_TRACER
 # Do not trace debug files and internal ftrace files
 
 }
 __setup("no_file_caps", file_caps_disable);
 
+#ifdef CONFIG_MULTIUSER
 /*
  * More recent versions of libcap are available from:
  *
 }
 EXPORT_SYMBOL(ns_capable);
 
+
+/**
+ * capable - Determine if the current task has a superior capability in effect
+ * @cap: The capability to be tested for
+ *
+ * Return true if the current task has the given superior capability currently
+ * available for use, false if not.
+ *
+ * This sets PF_SUPERPRIV on the task if the capability is available on the
+ * assumption that it's about to be used.
+ */
+bool capable(int cap)
+{
+       return ns_capable(&init_user_ns, cap);
+}
+EXPORT_SYMBOL(capable);
+#endif /* CONFIG_MULTIUSER */
+
 /**
  * file_ns_capable - Determine if the file's opener had a capability in effect
  * @file:  The file we want to check
 }
 EXPORT_SYMBOL(file_ns_capable);
 
-/**
- * capable - Determine if the current task has a superior capability in effect
- * @cap: The capability to be tested for
- *
- * Return true if the current task has the given superior capability currently
- * available for use, false if not.
- *
- * This sets PF_SUPERPRIV on the task if the capability is available on the
- * assumption that it's about to be used.
- */
-bool capable(int cap)
-{
-       return ns_capable(&init_user_ns, cap);
-}
-EXPORT_SYMBOL(capable);
-
 /**
  * capable_wrt_inode_uidgid - Check nsown_capable and uid and gid mapped
  * @inode: The inode in question
 
 
 static struct kmem_cache *cred_jar;
 
+/* init to 2 - one for init_task, one to ensure it is never freed */
+struct group_info init_groups = { .usage = ATOMIC_INIT(2) };
+
 /*
  * The initial credentials for the initial task
  */
 
 #include <linux/user_namespace.h>
 #include <asm/uaccess.h>
 
-/* init to 2 - one for init_task, one to ensure it is never freed */
-struct group_info init_groups = { .usage = ATOMIC_INIT(2) };
-
 struct group_info *groups_alloc(int gidsetsize)
 {
        struct group_info *group_info;
 
  * SMP: There are not races, the GIDs are checked only by filesystem
  *      operations (as far as semantic preservation is concerned).
  */
+#ifdef CONFIG_MULTIUSER
 SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
 {
        struct user_namespace *ns = current_user_ns();
        commit_creds(new);
        return old_fsgid;
 }
+#endif /* CONFIG_MULTIUSER */
 
 /**
  * sys_getpid - return the thread group id of the current process
 
 cond_syscall(sys_fadvise64);
 cond_syscall(sys_fadvise64_64);
 cond_syscall(sys_madvise);
+cond_syscall(sys_setuid);
+cond_syscall(sys_setregid);
+cond_syscall(sys_setgid);
+cond_syscall(sys_setreuid);
+cond_syscall(sys_setresuid);
+cond_syscall(sys_getresuid);
+cond_syscall(sys_setresgid);
+cond_syscall(sys_getresgid);
+cond_syscall(sys_setgroups);
+cond_syscall(sys_getgroups);
+cond_syscall(sys_setfsuid);
+cond_syscall(sys_setfsgid);
+cond_syscall(sys_capget);
+cond_syscall(sys_capset);
 
 /* arch-specific weak syscall entries */
 cond_syscall(sys_pciconfig_read);
 
 config SUNRPC
        tristate
+       depends on MULTIUSER
 
 config SUNRPC_GSS
        tristate
        select OID_REGISTRY
+       depends on MULTIUSER
 
 config SUNRPC_BACKCHANNEL
        bool
 
 config SECURITY
        bool "Enable different security models"
        depends on SYSFS
+       depends on MULTIUSER
        help
          This allows you to choose different security modules to be
          configured into your kernel.