linux/include/linux/projid.h
<<
>>
Prefs
   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
  17struct user_namespace;
  18extern struct user_namespace init_user_ns;
  19
  20typedef __kernel_uid32_t projid_t;
  21
  22typedef struct {
  23        projid_t val;
  24} kprojid_t;
  25
  26static 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
  36static inline bool projid_eq(kprojid_t left, kprojid_t right)
  37{
  38        return __kprojid_val(left) == __kprojid_val(right);
  39}
  40
  41static inline bool projid_lt(kprojid_t left, kprojid_t right)
  42{
  43        return __kprojid_val(left) < __kprojid_val(right);
  44}
  45
  46static inline bool projid_valid(kprojid_t projid)
  47{
  48        return !projid_eq(projid, INVALID_PROJID);
  49}
  50
  51#ifdef CONFIG_USER_NS
  52
  53extern kprojid_t make_kprojid(struct user_namespace *from, projid_t projid);
  54
  55extern projid_t from_kprojid(struct user_namespace *to, kprojid_t projid);
  56extern projid_t from_kprojid_munged(struct user_namespace *to, kprojid_t projid);
  57
  58static 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
  65static inline kprojid_t make_kprojid(struct user_namespace *from, projid_t projid)
  66{
  67        return KPROJIDT_INIT(projid);
  68}
  69
  70static inline projid_t from_kprojid(struct user_namespace *to, kprojid_t kprojid)
  71{
  72        return __kprojid_val(kprojid);
  73}
  74
  75static 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
  83static 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 */
  91