summaryrefslogtreecommitdiff
path: root/fs/posix_acl.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2013-12-20 05:16:38 -0800
committerAl Viro <viro@zeniv.linux.org.uk>2014-01-25 23:58:16 -0500
commit2982baa2ae31eb23ce29b688ab2f77eb019062f3 (patch)
tree6c4046b236c983f2a8bdc3a760edb71de01fa33e /fs/posix_acl.c
parent5c8ebd57b6a51daf53f75b7a16c45090a98a91a4 (diff)
downloadlwn-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.c27
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
*/