root/include/linux/projid.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. __kprojid_val
  2. projid_eq
  3. projid_lt
  4. projid_valid
  5. kprojid_has_mapping
  6. make_kprojid
  7. from_kprojid
  8. from_kprojid_munged
  9. kprojid_has_mapping

   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         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 */

/* [<][>][^][v][top][bottom][index][help] */