fs: add get_acl helper
Factor out the code to get an ACL either from the inode or disk from check_acl, so that it can be used elsewhere later on. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jan Kara <jack@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
5c8ebd57b6
commit
2982baa2ae
24
fs/namei.c
24
fs/namei.c
|
@ -235,27 +235,9 @@ static int check_acl(struct inode *inode, int mask)
|
||||||
return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK);
|
return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
acl = get_cached_acl(inode, ACL_TYPE_ACCESS);
|
acl = get_acl(inode, ACL_TYPE_ACCESS);
|
||||||
|
if (IS_ERR(acl))
|
||||||
/*
|
return PTR_ERR(acl);
|
||||||
* A filesystem can force a ACL callback by just never filling the
|
|
||||||
* ACL cache. But normally you'd fill the cache either at inode
|
|
||||||
* instantiation time, or on the first ->get_acl call.
|
|
||||||
*
|
|
||||||
* If the filesystem doesn't have a get_acl() function at all, we'll
|
|
||||||
* just create the negative cache entry.
|
|
||||||
*/
|
|
||||||
if (acl == ACL_NOT_CACHED) {
|
|
||||||
if (inode->i_op->get_acl) {
|
|
||||||
acl = inode->i_op->get_acl(inode, ACL_TYPE_ACCESS);
|
|
||||||
if (IS_ERR(acl))
|
|
||||||
return PTR_ERR(acl);
|
|
||||||
} else {
|
|
||||||
set_cached_acl(inode, ACL_TYPE_ACCESS, NULL);
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (acl) {
|
if (acl) {
|
||||||
int error = posix_acl_permission(inode, acl, mask);
|
int error = posix_acl_permission(inode, acl, mask);
|
||||||
posix_acl_release(acl);
|
posix_acl_release(acl);
|
||||||
|
|
|
@ -26,6 +26,33 @@ EXPORT_SYMBOL(posix_acl_valid);
|
||||||
EXPORT_SYMBOL(posix_acl_equiv_mode);
|
EXPORT_SYMBOL(posix_acl_equiv_mode);
|
||||||
EXPORT_SYMBOL(posix_acl_from_mode);
|
EXPORT_SYMBOL(posix_acl_from_mode);
|
||||||
|
|
||||||
|
struct posix_acl *get_acl(struct inode *inode, int type)
|
||||||
|
{
|
||||||
|
struct posix_acl *acl;
|
||||||
|
|
||||||
|
acl = get_cached_acl(inode, type);
|
||||||
|
if (acl != ACL_NOT_CACHED)
|
||||||
|
return acl;
|
||||||
|
|
||||||
|
if (!IS_POSIXACL(inode))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A filesystem can force a ACL callback by just never filling the
|
||||||
|
* ACL cache. But normally you'd fill the cache either at inode
|
||||||
|
* instantiation time, or on the first ->get_acl call.
|
||||||
|
*
|
||||||
|
* If the filesystem doesn't have a get_acl() function at all, we'll
|
||||||
|
* just create the negative cache entry.
|
||||||
|
*/
|
||||||
|
if (!inode->i_op->get_acl) {
|
||||||
|
set_cached_acl(inode, type, NULL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return inode->i_op->get_acl(inode, type);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(get_acl);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init a fresh posix_acl
|
* Init a fresh posix_acl
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -175,4 +175,6 @@ static inline void cache_no_acl(struct inode *inode)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct posix_acl *get_acl(struct inode *inode, int type);
|
||||||
|
|
||||||
#endif /* __LINUX_POSIX_ACL_H */
|
#endif /* __LINUX_POSIX_ACL_H */
|
||||||
|
|
Loading…
Reference in New Issue