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