You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
qubes-linux-kernel/patches.suse/richacl-fix

236 lines
8.1 KiB

From: Jeff Mahoney <jeffm@suse.com>
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 <jeffm@suse.com>
---
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;
}