Branch data Line data Source code
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 : : 18 : : struct 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 : : 27 : : struct 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 : : */ 41 : : static inline struct posix_acl * 42 : : posix_acl_dup(struct posix_acl *acl) 43 : : { 44 : 3 : if (acl) 45 : 3 : refcount_inc(&acl->a_refcount); 46 : : return acl; 47 : : } 48 : : 49 : : /* 50 : : * Free an ACL handle. 51 : : */ 52 : : static inline void 53 : 3 : posix_acl_release(struct posix_acl *acl) 54 : : { 55 : 3 : if (acl && refcount_dec_and_test(&acl->a_refcount)) 56 : 3 : kfree_rcu(acl, a_rcu); 57 : 3 : } 58 : : 59 : : 60 : : /* posix_acl.c */ 61 : : 62 : : extern void posix_acl_init(struct posix_acl *, int); 63 : : extern struct posix_acl *posix_acl_alloc(int, gfp_t); 64 : : extern int posix_acl_valid(struct user_namespace *, const struct posix_acl *); 65 : : extern int posix_acl_permission(struct inode *, const struct posix_acl *, int); 66 : : extern struct posix_acl *posix_acl_from_mode(umode_t, gfp_t); 67 : : extern int posix_acl_equiv_mode(const struct posix_acl *, umode_t *); 68 : : extern int __posix_acl_create(struct posix_acl **, gfp_t, umode_t *); 69 : : extern int __posix_acl_chmod(struct posix_acl **, gfp_t, umode_t); 70 : : 71 : : extern struct posix_acl *get_posix_acl(struct inode *, int); 72 : : extern int set_posix_acl(struct inode *, int, struct posix_acl *); 73 : : 74 : : #ifdef CONFIG_FS_POSIX_ACL 75 : : extern int posix_acl_chmod(struct inode *, umode_t); 76 : : extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, 77 : : struct posix_acl **); 78 : : extern int posix_acl_update_mode(struct inode *, umode_t *, struct posix_acl **); 79 : : 80 : : extern int simple_set_acl(struct inode *, struct posix_acl *, int); 81 : : extern int simple_acl_create(struct inode *, struct inode *); 82 : : 83 : : struct posix_acl *get_cached_acl(struct inode *inode, int type); 84 : : struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type); 85 : : void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl); 86 : : void forget_cached_acl(struct inode *inode, int type); 87 : : void forget_all_cached_acls(struct inode *inode); 88 : : 89 : : static inline void cache_no_acl(struct inode *inode) 90 : : { 91 : 3 : inode->i_acl = NULL; 92 : 3 : inode->i_default_acl = NULL; 93 : : } 94 : : #else 95 : : static inline int posix_acl_chmod(struct inode *inode, umode_t mode) 96 : : { 97 : : return 0; 98 : : } 99 : : 100 : : #define simple_set_acl NULL 101 : : 102 : : static inline int simple_acl_create(struct inode *dir, struct inode *inode) 103 : : { 104 : : return 0; 105 : : } 106 : : static inline void cache_no_acl(struct inode *inode) 107 : : { 108 : : } 109 : : 110 : : static 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 : : 117 : : static inline void forget_all_cached_acls(struct inode *inode) 118 : : { 119 : : } 120 : : #endif /* CONFIG_FS_POSIX_ACL */ 121 : : 122 : : struct posix_acl *get_acl(struct inode *inode, int type); 123 : : 124 : : #endif /* __LINUX_POSIX_ACL_H */