diff options
Diffstat (limited to 'fs/generic_acl.c')
-rw-r--r-- | fs/generic_acl.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/fs/generic_acl.c b/fs/generic_acl.c index d5e33a077a67..d0dddaceac59 100644 --- a/fs/generic_acl.c +++ b/fs/generic_acl.c | |||
@@ -82,18 +82,14 @@ generic_acl_set(struct dentry *dentry, const char *name, const void *value, | |||
82 | return PTR_ERR(acl); | 82 | return PTR_ERR(acl); |
83 | } | 83 | } |
84 | if (acl) { | 84 | if (acl) { |
85 | mode_t mode; | ||
86 | |||
87 | error = posix_acl_valid(acl); | 85 | error = posix_acl_valid(acl); |
88 | if (error) | 86 | if (error) |
89 | goto failed; | 87 | goto failed; |
90 | switch (type) { | 88 | switch (type) { |
91 | case ACL_TYPE_ACCESS: | 89 | case ACL_TYPE_ACCESS: |
92 | mode = inode->i_mode; | 90 | error = posix_acl_equiv_mode(acl, &inode->i_mode); |
93 | error = posix_acl_equiv_mode(acl, &mode); | ||
94 | if (error < 0) | 91 | if (error < 0) |
95 | goto failed; | 92 | goto failed; |
96 | inode->i_mode = mode; | ||
97 | inode->i_ctime = CURRENT_TIME; | 93 | inode->i_ctime = CURRENT_TIME; |
98 | if (error == 0) { | 94 | if (error == 0) { |
99 | posix_acl_release(acl); | 95 | posix_acl_release(acl); |
@@ -125,21 +121,20 @@ int | |||
125 | generic_acl_init(struct inode *inode, struct inode *dir) | 121 | generic_acl_init(struct inode *inode, struct inode *dir) |
126 | { | 122 | { |
127 | struct posix_acl *acl = NULL; | 123 | struct posix_acl *acl = NULL; |
128 | mode_t mode = inode->i_mode; | ||
129 | int error; | 124 | int error; |
130 | 125 | ||
131 | inode->i_mode = mode & ~current_umask(); | ||
132 | if (!S_ISLNK(inode->i_mode)) | 126 | if (!S_ISLNK(inode->i_mode)) |
133 | acl = get_cached_acl(dir, ACL_TYPE_DEFAULT); | 127 | acl = get_cached_acl(dir, ACL_TYPE_DEFAULT); |
134 | if (acl) { | 128 | if (acl) { |
135 | if (S_ISDIR(inode->i_mode)) | 129 | if (S_ISDIR(inode->i_mode)) |
136 | set_cached_acl(inode, ACL_TYPE_DEFAULT, acl); | 130 | set_cached_acl(inode, ACL_TYPE_DEFAULT, acl); |
137 | error = posix_acl_create(&acl, GFP_KERNEL, &mode); | 131 | error = posix_acl_create(&acl, GFP_KERNEL, &inode->i_mode); |
138 | if (error < 0) | 132 | if (error < 0) |
139 | return error; | 133 | return error; |
140 | inode->i_mode = mode; | ||
141 | if (error > 0) | 134 | if (error > 0) |
142 | set_cached_acl(inode, ACL_TYPE_ACCESS, acl); | 135 | set_cached_acl(inode, ACL_TYPE_ACCESS, acl); |
136 | } else { | ||
137 | inode->i_mode &= ~current_umask(); | ||
143 | } | 138 | } |
144 | error = 0; | 139 | error = 0; |
145 | 140 | ||