linux/include/linux/posix_acl.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3  File: linux/posix_acl.h
   4
   5  (C) 2002 Andreas Gruenbacher, <a.gruenbacher@computer.org>
   6*/
   7
   8
   9#ifndef __LINUX_POSIX_ACL_H
  10#define __LINUX_POSIX_ACL_H
  11
  12#include <linux/bug.h>
  13#include <linux/slab.h>
  14#include <linux/rcupdate.h>
  15#include <linux/refcount.h>
  16#include <uapi/linux/posix_acl.h>
  17
  18struct user_namespace;
  19
  20struct posix_acl_entry {
  21        short                   e_tag;
  22        unsigned short          e_perm;
  23        union {
  24                kuid_t          e_uid;
  25                kgid_t          e_gid;
  26        };
  27};
  28
  29struct posix_acl {
  30        refcount_t              a_refcount;
  31        struct rcu_head         a_rcu;
  32        unsigned int            a_count;
  33        struct posix_acl_entry  a_entries[];
  34};
  35
  36#define FOREACH_ACL_ENTRY(pa, acl, pe) \
  37        for(pa=(acl)->a_entries, pe=pa+(acl)->a_count; pa<pe; pa++)
  38
  39
  40/*
  41 * Duplicate an ACL handle.
  42 */
  43static inline struct posix_acl *
  44posix_acl_dup(struct posix_acl *acl)
  45{
  46        if (acl)
  47                refcount_inc(&acl->a_refcount);
  48        return acl;
  49}
  50
  51/*
  52 * Free an ACL handle.
  53 */
  54static inline void
  55posix_acl_release(struct posix_acl *acl)
  56{
  57        if (acl && refcount_dec_and_test(&acl->a_refcount))
  58                kfree_rcu(acl, a_rcu);
  59}
  60
  61
  62/* posix_acl.c */
  63
  64extern void posix_acl_init(struct posix_acl *, int);
  65extern struct posix_acl *posix_acl_alloc(int, gfp_t);
  66extern struct posix_acl *posix_acl_from_mode(umode_t, gfp_t);
  67extern int posix_acl_equiv_mode(const struct posix_acl *, umode_t *);
  68extern int __posix_acl_create(struct posix_acl **, gfp_t, umode_t *);
  69extern int __posix_acl_chmod(struct posix_acl **, gfp_t, umode_t);
  70
  71extern struct posix_acl *get_posix_acl(struct inode *, int);
  72extern int set_posix_acl(struct user_namespace *, struct inode *, int,
  73                         struct posix_acl *);
  74
  75struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type);
  76
  77#ifdef CONFIG_FS_POSIX_ACL
  78int posix_acl_chmod(struct user_namespace *, struct inode *, umode_t);
  79extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **,
  80                struct posix_acl **);
  81int posix_acl_update_mode(struct user_namespace *, struct inode *, umode_t *,
  82                          struct posix_acl **);
  83
  84extern int simple_set_acl(struct user_namespace *, struct inode *,
  85                          struct posix_acl *, int);
  86extern int simple_acl_create(struct inode *, struct inode *);
  87
  88struct posix_acl *get_cached_acl(struct inode *inode, int type);
  89void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl);
  90void forget_cached_acl(struct inode *inode, int type);
  91void forget_all_cached_acls(struct inode *inode);
  92int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
  93int posix_acl_permission(struct user_namespace *, struct inode *,
  94                         const struct posix_acl *, int);
  95
  96static inline void cache_no_acl(struct inode *inode)
  97{
  98        inode->i_acl = NULL;
  99        inode->i_default_acl = NULL;
 100}
 101#else
 102static inline int posix_acl_chmod(struct user_namespace *mnt_userns,
 103                                  struct inode *inode, umode_t mode)
 104{
 105        return 0;
 106}
 107
 108#define simple_set_acl          NULL
 109
 110static inline int simple_acl_create(struct inode *dir, struct inode *inode)
 111{
 112        return 0;
 113}
 114static inline void cache_no_acl(struct inode *inode)
 115{
 116}
 117
 118static inline int posix_acl_create(struct inode *inode, umode_t *mode,
 119                struct posix_acl **default_acl, struct posix_acl **acl)
 120{
 121        *default_acl = *acl = NULL;
 122        return 0;
 123}
 124
 125static inline void forget_all_cached_acls(struct inode *inode)
 126{
 127}
 128#endif /* CONFIG_FS_POSIX_ACL */
 129
 130struct posix_acl *get_acl(struct inode *inode, int type);
 131
 132#endif  /* __LINUX_POSIX_ACL_H */
 133