summaryrefslogtreecommitdiffstats
path: root/fs/ext3/acl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext3/acl.c')
-rw-r--r--fs/ext3/acl.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c
index 7ea638acaecf..a9fdd77d4b58 100644
--- a/fs/ext3/acl.c
+++ b/fs/ext3/acl.c
@@ -278,8 +278,7 @@ ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)
278 inode->i_mode &= ~current_umask(); 278 inode->i_mode &= ~current_umask();
279 } 279 }
280 if (test_opt(inode->i_sb, POSIX_ACL) && acl) { 280 if (test_opt(inode->i_sb, POSIX_ACL) && acl) {
281 struct posix_acl *clone; 281 mode_t mode = inode->i_mode;
282 mode_t mode;
283 282
284 if (S_ISDIR(inode->i_mode)) { 283 if (S_ISDIR(inode->i_mode)) {
285 error = ext3_set_acl(handle, inode, 284 error = ext3_set_acl(handle, inode,
@@ -287,22 +286,15 @@ ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)
287 if (error) 286 if (error)
288 goto cleanup; 287 goto cleanup;
289 } 288 }
290 clone = posix_acl_clone(acl, GFP_NOFS); 289 error = posix_acl_create(&acl, GFP_NOFS, &mode);
291 error = -ENOMEM; 290 if (error < 0)
292 if (!clone) 291 return error;
293 goto cleanup; 292
294 293 inode->i_mode = mode;
295 mode = inode->i_mode; 294 if (error > 0) {
296 error = posix_acl_create_masq(clone, &mode); 295 /* This is an extended ACL */
297 if (error >= 0) { 296 error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, acl);
298 inode->i_mode = mode;
299 if (error > 0) {
300 /* This is an extended ACL */
301 error = ext3_set_acl(handle, inode,
302 ACL_TYPE_ACCESS, clone);
303 }
304 } 297 }
305 posix_acl_release(clone);
306 } 298 }
307cleanup: 299cleanup:
308 posix_acl_release(acl); 300 posix_acl_release(acl);