From 7464b95c734205cc05dbc450be3dd80dcfedfb9e Mon Sep 17 00:00:00 2001 From: Aneesh Kumar K.V Date: Mon, 9 Nov 2009 12:08:48 +0530 Subject: [RFC PATCH 11/14] richacl: Use directory specific mask values for operation on directories. Signed-off-by: Aneesh Kumar K.V --- fs/ext4/namei.c | 4 ++-- fs/richacl_base.c | 24 ++++++++++++++++-------- include/linux/richacl.h | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 708afaf..66c8408 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -2528,11 +2528,11 @@ end_rename: int ext4_permission(struct inode *inode, int mask) { - #ifdef CONFIG_EXT4_FS_RICHACL if (richacl_enabled(inode)) return ext4_richacl_permission(inode, - richacl_want_to_mask(mask)); + richacl_want_to_mask(mask, + S_ISDIR(inode->i_mode))); else #endif return generic_permission(inode, mask, ext4_check_acl); diff --git a/fs/richacl_base.c b/fs/richacl_base.c index 0d8953c..b5c28cf 100644 --- a/fs/richacl_base.c +++ b/fs/richacl_base.c @@ -188,16 +188,24 @@ EXPORT_SYMBOL_GPL(richacl_chmod); * When checking for append, @want is (MAY_WRITE | MAY_APPEND). */ unsigned int -richacl_want_to_mask(int want) +richacl_want_to_mask(int want, int is_dir) { unsigned int mask = 0; - - if (want & MAY_READ) - mask |= ACE4_READ_DATA; - if (want & MAY_APPEND) - mask |= ACE4_APPEND_DATA; - else if (want & MAY_WRITE) - mask |= ACE4_WRITE_DATA; + if (is_dir) { + if (want & MAY_READ) + mask |= ACE4_LIST_DIRECTORY; + if (want & MAY_APPEND) + mask |= ACE4_ADD_FILE | ACE4_ADD_SUBDIRECTORY; + else if (want & MAY_WRITE) + mask |= ACE4_ADD_FILE | ACE4_ADD_SUBDIRECTORY; + } else { + if (want & MAY_READ) + mask |= ACE4_READ_DATA; + if (want & MAY_APPEND) + mask |= ACE4_APPEND_DATA; + else if (want & MAY_WRITE) + mask |= ACE4_WRITE_DATA; + } if (want & MAY_EXEC) mask |= ACE4_EXECUTE; diff --git a/include/linux/richacl.h b/include/linux/richacl.h index b0df740..de71ca5 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -222,7 +222,7 @@ richace_is_deny(const struct richace *ace) extern struct richacl *richacl_alloc(int count); extern struct richacl *richacl_clone(const struct richacl *acl); -extern unsigned int richacl_want_to_mask(int want); +extern unsigned int richacl_want_to_mask(int want, int is_dir); extern int richacl_permission(struct inode *, const struct richacl *, unsigned int); extern int richacl_generic_permission(struct inode *, unsigned int); -- 1.6.5.2.74.g610f9