diff options
author | Christoph Hellwig <hch@infradead.org> | 2014-01-30 11:56:36 -0500 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2014-01-30 22:26:17 -0500 |
commit | 758582361976e9640a1cb9516c0af10cdf8e4753 (patch) | |
tree | 28f1492a90891db65fbf1bd85daa69035052cbc0 | |
parent | 32d35d44d03c502a2fe2cd9ba9b70d5e220da439 (diff) |
ceph: simplify ceph_{get,init}_acl
- ->get_acl only gets called after we checked for a cached ACL, so no
need to call get_cached_acl again.
- no need to check IS_POSIXACL in ->get_acl, without that it should
never get set as all the callers that set it already have the check.
- you should be able to use the full posix_acl_create in CEPH
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r-- | fs/ceph/acl.c | 56 |
1 files changed, 16 insertions, 40 deletions
diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c index 66d377a12f7c..9ab312e49637 100644 --- a/fs/ceph/acl.c +++ b/fs/ceph/acl.c | |||
@@ -66,13 +66,6 @@ struct posix_acl *ceph_get_acl(struct inode *inode, int type) | |||
66 | char *value = NULL; | 66 | char *value = NULL; |
67 | struct posix_acl *acl; | 67 | struct posix_acl *acl; |
68 | 68 | ||
69 | if (!IS_POSIXACL(inode)) | ||
70 | return NULL; | ||
71 | |||
72 | acl = ceph_get_cached_acl(inode, type); | ||
73 | if (acl != ACL_NOT_CACHED) | ||
74 | return acl; | ||
75 | |||
76 | switch (type) { | 69 | switch (type) { |
77 | case ACL_TYPE_ACCESS: | 70 | case ACL_TYPE_ACCESS: |
78 | name = POSIX_ACL_XATTR_ACCESS; | 71 | name = POSIX_ACL_XATTR_ACCESS; |
@@ -190,41 +183,24 @@ out: | |||
190 | 183 | ||
191 | int ceph_init_acl(struct dentry *dentry, struct inode *inode, struct inode *dir) | 184 | int ceph_init_acl(struct dentry *dentry, struct inode *inode, struct inode *dir) |
192 | { | 185 | { |
193 | struct posix_acl *acl = NULL; | 186 | struct posix_acl *default_acl, *acl; |
194 | int ret = 0; | 187 | int error; |
195 | |||
196 | if (!S_ISLNK(inode->i_mode)) { | ||
197 | if (IS_POSIXACL(dir)) { | ||
198 | acl = ceph_get_acl(dir, ACL_TYPE_DEFAULT); | ||
199 | if (IS_ERR(acl)) { | ||
200 | ret = PTR_ERR(acl); | ||
201 | goto out; | ||
202 | } | ||
203 | } | ||
204 | 188 | ||
205 | if (!acl) | 189 | error = posix_acl_create(dir, &inode->i_mode, &default_acl, &acl); |
206 | inode->i_mode &= ~current_umask(); | 190 | if (error) |
207 | } | 191 | return error; |
208 | 192 | ||
209 | if (IS_POSIXACL(dir) && acl) { | 193 | if (!default_acl && !acl) |
210 | if (S_ISDIR(inode->i_mode)) { | ||
211 | ret = ceph_set_acl(inode, acl, ACL_TYPE_DEFAULT); | ||
212 | if (ret) | ||
213 | goto out_release; | ||
214 | } | ||
215 | ret = __posix_acl_create(&acl, GFP_NOFS, &inode->i_mode); | ||
216 | if (ret < 0) | ||
217 | goto out; | ||
218 | else if (ret > 0) | ||
219 | ret = ceph_set_acl(inode, acl, ACL_TYPE_ACCESS); | ||
220 | else | ||
221 | cache_no_acl(inode); | ||
222 | } else { | ||
223 | cache_no_acl(inode); | 194 | cache_no_acl(inode); |
224 | } | ||
225 | 195 | ||
226 | out_release: | 196 | if (default_acl) { |
227 | posix_acl_release(acl); | 197 | error = ceph_set_acl(inode, default_acl, ACL_TYPE_DEFAULT); |
228 | out: | 198 | posix_acl_release(default_acl); |
229 | return ret; | 199 | } |
200 | if (acl) { | ||
201 | if (!error) | ||
202 | error = ceph_set_acl(inode, acl, ACL_TYPE_ACCESS); | ||
203 | posix_acl_release(acl); | ||
204 | } | ||
205 | return error; | ||
230 | } | 206 | } |