Commit 9186d472 authored by Konstantin Komarov's avatar Konstantin Komarov

fs/ntfs3: In function ntfs_set_acl_ex do not change inode->i_mode if called...

fs/ntfs3: In function ntfs_set_acl_ex do not change inode->i_mode if called from function ntfs_init_acl

ntfs_init_acl sets mode. ntfs_init_acl calls ntfs_set_acl_ex.
ntfs_set_acl_ex must not change this mode.
Fixes xfstest generic/444
Fixes: be71b5cb ("fs/ntfs3: Add attrib operations")
Reviewed-by: default avatarJoe Perches <joe@perches.com>
Signed-off-by: default avatarKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
parent 3a2154b2
...@@ -543,7 +543,7 @@ struct posix_acl *ntfs_get_acl(struct inode *inode, int type, bool rcu) ...@@ -543,7 +543,7 @@ struct posix_acl *ntfs_get_acl(struct inode *inode, int type, bool rcu)
static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns, static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
struct inode *inode, struct posix_acl *acl, struct inode *inode, struct posix_acl *acl,
int type) int type, bool init_acl)
{ {
const char *name; const char *name;
size_t size, name_len; size_t size, name_len;
...@@ -556,8 +556,9 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns, ...@@ -556,8 +556,9 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
switch (type) { switch (type) {
case ACL_TYPE_ACCESS: case ACL_TYPE_ACCESS:
if (acl) { /* Do not change i_mode if we are in init_acl */
umode_t mode = inode->i_mode; if (acl && !init_acl) {
umode_t mode;
err = posix_acl_update_mode(mnt_userns, inode, &mode, err = posix_acl_update_mode(mnt_userns, inode, &mode,
&acl); &acl);
...@@ -618,7 +619,7 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns, ...@@ -618,7 +619,7 @@ static noinline int ntfs_set_acl_ex(struct user_namespace *mnt_userns,
int ntfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode, int ntfs_set_acl(struct user_namespace *mnt_userns, struct inode *inode,
struct posix_acl *acl, int type) struct posix_acl *acl, int type)
{ {
return ntfs_set_acl_ex(mnt_userns, inode, acl, type); return ntfs_set_acl_ex(mnt_userns, inode, acl, type, false);
} }
static int ntfs_xattr_get_acl(struct user_namespace *mnt_userns, static int ntfs_xattr_get_acl(struct user_namespace *mnt_userns,
...@@ -699,7 +700,7 @@ int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode, ...@@ -699,7 +700,7 @@ int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode,
if (default_acl) { if (default_acl) {
err = ntfs_set_acl_ex(mnt_userns, inode, default_acl, err = ntfs_set_acl_ex(mnt_userns, inode, default_acl,
ACL_TYPE_DEFAULT); ACL_TYPE_DEFAULT, true);
posix_acl_release(default_acl); posix_acl_release(default_acl);
} else { } else {
inode->i_default_acl = NULL; inode->i_default_acl = NULL;
...@@ -710,7 +711,7 @@ int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode, ...@@ -710,7 +711,7 @@ int ntfs_init_acl(struct user_namespace *mnt_userns, struct inode *inode,
else { else {
if (!err) if (!err)
err = ntfs_set_acl_ex(mnt_userns, inode, acl, err = ntfs_set_acl_ex(mnt_userns, inode, acl,
ACL_TYPE_ACCESS); ACL_TYPE_ACCESS, true);
posix_acl_release(acl); posix_acl_release(acl);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment