Skip to content

Commit 2982baa

Browse files
Christoph HellwigAl Viro
authored andcommitted
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>
1 parent 5c8ebd5 commit 2982baa

File tree

3 files changed

+32
-21
lines changed

3 files changed

+32
-21
lines changed

fs/namei.c

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -235,27 +235,9 @@ static int check_acl(struct inode *inode, int mask)
235235
return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK);
236236
}
237237

238-
acl = get_cached_acl(inode, ACL_TYPE_ACCESS);
239-
240-
/*
241-
* A filesystem can force a ACL callback by just never filling the
242-
* ACL cache. But normally you'd fill the cache either at inode
243-
* instantiation time, or on the first ->get_acl call.
244-
*
245-
* If the filesystem doesn't have a get_acl() function at all, we'll
246-
* just create the negative cache entry.
247-
*/
248-
if (acl == ACL_NOT_CACHED) {
249-
if (inode->i_op->get_acl) {
250-
acl = inode->i_op->get_acl(inode, ACL_TYPE_ACCESS);
251-
if (IS_ERR(acl))
252-
return PTR_ERR(acl);
253-
} else {
254-
set_cached_acl(inode, ACL_TYPE_ACCESS, NULL);
255-
return -EAGAIN;
256-
}
257-
}
258-
238+
acl = get_acl(inode, ACL_TYPE_ACCESS);
239+
if (IS_ERR(acl))
240+
return PTR_ERR(acl);
259241
if (acl) {
260242
int error = posix_acl_permission(inode, acl, mask);
261243
posix_acl_release(acl);

fs/posix_acl.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,33 @@ EXPORT_SYMBOL(posix_acl_valid);
2626
EXPORT_SYMBOL(posix_acl_equiv_mode);
2727
EXPORT_SYMBOL(posix_acl_from_mode);
2828

29+
struct posix_acl *get_acl(struct inode *inode, int type)
30+
{
31+
struct posix_acl *acl;
32+
33+
acl = get_cached_acl(inode, type);
34+
if (acl != ACL_NOT_CACHED)
35+
return acl;
36+
37+
if (!IS_POSIXACL(inode))
38+
return NULL;
39+
40+
/*
41+
* A filesystem can force a ACL callback by just never filling the
42+
* ACL cache. But normally you'd fill the cache either at inode
43+
* instantiation time, or on the first ->get_acl call.
44+
*
45+
* If the filesystem doesn't have a get_acl() function at all, we'll
46+
* just create the negative cache entry.
47+
*/
48+
if (!inode->i_op->get_acl) {
49+
set_cached_acl(inode, type, NULL);
50+
return NULL;
51+
}
52+
return inode->i_op->get_acl(inode, type);
53+
}
54+
EXPORT_SYMBOL(get_acl);
55+
2956
/*
3057
* Init a fresh posix_acl
3158
*/

include/linux/posix_acl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,4 +175,6 @@ static inline void cache_no_acl(struct inode *inode)
175175
#endif
176176
}
177177

178+
struct posix_acl *get_acl(struct inode *inode, int type);
179+
178180
#endif /* __LINUX_POSIX_ACL_H */

0 commit comments

Comments
 (0)