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