Branch data 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 : 0 : return __kprojid_val(left) == __kprojid_val(right); 39 : : } 40 : : 41 : : static inline bool projid_lt(kprojid_t left, kprojid_t right) 42 : : { 43 : 0 : 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 */