Skip to content

Commit

Permalink
fs: add get_acl helper
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Christoph Hellwig authored and Al Viro committed Jan 26, 2014
1 parent 5c8ebd5 commit 2982baa
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 21 deletions.
24 changes: 3 additions & 21 deletions fs/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -235,27 +235,9 @@ static int check_acl(struct inode *inode, int mask)
return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK);
}

acl = get_cached_acl(inode, ACL_TYPE_ACCESS);

/*
* 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;
}
}

acl = get_acl(inode, ACL_TYPE_ACCESS);
if (IS_ERR(acl))
return PTR_ERR(acl);
if (acl) {
int error = posix_acl_permission(inode, acl, mask);
posix_acl_release(acl);
Expand Down
27 changes: 27 additions & 0 deletions fs/posix_acl.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,33 @@ EXPORT_SYMBOL(posix_acl_valid);
EXPORT_SYMBOL(posix_acl_equiv_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
*/
Expand Down
2 changes: 2 additions & 0 deletions include/linux/posix_acl.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,4 +175,6 @@ static inline void cache_no_acl(struct inode *inode)
#endif
}

struct posix_acl *get_acl(struct inode *inode, int type);

#endif /* __LINUX_POSIX_ACL_H */

0 comments on commit 2982baa

Please sign in to comment.