diff options
Diffstat (limited to 'fs/jfs/acl.c')
| -rw-r--r-- | fs/jfs/acl.c | 75 | 
1 files changed, 22 insertions, 53 deletions
diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c index e5de9422fa32..b3a32caf2b45 100644 --- a/fs/jfs/acl.c +++ b/fs/jfs/acl.c @@ -27,7 +27,7 @@  #include "jfs_xattr.h"  #include "jfs_acl.h" -static struct posix_acl *jfs_get_acl(struct inode *inode, int type) +struct posix_acl *jfs_get_acl(struct inode *inode, int type)  {  	struct posix_acl *acl;  	char *ea_name; @@ -114,30 +114,9 @@ out:  	return rc;  } -int jfs_check_acl(struct inode *inode, int mask, unsigned int flags) -{ -	struct posix_acl *acl; - -	if (flags & IPERM_FLAG_RCU) -		return -ECHILD; - -	acl = jfs_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; -} -  int jfs_init_acl(tid_t tid, struct inode *inode, struct inode *dir)  {  	struct posix_acl *acl = NULL; -	struct posix_acl *clone; -	mode_t mode;  	int rc = 0;  	if (S_ISLNK(inode->i_mode)) @@ -148,25 +127,18 @@ int jfs_init_acl(tid_t tid, struct inode *inode, struct inode *dir)  		return PTR_ERR(acl);  	if (acl) { +		mode_t mode = inode->i_mode;  		if (S_ISDIR(inode->i_mode)) {  			rc = jfs_set_acl(tid, inode, ACL_TYPE_DEFAULT, acl);  			if (rc)  				goto cleanup;  		} -		clone = posix_acl_clone(acl, GFP_KERNEL); -		if (!clone) { -			rc = -ENOMEM; -			goto cleanup; -		} -		mode = inode->i_mode; -		rc = posix_acl_create_masq(clone, &mode); -		if (rc >= 0) { -			inode->i_mode = mode; -			if (rc > 0) -				rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, -						 clone); -		} -		posix_acl_release(clone); +		rc = posix_acl_create(&acl, GFP_KERNEL, &mode); +		if (rc < 0) +			goto cleanup; /* posix_acl_release(NULL) is no-op */ +		inode->i_mode = mode; +		if (rc > 0) +			rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, acl);  cleanup:  		posix_acl_release(acl);  	} else @@ -180,8 +152,9 @@ cleanup:  int jfs_acl_chmod(struct inode *inode)  { -	struct posix_acl *acl, *clone; +	struct posix_acl *acl;  	int rc; +	tid_t tid;  	if (S_ISLNK(inode->i_mode))  		return -EOPNOTSUPP; @@ -190,22 +163,18 @@ int jfs_acl_chmod(struct inode *inode)  	if (IS_ERR(acl) || !acl)  		return PTR_ERR(acl); -	clone = posix_acl_clone(acl, GFP_KERNEL); -	posix_acl_release(acl); -	if (!clone) -		return -ENOMEM; - -	rc = posix_acl_chmod_masq(clone, inode->i_mode); -	if (!rc) { -		tid_t tid = txBegin(inode->i_sb, 0); -		mutex_lock(&JFS_IP(inode)->commit_mutex); -		rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, clone); -		if (!rc) -			rc = txCommit(tid, 1, &inode, 0); -		txEnd(tid); -		mutex_unlock(&JFS_IP(inode)->commit_mutex); -	} +	rc = posix_acl_chmod(&acl, GFP_KERNEL, inode->i_mode); +	if (rc) +		return rc; -	posix_acl_release(clone); +	tid = txBegin(inode->i_sb, 0); +	mutex_lock(&JFS_IP(inode)->commit_mutex); +	rc = jfs_set_acl(tid, inode, ACL_TYPE_ACCESS, acl); +	if (!rc) +		rc = txCommit(tid, 1, &inode, 0); +	txEnd(tid); +	mutex_unlock(&JFS_IP(inode)->commit_mutex); + +	posix_acl_release(acl);  	return rc;  }  |