diff options
author | Christoph Hellwig <hch@lst.de> | 2011-07-23 11:37:31 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-07-25 14:30:23 -0400 |
commit | 4e34e719e457f2e031297175410fc0bd4016a085 (patch) | |
tree | ab969a371e0d2efc6bfbf503ca6cdfce3af3bf6c /fs/ocfs2 | |
parent | edde854e8bb34a7f32fa993d721f1da0faf64165 (diff) |
fs: take the ACL checks to common code
Replace the ->check_acl method with a ->get_acl method that simply reads an
ACL from disk after having a cache miss. This means we can replace the ACL
checking boilerplate code with a single implementation in namei.c.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/acl.c | 24 | ||||
-rw-r--r-- | fs/ocfs2/acl.h | 2 | ||||
-rw-r--r-- | fs/ocfs2/file.c | 4 | ||||
-rw-r--r-- | fs/ocfs2/namei.c | 2 |
4 files changed, 10 insertions, 22 deletions
diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index 480200e94e83..783c58d9daf1 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c | |||
@@ -290,7 +290,7 @@ static int ocfs2_set_acl(handle_t *handle, | |||
290 | return ret; | 290 | return ret; |
291 | } | 291 | } |
292 | 292 | ||
293 | int ocfs2_check_acl(struct inode *inode, int mask) | 293 | struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type) |
294 | { | 294 | { |
295 | struct ocfs2_super *osb; | 295 | struct ocfs2_super *osb; |
296 | struct buffer_head *di_bh = NULL; | 296 | struct buffer_head *di_bh = NULL; |
@@ -299,29 +299,17 @@ int ocfs2_check_acl(struct inode *inode, int mask) | |||
299 | 299 | ||
300 | osb = OCFS2_SB(inode->i_sb); | 300 | osb = OCFS2_SB(inode->i_sb); |
301 | if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) | 301 | if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) |
302 | return ret; | 302 | return NULL; |
303 | 303 | ||
304 | ret = ocfs2_read_inode_block(inode, &di_bh); | 304 | ret = ocfs2_read_inode_block(inode, &di_bh); |
305 | if (ret < 0) { | 305 | if (ret < 0) |
306 | mlog_errno(ret); | 306 | return ERR_PTR(ret); |
307 | return ret; | ||
308 | } | ||
309 | 307 | ||
310 | acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, di_bh); | 308 | acl = ocfs2_get_acl_nolock(inode, type, di_bh); |
311 | 309 | ||
312 | brelse(di_bh); | 310 | brelse(di_bh); |
313 | 311 | ||
314 | if (IS_ERR(acl)) { | 312 | return acl; |
315 | mlog_errno(PTR_ERR(acl)); | ||
316 | return PTR_ERR(acl); | ||
317 | } | ||
318 | if (acl) { | ||
319 | ret = posix_acl_permission(inode, acl, mask); | ||
320 | posix_acl_release(acl); | ||
321 | return ret; | ||
322 | } | ||
323 | |||
324 | return -EAGAIN; | ||
325 | } | 313 | } |
326 | 314 | ||
327 | int ocfs2_acl_chmod(struct inode *inode) | 315 | int ocfs2_acl_chmod(struct inode *inode) |
diff --git a/fs/ocfs2/acl.h b/fs/ocfs2/acl.h index 5c5d31f05853..071fbd380f2f 100644 --- a/fs/ocfs2/acl.h +++ b/fs/ocfs2/acl.h | |||
@@ -26,7 +26,7 @@ struct ocfs2_acl_entry { | |||
26 | __le32 e_id; | 26 | __le32 e_id; |
27 | }; | 27 | }; |
28 | 28 | ||
29 | extern int ocfs2_check_acl(struct inode *, int); | 29 | struct posix_acl *ocfs2_iop_get_acl(struct inode *inode, int type); |
30 | extern int ocfs2_acl_chmod(struct inode *); | 30 | extern int ocfs2_acl_chmod(struct inode *); |
31 | extern int ocfs2_init_acl(handle_t *, struct inode *, struct inode *, | 31 | extern int ocfs2_init_acl(handle_t *, struct inode *, struct inode *, |
32 | struct buffer_head *, struct buffer_head *, | 32 | struct buffer_head *, struct buffer_head *, |
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 0fc2bd34039d..de4ea1af041b 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c | |||
@@ -2600,14 +2600,14 @@ const struct inode_operations ocfs2_file_iops = { | |||
2600 | .listxattr = ocfs2_listxattr, | 2600 | .listxattr = ocfs2_listxattr, |
2601 | .removexattr = generic_removexattr, | 2601 | .removexattr = generic_removexattr, |
2602 | .fiemap = ocfs2_fiemap, | 2602 | .fiemap = ocfs2_fiemap, |
2603 | .check_acl = ocfs2_check_acl, | 2603 | .get_acl = ocfs2_iop_get_acl, |
2604 | }; | 2604 | }; |
2605 | 2605 | ||
2606 | const struct inode_operations ocfs2_special_file_iops = { | 2606 | const struct inode_operations ocfs2_special_file_iops = { |
2607 | .setattr = ocfs2_setattr, | 2607 | .setattr = ocfs2_setattr, |
2608 | .getattr = ocfs2_getattr, | 2608 | .getattr = ocfs2_getattr, |
2609 | .permission = ocfs2_permission, | 2609 | .permission = ocfs2_permission, |
2610 | .check_acl = ocfs2_check_acl, | 2610 | .get_acl = ocfs2_iop_get_acl, |
2611 | }; | 2611 | }; |
2612 | 2612 | ||
2613 | /* | 2613 | /* |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 33889dc52dd7..53aa41ed7bf3 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
@@ -2498,5 +2498,5 @@ const struct inode_operations ocfs2_dir_iops = { | |||
2498 | .listxattr = ocfs2_listxattr, | 2498 | .listxattr = ocfs2_listxattr, |
2499 | .removexattr = generic_removexattr, | 2499 | .removexattr = generic_removexattr, |
2500 | .fiemap = ocfs2_fiemap, | 2500 | .fiemap = ocfs2_fiemap, |
2501 | .check_acl = ocfs2_check_acl, | 2501 | .get_acl = ocfs2_iop_get_acl, |
2502 | }; | 2502 | }; |