diff options
author | Christoph Hellwig <hch@infradead.org> | 2013-12-20 08:16:38 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2014-01-25 23:58:16 -0500 |
commit | 2982baa2ae31eb23ce29b688ab2f77eb019062f3 (patch) | |
tree | 6c4046b236c983f2a8bdc3a760edb71de01fa33e | |
parent | 5c8ebd57b6a51daf53f75b7a16c45090a98a91a4 (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.c | 24 | ||||
-rw-r--r-- | fs/posix_acl.c | 27 | ||||
-rw-r--r-- | include/linux/posix_acl.h | 2 |
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); | |||
26 | EXPORT_SYMBOL(posix_acl_equiv_mode); | 26 | EXPORT_SYMBOL(posix_acl_equiv_mode); |
27 | EXPORT_SYMBOL(posix_acl_from_mode); | 27 | EXPORT_SYMBOL(posix_acl_from_mode); |
28 | 28 | ||
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 | |||
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 | ||
178 | struct posix_acl *get_acl(struct inode *inode, int type); | ||
179 | |||
178 | #endif /* __LINUX_POSIX_ACL_H */ | 180 | #endif /* __LINUX_POSIX_ACL_H */ |