aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2013-12-20 08:16:38 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2014-01-25 23:58:16 -0500
commit2982baa2ae31eb23ce29b688ab2f77eb019062f3 (patch)
tree6c4046b236c983f2a8bdc3a760edb71de01fa33e
parent5c8ebd57b6a51daf53f75b7a16c45090a98a91a4 (diff)
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>
-rw-r--r--fs/namei.c24
-rw-r--r--fs/posix_acl.c27
-rw-r--r--include/linux/posix_acl.h2
3 files changed, 32 insertions, 21 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 3531deebad30..bcb838e2e52f 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -235,27 +235,9 @@ static int check_acl(struct inode *inode, int mask)
235 return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); 235 return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK);
236 } 236 }
237 237
238 acl = get_cached_acl(inode, ACL_TYPE_ACCESS); 238 acl = get_acl(inode, ACL_TYPE_ACCESS);
239 239 if (IS_ERR(acl))
240 /* 240 return PTR_ERR(acl);
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
259 if (acl) { 241 if (acl) {
260 int error = posix_acl_permission(inode, acl, mask); 242 int error = posix_acl_permission(inode, acl, mask);
261 posix_acl_release(acl); 243 posix_acl_release(acl);
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);
26EXPORT_SYMBOL(posix_acl_equiv_mode); 26EXPORT_SYMBOL(posix_acl_equiv_mode);
27EXPORT_SYMBOL(posix_acl_from_mode); 27EXPORT_SYMBOL(posix_acl_from_mode);
28 28
29struct 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}
54EXPORT_SYMBOL(get_acl);
55
29/* 56/*
30 * Init a fresh posix_acl 57 * Init a fresh posix_acl
31 */ 58 */
diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h
index 7931efe71175..a8d9918c0b20 100644
--- a/include/linux/posix_acl.h
+++ b/include/linux/posix_acl.h
@@ -175,4 +175,6 @@ static inline void cache_no_acl(struct inode *inode)
175#endif 175#endif
176} 176}
177 177
178struct posix_acl *get_acl(struct inode *inode, int type);
179
178#endif /* __LINUX_POSIX_ACL_H */ 180#endif /* __LINUX_POSIX_ACL_H */