mirror of
https://github.com/LineageOS/android_kernel_samsung_msm8226.git
synced 2026-09-29 00:00:25 +02:00
Assign a unique proc inode to each namespace, and use that inode number to ensure we only allocate at most one proc inode for every namespace in proc. A single proc inode per namespace allows userspace to test to see if two processes are in the same namespace. This has been a long requested feature and only blocked because a naive implementation would put the id in a global space and would ultimately require having a namespace for the names of namespaces, making migration and certain virtualization tricks impossible. We still don't have per superblock inode numbers for proc, which appears necessary for application unaware checkpoint/restart and migrations (if the application is using namespace file descriptors) but that is now allowd by the design if it becomes important. I have preallocated the ipc and uts initial proc inode numbers so their structures can be statically initialized. Change-Id: I01d42c2f051fd74b1474d9d8378ccc78174cf3cf Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Git-commit: f80cd4676998eb352d1a8b9df0f3663537a9ce93 Git-repo: https://android.googlesource.com/kernel/common/ [schikk@codeaurora.org: Resolved merge conflicts ] CRs-Fixed: 901628 Signed-off-by: Swetha Chikkaboraiah <schikk@codeaurora.org>
73 lines
1.5 KiB
C
73 lines
1.5 KiB
C
#ifndef _LINUX_USER_NAMESPACE_H
|
|
#define _LINUX_USER_NAMESPACE_H
|
|
|
|
#include <linux/kref.h>
|
|
#include <linux/nsproxy.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/err.h>
|
|
|
|
#define UIDHASH_BITS (CONFIG_BASE_SMALL ? 3 : 7)
|
|
#define UIDHASH_SZ (1 << UIDHASH_BITS)
|
|
|
|
struct user_namespace {
|
|
struct kref kref;
|
|
struct hlist_head uidhash_table[UIDHASH_SZ];
|
|
struct user_struct *creator;
|
|
struct work_struct destroyer;
|
|
unsigned int proc_inum;
|
|
};
|
|
|
|
extern struct user_namespace init_user_ns;
|
|
|
|
#ifdef CONFIG_USER_NS
|
|
|
|
static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
|
|
{
|
|
if (ns)
|
|
kref_get(&ns->kref);
|
|
return ns;
|
|
}
|
|
|
|
extern int create_user_ns(struct cred *new);
|
|
extern void free_user_ns(struct kref *kref);
|
|
|
|
static inline void put_user_ns(struct user_namespace *ns)
|
|
{
|
|
if (ns)
|
|
kref_put(&ns->kref, free_user_ns);
|
|
}
|
|
|
|
uid_t user_ns_map_uid(struct user_namespace *to, const struct cred *cred, uid_t uid);
|
|
gid_t user_ns_map_gid(struct user_namespace *to, const struct cred *cred, gid_t gid);
|
|
|
|
#else
|
|
|
|
static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
|
|
{
|
|
return &init_user_ns;
|
|
}
|
|
|
|
static inline int create_user_ns(struct cred *new)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline void put_user_ns(struct user_namespace *ns)
|
|
{
|
|
}
|
|
|
|
static inline uid_t user_ns_map_uid(struct user_namespace *to,
|
|
const struct cred *cred, uid_t uid)
|
|
{
|
|
return uid;
|
|
}
|
|
static inline gid_t user_ns_map_gid(struct user_namespace *to,
|
|
const struct cred *cred, gid_t gid)
|
|
{
|
|
return gid;
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif /* _LINUX_USER_H */
|