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 <uapi/linux/posix_acl.h>
  16
  17struct posix_acl_entry {
  18        short                   e_tag;
  19        unsigned short          e_perm;
  20        union {
  21                kuid_t          e_uid;
  22                kgid_t          e_gid;
  23        };
  24};
  25
  26struct posix_acl {
  27        atomic_t                a_refcount;
  28        struct rcu_head         a_rcu;
  29        unsigned int            a_count;
  30        struct posix_acl_entry  a_entries[0];
  31};
  32
  33#define FOREACH_ACL_ENTRY(pa, acl, pe) \
  34        for(pa=(acl)->a_entries, pe=pa+(acl)->a_count; pa<pe; pa++)
  35
  36
  37/*
  38 * Duplicate an ACL handle.
  39 */
  40static inline struct posix_acl *
  41posix_acl_dup(struct posix_acl *acl)
  42{
  43        if (acl)
  44                atomic_inc(&acl->a_refcount);
  45        return acl;
  46}
  47
  48/*
  49 * Free an ACL handle.
  50 */
  51static inline void
  52posix_acl_release(struct posix_acl *acl)
  53{
  54        if (acl && atomic_dec_and_test(&acl->a_refcount))
  55                kfree_rcu(acl, a_rcu);
  56}
  57
  58
  59/* posix_acl.c */
  60
  61extern void posix_acl_init(struct posix_acl *, int);
  62extern struct posix_acl *posix_acl_alloc(int, gfp_t);
  63extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
  64extern int posix_acl_permission(struct inode *, const struct posix_acl *, int);
  65extern struct posix_acl *posix_acl_from_mode(umode_t, gfp_t);
  66extern int posix_acl_equiv_mode(const struct posix_acl *, umode_t *);
  67extern int __posix_acl_create(struct posix_acl **, gfp_t, umode_t *);
  68extern int __posix_acl_chmod(struct posix_acl **, gfp_t, umode_t);
  69
  70extern struct posix_acl *get_posix_acl(struct inode *, int);
  71extern int set_posix_acl(struct inode *, int, struct posix_acl *);
  72
  73#ifdef CONFIG_FS_POSIX_ACL
  74extern int posix_acl_chmod(struct inode *, umode_t);
  75extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **,
  76                struct posix_acl **);
  77extern int posix_acl_update_mode(struct inode *, umode_t *, struct posix_acl **);
  78
  79extern int simple_set_acl(struct inode *, struct posix_acl *, int);
  80extern int simple_acl_create(struct inode *, struct inode *);
  81
  82struct posix_acl *get_cached_acl(struct inode *inode, int type);
  83struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type);
  84void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl);
  85void forget_cached_acl(struct inode *inode, int type);
  86void forget_all_cached_acls(struct inode *inode);
  87
  88static inline void cache_no_acl(struct inode *inode)
  89{
  90        inode->i_acl = NULL;
  91        inode->i_default_acl = NULL;
  92}
  93#else
  94static inline int posix_acl_chmod(struct inode *inode, umode_t mode)
  95{
  96        return 0;
  97}
  98
  99#define simple_set_acl          NULL
 100
 101static inline int simple_acl_create(struct inode *dir, struct inode *inode)
 102{
 103        return 0;
 104}
 105static inline void cache_no_acl(struct inode *inode)
 106{
 107}
 108
 109static inline int posix_acl_create(struct inode *inode, umode_t *mode,
 110                struct posix_acl **default_acl, struct posix_acl **acl)
 111{
 112        *default_acl = *acl = NULL;
 113        return 0;
 114}
 115
 116static inline void forget_all_cached_acls(struct inode *inode)
 117{
 118}
 119#endif /* CONFIG_FS_POSIX_ACL */
 120
 121struct posix_acl *get_acl(struct inode *inode, int type);
 122
 123#endif  /* __LINUX_POSIX_ACL_H */
 124