0001
0002 #ifndef _LINUX_PROJID_H
0003 #define _LINUX_PROJID_H
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <linux/types.h>
0016
0017 struct user_namespace;
0018 extern struct user_namespace init_user_ns;
0019
0020 typedef __kernel_uid32_t projid_t;
0021
0022 typedef struct {
0023 projid_t val;
0024 } kprojid_t;
0025
0026 static inline projid_t __kprojid_val(kprojid_t projid)
0027 {
0028 return projid.val;
0029 }
0030
0031 #define KPROJIDT_INIT(value) (kprojid_t){ value }
0032
0033 #define INVALID_PROJID KPROJIDT_INIT(-1)
0034 #define OVERFLOW_PROJID 65534
0035
0036 static inline bool projid_eq(kprojid_t left, kprojid_t right)
0037 {
0038 return __kprojid_val(left) == __kprojid_val(right);
0039 }
0040
0041 static inline bool projid_lt(kprojid_t left, kprojid_t right)
0042 {
0043 return __kprojid_val(left) < __kprojid_val(right);
0044 }
0045
0046 static inline bool projid_valid(kprojid_t projid)
0047 {
0048 return !projid_eq(projid, INVALID_PROJID);
0049 }
0050
0051 #ifdef CONFIG_USER_NS
0052
0053 extern kprojid_t make_kprojid(struct user_namespace *from, projid_t projid);
0054
0055 extern projid_t from_kprojid(struct user_namespace *to, kprojid_t projid);
0056 extern projid_t from_kprojid_munged(struct user_namespace *to, kprojid_t projid);
0057
0058 static inline bool kprojid_has_mapping(struct user_namespace *ns, kprojid_t projid)
0059 {
0060 return from_kprojid(ns, projid) != (projid_t)-1;
0061 }
0062
0063 #else
0064
0065 static inline kprojid_t make_kprojid(struct user_namespace *from, projid_t projid)
0066 {
0067 return KPROJIDT_INIT(projid);
0068 }
0069
0070 static inline projid_t from_kprojid(struct user_namespace *to, kprojid_t kprojid)
0071 {
0072 return __kprojid_val(kprojid);
0073 }
0074
0075 static inline projid_t from_kprojid_munged(struct user_namespace *to, kprojid_t kprojid)
0076 {
0077 projid_t projid = from_kprojid(to, kprojid);
0078 if (projid == (projid_t)-1)
0079 projid = OVERFLOW_PROJID;
0080 return projid;
0081 }
0082
0083 static inline bool kprojid_has_mapping(struct user_namespace *ns, kprojid_t projid)
0084 {
0085 return true;
0086 }
0087
0088 #endif
0089
0090 #endif