Blame view

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