|
@@ -324,9 +324,12 @@ cleanup:
|
|
int
|
|
int
|
|
ext4_acl_chmod(struct inode *inode)
|
|
ext4_acl_chmod(struct inode *inode)
|
|
{
|
|
{
|
|
- struct posix_acl *acl, *clone;
|
|
|
|
|
|
+ struct posix_acl *acl;
|
|
|
|
+ handle_t *handle;
|
|
|
|
+ int retries = 0;
|
|
int error;
|
|
int error;
|
|
|
|
|
|
|
|
+
|
|
if (S_ISLNK(inode->i_mode))
|
|
if (S_ISLNK(inode->i_mode))
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
if (!test_opt(inode->i_sb, POSIX_ACL))
|
|
if (!test_opt(inode->i_sb, POSIX_ACL))
|
|
@@ -334,31 +337,24 @@ ext4_acl_chmod(struct inode *inode)
|
|
acl = ext4_get_acl(inode, ACL_TYPE_ACCESS);
|
|
acl = ext4_get_acl(inode, ACL_TYPE_ACCESS);
|
|
if (IS_ERR(acl) || !acl)
|
|
if (IS_ERR(acl) || !acl)
|
|
return PTR_ERR(acl);
|
|
return PTR_ERR(acl);
|
|
- clone = posix_acl_clone(acl, GFP_KERNEL);
|
|
|
|
- posix_acl_release(acl);
|
|
|
|
- if (!clone)
|
|
|
|
- return -ENOMEM;
|
|
|
|
- error = posix_acl_chmod_masq(clone, inode->i_mode);
|
|
|
|
- if (!error) {
|
|
|
|
- handle_t *handle;
|
|
|
|
- int retries = 0;
|
|
|
|
-
|
|
|
|
- retry:
|
|
|
|
- handle = ext4_journal_start(inode,
|
|
|
|
- EXT4_DATA_TRANS_BLOCKS(inode->i_sb));
|
|
|
|
- if (IS_ERR(handle)) {
|
|
|
|
- error = PTR_ERR(handle);
|
|
|
|
- ext4_std_error(inode->i_sb, error);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
- error = ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, clone);
|
|
|
|
- ext4_journal_stop(handle);
|
|
|
|
- if (error == -ENOSPC &&
|
|
|
|
- ext4_should_retry_alloc(inode->i_sb, &retries))
|
|
|
|
- goto retry;
|
|
|
|
|
|
+ error = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode);
|
|
|
|
+ if (error)
|
|
|
|
+ return error;
|
|
|
|
+retry:
|
|
|
|
+ handle = ext4_journal_start(inode,
|
|
|
|
+ EXT4_DATA_TRANS_BLOCKS(inode->i_sb));
|
|
|
|
+ if (IS_ERR(handle)) {
|
|
|
|
+ error = PTR_ERR(handle);
|
|
|
|
+ ext4_std_error(inode->i_sb, error);
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
+ error = ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, acl);
|
|
|
|
+ ext4_journal_stop(handle);
|
|
|
|
+ if (error == -ENOSPC &&
|
|
|
|
+ ext4_should_retry_alloc(inode->i_sb, &retries))
|
|
|
|
+ goto retry;
|
|
out:
|
|
out:
|
|
- posix_acl_release(clone);
|
|
|
|
|
|
+ posix_acl_release(acl);
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|