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