Loading fs/ocfs2/acl.c +27 −0 Original line number Diff line number Diff line Loading @@ -245,6 +245,33 @@ int ocfs2_check_acl(struct inode *inode, int mask) return -EAGAIN; } int ocfs2_acl_chmod(struct inode *inode) { struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); struct posix_acl *acl, *clone; int ret; if (S_ISLNK(inode->i_mode)) return -EOPNOTSUPP; if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) return 0; acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl) || !acl) return PTR_ERR(acl); clone = posix_acl_clone(acl, GFP_KERNEL); posix_acl_release(acl); if (!clone) return -ENOMEM; ret = posix_acl_chmod_masq(clone, inode->i_mode); if (!ret) ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, clone, NULL, NULL); posix_acl_release(clone); return ret; } static size_t ocfs2_xattr_list_acl_access(struct inode *inode, char *list, size_t list_len, Loading fs/ocfs2/acl.h +5 −0 Original line number Diff line number Diff line Loading @@ -29,10 +29,15 @@ struct ocfs2_acl_entry { #ifdef CONFIG_OCFS2_FS_POSIX_ACL extern int ocfs2_check_acl(struct inode *, int); extern int ocfs2_acl_chmod(struct inode *); #else /* CONFIG_OCFS2_FS_POSIX_ACL*/ #define ocfs2_check_acl NULL static inline int ocfs2_acl_chmod(struct inode *inode) { return 0; } #endif /* CONFIG_OCFS2_FS_POSIX_ACL*/ Loading fs/ocfs2/file.c +6 −0 Original line number Diff line number Diff line Loading @@ -990,6 +990,12 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) bail: brelse(bh); if (!status && attr->ia_valid & ATTR_MODE) { status = ocfs2_acl_chmod(inode); if (status < 0) mlog_errno(status); } mlog_exit(status); return status; } Loading Loading
fs/ocfs2/acl.c +27 −0 Original line number Diff line number Diff line Loading @@ -245,6 +245,33 @@ int ocfs2_check_acl(struct inode *inode, int mask) return -EAGAIN; } int ocfs2_acl_chmod(struct inode *inode) { struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); struct posix_acl *acl, *clone; int ret; if (S_ISLNK(inode->i_mode)) return -EOPNOTSUPP; if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL)) return 0; acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS); if (IS_ERR(acl) || !acl) return PTR_ERR(acl); clone = posix_acl_clone(acl, GFP_KERNEL); posix_acl_release(acl); if (!clone) return -ENOMEM; ret = posix_acl_chmod_masq(clone, inode->i_mode); if (!ret) ret = ocfs2_set_acl(NULL, inode, NULL, ACL_TYPE_ACCESS, clone, NULL, NULL); posix_acl_release(clone); return ret; } static size_t ocfs2_xattr_list_acl_access(struct inode *inode, char *list, size_t list_len, Loading
fs/ocfs2/acl.h +5 −0 Original line number Diff line number Diff line Loading @@ -29,10 +29,15 @@ struct ocfs2_acl_entry { #ifdef CONFIG_OCFS2_FS_POSIX_ACL extern int ocfs2_check_acl(struct inode *, int); extern int ocfs2_acl_chmod(struct inode *); #else /* CONFIG_OCFS2_FS_POSIX_ACL*/ #define ocfs2_check_acl NULL static inline int ocfs2_acl_chmod(struct inode *inode) { return 0; } #endif /* CONFIG_OCFS2_FS_POSIX_ACL*/ Loading
fs/ocfs2/file.c +6 −0 Original line number Diff line number Diff line Loading @@ -990,6 +990,12 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) bail: brelse(bh); if (!status && attr->ia_valid & ATTR_MODE) { status = ocfs2_acl_chmod(inode); if (status < 0) mlog_errno(status); } mlog_exit(status); return status; } Loading