xref: /openbmc/linux/include/linux/posix_acl.h (revision f2620f16)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds   File: linux/posix_acl.h
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds   (C) 2002 Andreas Gruenbacher, <a.gruenbacher@computer.org>
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds #ifndef __LINUX_POSIX_ACL_H
101da177e4SLinus Torvalds #define __LINUX_POSIX_ACL_H
111da177e4SLinus Torvalds 
12187f1882SPaul Gortmaker #include <linux/bug.h>
131da177e4SLinus Torvalds #include <linux/slab.h>
143567866bSAl Viro #include <linux/rcupdate.h>
1566717260SElena Reshetova #include <linux/refcount.h>
16bc8bcf3bSAndreas Gruenbacher #include <uapi/linux/posix_acl.h>
171da177e4SLinus Torvalds 
1847291baaSChristian Brauner struct user_namespace;
1947291baaSChristian Brauner 
201da177e4SLinus Torvalds struct posix_acl_entry {
211da177e4SLinus Torvalds 	short			e_tag;
221da177e4SLinus Torvalds 	unsigned short		e_perm;
232f6f0654SEric W. Biederman 	union {
242f6f0654SEric W. Biederman 		kuid_t		e_uid;
252f6f0654SEric W. Biederman 		kgid_t		e_gid;
262f6f0654SEric W. Biederman 	};
271da177e4SLinus Torvalds };
281da177e4SLinus Torvalds 
291da177e4SLinus Torvalds struct posix_acl {
3066717260SElena Reshetova 	refcount_t		a_refcount;
313567866bSAl Viro 	struct rcu_head		a_rcu;
321da177e4SLinus Torvalds 	unsigned int		a_count;
3370f1451eSGustavo A. R. Silva 	struct posix_acl_entry	a_entries[];
341da177e4SLinus Torvalds };
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds #define FOREACH_ACL_ENTRY(pa, acl, pe) \
371da177e4SLinus Torvalds 	for(pa=(acl)->a_entries, pe=pa+(acl)->a_count; pa<pe; pa++)
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds /*
411da177e4SLinus Torvalds  * Duplicate an ACL handle.
421da177e4SLinus Torvalds  */
431da177e4SLinus Torvalds static inline struct posix_acl *
posix_acl_dup(struct posix_acl * acl)441da177e4SLinus Torvalds posix_acl_dup(struct posix_acl *acl)
451da177e4SLinus Torvalds {
461da177e4SLinus Torvalds 	if (acl)
4766717260SElena Reshetova 		refcount_inc(&acl->a_refcount);
481da177e4SLinus Torvalds 	return acl;
491da177e4SLinus Torvalds }
501da177e4SLinus Torvalds 
511da177e4SLinus Torvalds /*
521da177e4SLinus Torvalds  * Free an ACL handle.
531da177e4SLinus Torvalds  */
541da177e4SLinus Torvalds static inline void
posix_acl_release(struct posix_acl * acl)551da177e4SLinus Torvalds posix_acl_release(struct posix_acl *acl)
561da177e4SLinus Torvalds {
5766717260SElena Reshetova 	if (acl && refcount_dec_and_test(&acl->a_refcount))
583567866bSAl Viro 		kfree_rcu(acl, a_rcu);
591da177e4SLinus Torvalds }
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds /* posix_acl.c */
631da177e4SLinus Torvalds 
64f61f6da0SChuck Lever extern void posix_acl_init(struct posix_acl *, int);
65dd0fc66fSAl Viro extern struct posix_acl *posix_acl_alloc(int, gfp_t);
663a5fba19SAl Viro extern struct posix_acl *posix_acl_from_mode(umode_t, gfp_t);
67d6952123SAl Viro extern int posix_acl_equiv_mode(const struct posix_acl *, umode_t *);
6837bc1539SChristoph Hellwig extern int __posix_acl_create(struct posix_acl **, gfp_t, umode_t *);
695bf3258fSChristoph Hellwig extern int __posix_acl_chmod(struct posix_acl **, gfp_t, umode_t);
701da177e4SLinus Torvalds 
711da177e4SLinus Torvalds extern struct posix_acl *get_posix_acl(struct inode *, int);
7213e83a49SChristian Brauner int set_posix_acl(struct mnt_idmap *, struct dentry *, int,
73e65ce2a5SChristian Brauner 		  struct posix_acl *);
741da177e4SLinus Torvalds 
75332f606bSMiklos Szeredi struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type);
768043bffdSChristian Brauner struct posix_acl *posix_acl_clone(const struct posix_acl *acl, gfp_t flags);
77332f606bSMiklos Szeredi 
78641cf4a6SMarkus Trippelsdorf #ifdef CONFIG_FS_POSIX_ACL
7913e83a49SChristian Brauner int posix_acl_chmod(struct mnt_idmap *, struct dentry *, umode_t);
8037bc1539SChristoph Hellwig extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **,
8137bc1539SChristoph Hellwig 		struct posix_acl **);
82700b7940SChristian Brauner int posix_acl_update_mode(struct mnt_idmap *, struct inode *, umode_t *,
83e65ce2a5SChristian Brauner 			  struct posix_acl **);
845bf3258fSChristoph Hellwig 
8513e83a49SChristian Brauner int simple_set_acl(struct mnt_idmap *, struct dentry *,
86549c7297SChristian Brauner 		   struct posix_acl *, int);
87feda821eSChristoph Hellwig extern int simple_acl_create(struct inode *, struct inode *);
88feda821eSChristoph Hellwig 
890afaa120SAndrew Morton struct posix_acl *get_cached_acl(struct inode *inode, int type);
900afaa120SAndrew Morton void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl);
910afaa120SAndrew Morton void forget_cached_acl(struct inode *inode, int type);
920afaa120SAndrew Morton void forget_all_cached_acls(struct inode *inode);
9347291baaSChristian Brauner int posix_acl_valid(struct user_namespace *, const struct posix_acl *);
94700b7940SChristian Brauner int posix_acl_permission(struct mnt_idmap *, struct inode *,
9547291baaSChristian Brauner 			 const struct posix_acl *, int);
9672c04902SAl Viro 
cache_no_acl(struct inode * inode)9772c04902SAl Viro static inline void cache_no_acl(struct inode *inode)
9872c04902SAl Viro {
9972c04902SAl Viro 	inode->i_acl = NULL;
10072c04902SAl Viro 	inode->i_default_acl = NULL;
10172c04902SAl Viro }
102e4cc9163SChristian Brauner 
10313e83a49SChristian Brauner int vfs_set_acl(struct mnt_idmap *idmap, struct dentry *dentry,
104e4cc9163SChristian Brauner 		const char *acl_name, struct posix_acl *kacl);
10577435322SChristian Brauner struct posix_acl *vfs_get_acl(struct mnt_idmap *idmap,
1064f353ba4SChristian Brauner 			      struct dentry *dentry, const char *acl_name);
10713e83a49SChristian Brauner int vfs_remove_acl(struct mnt_idmap *idmap, struct dentry *dentry,
108aeb7f005SChristian Brauner 		   const char *acl_name);
109*f2620f16SChristian Brauner int posix_acl_listxattr(struct inode *inode, char **buffer,
110*f2620f16SChristian Brauner 			ssize_t *remaining_size);
1115bf3258fSChristoph Hellwig #else
posix_acl_chmod(struct mnt_idmap * idmap,struct dentry * dentry,umode_t mode)11213e83a49SChristian Brauner static inline int posix_acl_chmod(struct mnt_idmap *idmap,
113138060baSChristian Brauner 				  struct dentry *dentry, umode_t mode)
1145bf3258fSChristoph Hellwig {
1155bf3258fSChristoph Hellwig 	return 0;
1165bf3258fSChristoph Hellwig }
1175bf3258fSChristoph Hellwig 
118feda821eSChristoph Hellwig #define simple_set_acl		NULL
119feda821eSChristoph Hellwig 
simple_acl_create(struct inode * dir,struct inode * inode)120feda821eSChristoph Hellwig static inline int simple_acl_create(struct inode *dir, struct inode *inode)
121feda821eSChristoph Hellwig {
122feda821eSChristoph Hellwig 	return 0;
123feda821eSChristoph Hellwig }
cache_no_acl(struct inode * inode)1245bf3258fSChristoph Hellwig static inline void cache_no_acl(struct inode *inode)
1255bf3258fSChristoph Hellwig {
1265bf3258fSChristoph Hellwig }
12737bc1539SChristoph Hellwig 
posix_acl_create(struct inode * inode,umode_t * mode,struct posix_acl ** default_acl,struct posix_acl ** acl)12837bc1539SChristoph Hellwig static inline int posix_acl_create(struct inode *inode, umode_t *mode,
12937bc1539SChristoph Hellwig 		struct posix_acl **default_acl, struct posix_acl **acl)
13037bc1539SChristoph Hellwig {
13137bc1539SChristoph Hellwig 	*default_acl = *acl = NULL;
13237bc1539SChristoph Hellwig 	return 0;
13337bc1539SChristoph Hellwig }
134013cdf10SChristoph Hellwig 
forget_all_cached_acls(struct inode * inode)135013cdf10SChristoph Hellwig static inline void forget_all_cached_acls(struct inode *inode)
136013cdf10SChristoph Hellwig {
137013cdf10SChristoph Hellwig }
138e4cc9163SChristian Brauner 
vfs_set_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * name,struct posix_acl * acl)13913e83a49SChristian Brauner static inline int vfs_set_acl(struct mnt_idmap *idmap,
140e4cc9163SChristian Brauner 			      struct dentry *dentry, const char *name,
141e4cc9163SChristian Brauner 			      struct posix_acl *acl)
142e4cc9163SChristian Brauner {
143e4cc9163SChristian Brauner 	return -EOPNOTSUPP;
144e4cc9163SChristian Brauner }
1454f353ba4SChristian Brauner 
vfs_get_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * acl_name)14677435322SChristian Brauner static inline struct posix_acl *vfs_get_acl(struct mnt_idmap *idmap,
1474f353ba4SChristian Brauner 					    struct dentry *dentry,
1484f353ba4SChristian Brauner 					    const char *acl_name)
1494f353ba4SChristian Brauner {
1504f353ba4SChristian Brauner 	return ERR_PTR(-EOPNOTSUPP);
1514f353ba4SChristian Brauner }
152aeb7f005SChristian Brauner 
vfs_remove_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * acl_name)15313e83a49SChristian Brauner static inline int vfs_remove_acl(struct mnt_idmap *idmap,
154aeb7f005SChristian Brauner 				 struct dentry *dentry, const char *acl_name)
155aeb7f005SChristian Brauner {
156aeb7f005SChristian Brauner 	return -EOPNOTSUPP;
157aeb7f005SChristian Brauner }
posix_acl_listxattr(struct inode * inode,char ** buffer,ssize_t * remaining_size)158*f2620f16SChristian Brauner static inline int posix_acl_listxattr(struct inode *inode, char **buffer,
159*f2620f16SChristian Brauner 				      ssize_t *remaining_size)
160*f2620f16SChristian Brauner {
161*f2620f16SChristian Brauner 	return 0;
162*f2620f16SChristian Brauner }
1635bf3258fSChristoph Hellwig #endif /* CONFIG_FS_POSIX_ACL */
16472c04902SAl Viro 
165cac2f8b8SChristian Brauner struct posix_acl *get_inode_acl(struct inode *inode, int type);
1661da177e4SLinus Torvalds 
1671da177e4SLinus Torvalds #endif  /* __LINUX_POSIX_ACL_H */
168