From: Jeff Mahoney Subject: richacl: Adopt 2.6.38 API Patch-mainline: dependent on local patches This patch addresses changes in the inode_operations->permission prototype. Signed-off-by: Jeff Mahoney --- fs/ext4/richacl.c | 13 +++++++------ fs/ext4/richacl.h | 4 ++-- fs/richacl_base.c | 2 +- fs/richacl_inode.c | 34 +++++++++++++++++++--------------- include/linux/richacl.h | 16 ++++++++++------ 5 files changed, 39 insertions(+), 30 deletions(-) --- a/fs/ext4/richacl.c +++ b/fs/ext4/richacl.c @@ -120,7 +120,8 @@ ext4_set_richacl(handle_t *handle, struc } int -ext4_richacl_permission(struct inode *inode, unsigned int mask) +ext4_richacl_permission(struct inode *inode, unsigned int mask, + unsigned int flags) { struct richacl *acl; int retval; @@ -132,20 +133,20 @@ ext4_richacl_permission(struct inode *in if (acl && IS_ERR(acl)) retval = PTR_ERR(acl); else { - retval = richacl_inode_permission(inode, acl, mask); + retval = richacl_inode_permission(inode, acl, mask, flags); richacl_put(acl); } return retval; } -int ext4_permission(struct inode *inode, int mask) +int ext4_permission(struct inode *inode, int mask, unsigned int flags) { if (IS_RICHACL(inode)) return ext4_richacl_permission(inode, - richacl_want_to_mask(mask)); + richacl_want_to_mask(mask), flags); else - return generic_permission(inode, mask, ext4_check_acl); + return generic_permission(inode, mask, flags, ext4_check_acl); } int ext4_may_create(struct inode *dir, int isdir) @@ -260,7 +261,7 @@ ext4_xattr_set_richacl(struct dentry *de if (strcmp(name, "") != 0) return -EINVAL; if (current_fsuid() != inode->i_uid && - ext4_richacl_permission(inode, ACE4_WRITE_ACL) && + ext4_richacl_permission(inode, ACE4_WRITE_ACL, 0) && !capable(CAP_FOWNER)) return -EPERM; if (value) { --- a/fs/ext4/richacl.h +++ b/fs/ext4/richacl.h @@ -24,8 +24,8 @@ /* Value for i_richacl if RICHACL has not been cached */ # define EXT4_RICHACL_NOT_CACHED ((void *)-1) -extern int ext4_permission(struct inode *, int); -extern int ext4_richacl_permission(struct inode *, unsigned int); +extern int ext4_permission(struct inode *, int, unsigned int); +extern int ext4_richacl_permission(struct inode *, unsigned int, unsigned int); extern int ext4_may_create(struct inode *, int); extern int ext4_may_delete(struct inode *, struct inode *, int); extern int ext4_init_richacl(handle_t *, struct inode *, struct inode *); --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -381,7 +381,7 @@ EXPORT_SYMBOL_GPL(richacl_chmod); */ int richacl_permission(struct inode *inode, const struct richacl *acl, - unsigned int mask) + unsigned int mask, unsigned int flags) { const struct richace *ace; unsigned int file_mask, requested = mask, denied = 0; --- a/fs/richacl_inode.c +++ b/fs/richacl_inode.c @@ -23,14 +23,15 @@ */ int richacl_may_create(struct inode *dir, int isdir, - int (*richacl_permission)(struct inode *, unsigned int)) + int (*richacl_permission)(struct inode *, unsigned int, + unsigned int)) { if (IS_RICHACL(dir)) return richacl_permission(dir, ACE4_EXECUTE | (isdir ? - ACE4_ADD_SUBDIRECTORY : ACE4_ADD_FILE)); + ACE4_ADD_SUBDIRECTORY : ACE4_ADD_FILE), 0); else - return generic_permission(dir, MAY_WRITE | MAY_EXEC, + return generic_permission(dir, MAY_WRITE | MAY_EXEC, 0, dir->i_op->check_acl); } EXPORT_SYMBOL(richacl_may_create); @@ -52,23 +53,25 @@ check_sticky(struct inode *dir, struct i */ int richacl_may_delete(struct inode *dir, struct inode *inode, int replace, - int (*richacl_permission)(struct inode *, unsigned int)) + int (*richacl_permission)(struct inode *, unsigned int, + unsigned int)) { int error; if (IS_RICHACL(inode)) { error = richacl_permission(dir, - ACE4_EXECUTE | ACE4_DELETE_CHILD); + ACE4_EXECUTE | ACE4_DELETE_CHILD, 0); if (!error && check_sticky(dir, inode)) error = -EPERM; - if (error && !richacl_permission(inode, ACE4_DELETE)) + if (error && !richacl_permission(inode, ACE4_DELETE, 0)) error = 0; if (!error && replace) error = richacl_permission(dir, ACE4_EXECUTE | (S_ISDIR(inode->i_mode) ? - ACE4_ADD_SUBDIRECTORY : ACE4_ADD_FILE)); + ACE4_ADD_SUBDIRECTORY : ACE4_ADD_FILE), + 0); } else { - error = generic_permission(dir, MAY_WRITE | MAY_EXEC, + error = generic_permission(dir, MAY_WRITE | MAY_EXEC, 0, dir->i_op->check_acl); if (!error && check_sticky(dir, inode)) error = -EPERM; @@ -89,10 +92,10 @@ EXPORT_SYMBOL(richacl_may_delete); */ int richacl_inode_permission(struct inode *inode, const struct richacl *acl, - unsigned int mask) + unsigned int mask, unsigned int flags) { if (acl) { - if (!richacl_permission(inode, acl, mask)) + if (!richacl_permission(inode, acl, mask, flags)) return 0; } else { int mode = inode->i_mode; @@ -140,7 +143,8 @@ EXPORT_SYMBOL_GPL(richacl_inode_permissi */ int richacl_inode_change_ok(struct inode *inode, struct iattr *attr, - int (*richacl_permission)(struct inode *, unsigned int)) + int (*richacl_permission)(struct inode *, unsigned int, + unsigned int)) { unsigned int ia_valid = attr->ia_valid; @@ -153,7 +157,7 @@ richacl_inode_change_ok(struct inode *in (current_fsuid() != inode->i_uid || attr->ia_uid != inode->i_uid) && (current_fsuid() != attr->ia_uid || - richacl_permission(inode, ACE4_WRITE_OWNER)) && + richacl_permission(inode, ACE4_WRITE_OWNER, 0)) && !capable(CAP_CHOWN)) goto error; @@ -163,7 +167,7 @@ richacl_inode_change_ok(struct inode *in if ((current_fsuid() != inode->i_uid || (!in_group && attr->ia_gid != inode->i_gid)) && (!in_group || - richacl_permission(inode, ACE4_WRITE_OWNER)) && + richacl_permission(inode, ACE4_WRITE_OWNER, 0)) && !capable(CAP_CHOWN)) goto error; } @@ -171,7 +175,7 @@ richacl_inode_change_ok(struct inode *in /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { if (current_fsuid() != inode->i_uid && - richacl_permission(inode, ACE4_WRITE_ACL) && + richacl_permission(inode, ACE4_WRITE_ACL, 0) && !capable(CAP_FOWNER)) goto error; /* Also check the setgid bit! */ @@ -183,7 +187,7 @@ richacl_inode_change_ok(struct inode *in /* Check for setting the inode time. */ if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) { if (current_fsuid() != inode->i_uid && - richacl_permission(inode, ACE4_WRITE_ATTRIBUTES) && + richacl_permission(inode, ACE4_WRITE_ATTRIBUTES, 0) && !capable(CAP_FOWNER)) goto error; } --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -294,7 +294,7 @@ extern unsigned int richacl_want_to_mask extern void richacl_compute_max_masks(struct richacl *); extern struct richacl *richacl_chmod(struct richacl *, mode_t); extern int richacl_permission(struct inode *, const struct richacl *, - unsigned int); + unsigned int, unsigned int); extern struct richacl *richacl_inherit(const struct richacl *, struct inode *); extern int richacl_equiv_mode(const struct richacl *, mode_t *); @@ -302,18 +302,22 @@ extern int richacl_equiv_mode(const stru #ifdef CONFIG_FS_RICHACL extern int richacl_may_create(struct inode *, int, - int (*)(struct inode *, unsigned int)); + int (*)(struct inode *, unsigned int, + unsigned int)); extern int richacl_may_delete(struct inode *, struct inode *, int, - int (*)(struct inode *, unsigned int)); + int (*)(struct inode *, unsigned int, + unsigned int)); extern int richacl_inode_permission(struct inode *, const struct richacl *, - unsigned int); + unsigned int, unsigned int); extern int richacl_inode_change_ok(struct inode *, struct iattr *, - int (*)(struct inode *, unsigned int)); + int (*)(struct inode *, unsigned int, + unsigned int)); #else static inline int richacl_inode_change_ok(struct inode *inode, struct iattr *attr, int (*richacl_permission)(struct inode *inode, - unsigned int mask)) + unsigned int mask, + unsigned int flags)) { return -EPERM; }