Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _LINUX_PROJID_H
0003 #define _LINUX_PROJID_H
0004 
0005 /*
0006  * A set of types for the internal kernel types representing project ids.
0007  *
0008  * The types defined in this header allow distinguishing which project ids in
0009  * the kernel are values used by userspace and which project id values are
0010  * the internal kernel values.  With the addition of user namespaces the values
0011  * can be different.  Using the type system makes it possible for the compiler
0012  * to detect when we overlook these differences.
0013  *
0014  */
0015 #include <linux/types.h>
0016 
0017 struct user_namespace;
0018 extern struct user_namespace init_user_ns;
0019 
0020 typedef __kernel_uid32_t projid_t;
0021 
0022 typedef struct {
0023     projid_t val;
0024 } kprojid_t;
0025 
0026 static inline projid_t __kprojid_val(kprojid_t projid)
0027 {
0028     return projid.val;
0029 }
0030 
0031 #define KPROJIDT_INIT(value) (kprojid_t){ value }
0032 
0033 #define INVALID_PROJID KPROJIDT_INIT(-1)
0034 #define OVERFLOW_PROJID 65534
0035 
0036 static inline bool projid_eq(kprojid_t left, kprojid_t right)
0037 {
0038     return __kprojid_val(left) == __kprojid_val(right);
0039 }
0040 
0041 static inline bool projid_lt(kprojid_t left, kprojid_t right)
0042 {
0043     return __kprojid_val(left) < __kprojid_val(right);
0044 }
0045 
0046 static inline bool projid_valid(kprojid_t projid)
0047 {
0048     return !projid_eq(projid, INVALID_PROJID);
0049 }
0050 
0051 #ifdef CONFIG_USER_NS
0052 
0053 extern kprojid_t make_kprojid(struct user_namespace *from, projid_t projid);
0054 
0055 extern projid_t from_kprojid(struct user_namespace *to, kprojid_t projid);
0056 extern projid_t from_kprojid_munged(struct user_namespace *to, kprojid_t projid);
0057 
0058 static inline bool kprojid_has_mapping(struct user_namespace *ns, kprojid_t projid)
0059 {
0060     return from_kprojid(ns, projid) != (projid_t)-1;
0061 }
0062 
0063 #else
0064 
0065 static inline kprojid_t make_kprojid(struct user_namespace *from, projid_t projid)
0066 {
0067     return KPROJIDT_INIT(projid);
0068 }
0069 
0070 static inline projid_t from_kprojid(struct user_namespace *to, kprojid_t kprojid)
0071 {
0072     return __kprojid_val(kprojid);
0073 }
0074 
0075 static inline projid_t from_kprojid_munged(struct user_namespace *to, kprojid_t kprojid)
0076 {
0077     projid_t projid = from_kprojid(to, kprojid);
0078     if (projid == (projid_t)-1)
0079         projid = OVERFLOW_PROJID;
0080     return projid;
0081 }
0082 
0083 static inline bool kprojid_has_mapping(struct user_namespace *ns, kprojid_t projid)
0084 {
0085     return true;
0086 }
0087 
0088 #endif /* CONFIG_USER_NS */
0089 
0090 #endif /* _LINUX_PROJID_H */