| 1 | #ifndef _LINUX_PROJID_H
|
| 2 | #define _LINUX_PROJID_H
|
| 3 |
|
| 4 | |
| 5 | * A set of types for the internal kernel types representing project ids.
|
| 6 | *
|
| 7 | * The types defined in this header allow distinguishing which project ids in
|
| 8 | * the kernel are values used by userspace and which project id values are
|
| 9 | * the internal kernel values. With the addition of user namespaces the values
|
| 10 | * can be different. Using the type system makes it possible for the compiler
|
| 11 | * to detect when we overlook these differences.
|
| 12 | *
|
| 13 |
|
| 14 | #include <linux/types.h>
|
| 15 |
|
| 16 | struct user_namespace;
|
| 17 | extern struct user_namespace init_user_ns;
|
| 18 |
|
| 19 | typedef __kernel_uid32_t projid_t;
|
| 20 |
|
| 21 | #ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
|
| 22 |
|
| 23 | typedef struct {
|
| 24 | projid_t val;
|
| 25 | } kprojid_t;
|
| 26 |
|
| 27 | static inline projid_t __kprojid_val(kprojid_t projid)
|
| 28 | {
|
| 29 | return projid.val;
|
| 30 | }
|
| 31 |
|
| 32 | #define KPROJIDT_INIT(value) (kprojid_t){ value }
|
| 33 |
|
| 34 | #else
|
| 35 |
|
| 36 | typedef projid_t kprojid_t;
|
| 37 |
|
| 38 | static inline projid_t __kprojid_val(kprojid_t projid)
|
| 39 | {
|
| 40 | return projid;
|
| 41 | }
|
| 42 |
|
| 43 | #define KPROJIDT_INIT(value) ((kprojid_t) value )
|
| 44 |
|
| 45 | #endif
|
| 46 |
|
| 47 | #define INVALID_PROJID KPROJIDT_INIT(-1)
|
| 48 | #define OVERFLOW_PROJID 65534
|
| 49 |
|
| 50 | static inline bool projid_eq(kprojid_t left, kprojid_t right)
|
| 51 | {
|
| 52 | return __kprojid_val(left) == __kprojid_val(right);
|
| 53 | }
|
| 54 |
|
| 55 | static inline bool projid_lt(kprojid_t left, kprojid_t right)
|
| 56 | {
|
| 57 | return __kprojid_val(left) < __kprojid_val(right);
|
| 58 | }
|
| 59 |
|
| 60 | static inline bool projid_valid(kprojid_t projid)
|
| 61 | {
|
| 62 | return !projid_eq(projid, INVALID_PROJID);
|
| 63 | }
|
| 64 |
|
| 65 | #ifdef CONFIG_USER_NS
|
| 66 |
|
| 67 | extern kprojid_t make_kprojid(struct user_namespace *from, projid_t projid);
|
| 68 |
|
| 69 | extern projid_t from_kprojid(struct user_namespace *to, kprojid_t projid);
|
| 70 | extern projid_t from_kprojid_munged(struct user_namespace *to, kprojid_t projid);
|
| 71 |
|
| 72 | static inline bool kprojid_has_mapping(struct user_namespace *ns, kprojid_t projid)
|
| 73 | {
|
| 74 | return from_kprojid(ns, projid) != (projid_t)-1;
|
| 75 | }
|
| 76 |
|
| 77 | #else
|
| 78 |
|
| 79 | static inline kprojid_t make_kprojid(struct user_namespace *from, projid_t projid)
|
| 80 | {
|
| 81 | return KPROJIDT_INIT(projid);
|
| 82 | }
|
| 83 |
|
| 84 | static inline projid_t from_kprojid(struct user_namespace *to, kprojid_t kprojid)
|
| 85 | {
|
| 86 | return __kprojid_val(kprojid);
|
| 87 | }
|
| 88 |
|
| 89 | static inline projid_t from_kprojid_munged(struct user_namespace *to, kprojid_t kprojid)
|
| 90 | {
|
| 91 | projid_t projid = from_kprojid(to, kprojid);
|
| 92 | if (projid == (projid_t)-1)
|
| 93 | projid = OVERFLOW_PROJID;
|
| 94 | return projid;
|
| 95 | }
|
| 96 |
|
| 97 | static inline bool kprojid_has_mapping(struct user_namespace *ns, kprojid_t projid)
|
| 98 | {
|
| 99 | return true;
|
| 100 | }
|
| 101 |
|
| 102 | #endif
|
| 103 |
|
| 104 | #endif
|