Branch data Line data Source code
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 : 0 : return __kprojid_val(left) == __kprojid_val(right);
53 : : }
54 : :
55 : : static inline bool projid_lt(kprojid_t left, kprojid_t right)
56 : : {
57 : 0 : return __kprojid_val(left) < __kprojid_val(right);
58 : : }
59 : :
60 : : static inline bool projid_valid(kprojid_t projid)
61 : : {
62 : 0 : 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 [ # # ]: 0 : 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 /* CONFIG_USER_NS */
103 : :
104 : : #endif /* _LINUX_PROJID_H */
|