diff options
author | Christoph Hellwig <hch@infradead.org> | 2013-12-20 05:16:38 -0800 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-01-25 23:58:16 -0500 |
commit | 2982baa2ae31eb23ce29b688ab2f77eb019062f3 (patch) | |
tree | 6c4046b236c983f2a8bdc3a760edb71de01fa33e /fs/posix_acl.c | |
parent | 5c8ebd57b6a51daf53f75b7a16c45090a98a91a4 (diff) | |
download | lwn-2982baa2ae31eb23ce29b688ab2f77eb019062f3.tar.gz lwn-2982baa2ae31eb23ce29b688ab2f77eb019062f3.zip |
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>
Diffstat (limited to 'fs/posix_acl.c')
-rw-r--r-- | fs/posix_acl.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 359d70b0e947..30524de49a6b 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -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 */ |