diff options
Diffstat (limited to 'fs/ocfs2/acl.c')
-rw-r--r-- | fs/ocfs2/acl.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index a6a2bf6d6845..df72256c4422 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c | |||
@@ -245,6 +245,33 @@ int ocfs2_check_acl(struct inode *inode, int mask) | |||
245 | return -EAGAIN; | 245 | return -EAGAIN; |
246 | } | 246 | } |
247 | 247 | ||
248 | int ocfs2_acl_chmod(struct inode *inode) | ||
249 | { | ||
250 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
251 | struct posix_acl *acl, *clone; | ||
252 | int ret; | ||
253 | |||
254 | if (S_ISLNK(inode->i_mode)) | ||
255 | return -EOPNOTSUPP; | ||
256 | |||
257 | if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) | ||
258 | return 0; | ||
259 | |||
260 | acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); | ||
261 | if (IS_ERR(acl) || !acl) | ||
262 | return PTR_ERR(acl); | ||
263 | clone = posix_acl_clone(acl, GFP_KERNEL); | ||
264 | posix_acl_release(acl); | ||
265 | if (!clone) | ||
266 | return -ENOMEM; | ||
267 | ret = posix_acl_chmod_masq(clone, inode->i_mode); | ||
268 | if (!ret) | ||
269 | ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, | ||
270 | clone, NULL, NULL); | ||
271 | posix_acl_release(clone); | ||
272 | return ret; | ||
273 | } | ||
274 | |||
248 | static size_t ocfs2_xattr_list_acl_access(struct inode *inode, | 275 | static size_t ocfs2_xattr_list_acl_access(struct inode *inode, |
249 | char *list, | 276 | char *list, |
250 | size_t list_len, | 277 | size_t list_len, |