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