File: /Users/paulross/dev/linux/linux-3.13/include/linux/projid.h

Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.

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