diff options
| -rw-r--r-- | fs/ocfs2/acl.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index 5a2177833210..a76e0aa5cd3f 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c | |||
| @@ -290,12 +290,30 @@ static int ocfs2_set_acl(handle_t *handle, | |||
| 290 | 290 | ||
| 291 | int ocfs2_check_acl(struct inode *inode, int mask) | 291 | int ocfs2_check_acl(struct inode *inode, int mask) |
| 292 | { | 292 | { |
| 293 | struct posix_acl *acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); | 293 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
| 294 | struct buffer_head *di_bh = NULL; | ||
| 295 | struct posix_acl *acl; | ||
| 296 | int ret = -EAGAIN; | ||
| 294 | 297 | ||
| 295 | if (IS_ERR(acl)) | 298 | if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) |
| 299 | return ret; | ||
| 300 | |||
| 301 | ret = ocfs2_read_inode_block(inode, &di_bh); | ||
| 302 | if (ret < 0) { | ||
| 303 | mlog_errno(ret); | ||
| 304 | return ret; | ||
| 305 | } | ||
| 306 | |||
| 307 | acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, di_bh); | ||
| 308 | |||
| 309 | brelse(di_bh); | ||
| 310 | |||
| 311 | if (IS_ERR(acl)) { | ||
| 312 | mlog_errno(PTR_ERR(acl)); | ||
| 296 | return PTR_ERR(acl); | 313 | return PTR_ERR(acl); |
| 314 | } | ||
| 297 | if (acl) { | 315 | if (acl) { |
| 298 | int ret = posix_acl_permission(inode, acl, mask); | 316 | ret = posix_acl_permission(inode, acl, mask); |
| 299 | posix_acl_release(acl); | 317 | posix_acl_release(acl); |
| 300 | return ret; | 318 | return ret; |
| 301 | } | 319 | } |
