diff options
Diffstat (limited to 'fs/ext3/acl.c')
| -rw-r--r-- | fs/ext3/acl.c | 94 | 
1 files changed, 29 insertions, 65 deletions
diff --git a/fs/ext3/acl.c b/fs/ext3/acl.c index 9d021c0d472a..6c29bf0df04a 100644 --- a/fs/ext3/acl.c +++ b/fs/ext3/acl.c @@ -131,7 +131,7 @@ fail:   *   * inode->i_mutex: don't care   */ -static struct posix_acl * +struct posix_acl *  ext3_get_acl(struct inode *inode, int type)  {  	int name_index; @@ -239,29 +239,6 @@ ext3_set_acl(handle_t *handle, struct inode *inode, int type,  	return error;  } -int -ext3_check_acl(struct inode *inode, int mask, unsigned int flags) -{ -	struct posix_acl *acl; - -	if (flags & IPERM_FLAG_RCU) { -		if (!negative_cached_acl(inode, ACL_TYPE_ACCESS)) -			return -ECHILD; -		return -EAGAIN; -	} - -	acl = ext3_get_acl(inode, ACL_TYPE_ACCESS); -	if (IS_ERR(acl)) -		return PTR_ERR(acl); -	if (acl) { -		int error = posix_acl_permission(inode, acl, mask); -		posix_acl_release(acl); -		return error; -	} - -	return -EAGAIN; -} -  /*   * Initialize the ACLs of a new inode. Called from ext3_new_inode.   * @@ -284,8 +261,7 @@ ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)  			inode->i_mode &= ~current_umask();  	}  	if (test_opt(inode->i_sb, POSIX_ACL) && acl) { -		struct posix_acl *clone; -		mode_t mode; +		mode_t mode = inode->i_mode;  		if (S_ISDIR(inode->i_mode)) {  			error = ext3_set_acl(handle, inode, @@ -293,22 +269,15 @@ ext3_init_acl(handle_t *handle, struct inode *inode, struct inode *dir)  			if (error)  				goto cleanup;  		} -		clone = posix_acl_clone(acl, GFP_NOFS); -		error = -ENOMEM; -		if (!clone) -			goto cleanup; - -		mode = inode->i_mode; -		error = posix_acl_create_masq(clone, &mode); -		if (error >= 0) { -			inode->i_mode = mode; -			if (error > 0) { -				/* This is an extended ACL */ -				error = ext3_set_acl(handle, inode, -						     ACL_TYPE_ACCESS, clone); -			} +		error = posix_acl_create(&acl, GFP_NOFS, &mode); +		if (error < 0) +			return error; + +		inode->i_mode = mode; +		if (error > 0) { +			/* This is an extended ACL */ +			error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, acl);  		} -		posix_acl_release(clone);  	}  cleanup:  	posix_acl_release(acl); @@ -332,7 +301,9 @@ cleanup:  int  ext3_acl_chmod(struct inode *inode)  { -	struct posix_acl *acl, *clone; +	struct posix_acl *acl; +	handle_t *handle; +	int retries = 0;          int error;  	if (S_ISLNK(inode->i_mode)) @@ -342,31 +313,24 @@ ext3_acl_chmod(struct inode *inode)  	acl = ext3_get_acl(inode, ACL_TYPE_ACCESS);  	if (IS_ERR(acl) || !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 = ext3_journal_start(inode, -				EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); -		if (IS_ERR(handle)) { -			error = PTR_ERR(handle); -			ext3_std_error(inode->i_sb, error); -			goto out; -		} -		error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, clone); -		ext3_journal_stop(handle); -		if (error == -ENOSPC && -		    ext3_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 = ext3_journal_start(inode, +			EXT3_DATA_TRANS_BLOCKS(inode->i_sb)); +	if (IS_ERR(handle)) { +		error = PTR_ERR(handle); +		ext3_std_error(inode->i_sb, error); +		goto out;  	} +	error = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, acl); +	ext3_journal_stop(handle); +	if (error == -ENOSPC && +	    ext3_should_retry_alloc(inode->i_sb, &retries)) +		goto retry;  out: -	posix_acl_release(clone); +	posix_acl_release(acl);  	return error;  }  |