Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 826cae2f authored by Al Viro's avatar Al Viro
Browse files

kill boilerplates around posix_acl_create_masq()



new helper: posix_acl_create(&acl, gfp, mode_p).  Replaces acl with
modified clone, on failure releases acl and replaces with NULL.
Returns 0 or -ve on error.  All callers of posix_acl_create_masq()
switched.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 95203bef
Loading
Loading
Loading
Loading
+5 −17
Original line number Diff line number Diff line
@@ -206,30 +206,18 @@ int v9fs_acl_mode(struct inode *dir, mode_t *modep,
			mode &= ~current_umask();
	}
	if (acl) {
		struct posix_acl *clone;

		if (S_ISDIR(mode))
			*dpacl = posix_acl_dup(acl);
		clone = posix_acl_clone(acl, GFP_NOFS);
		posix_acl_release(acl);
		if (!clone)
			return -ENOMEM;

		retval = posix_acl_create_masq(clone, &mode);
		if (retval < 0) {
			posix_acl_release(clone);
			goto cleanup;
		}
		retval = posix_acl_create(&acl, GFP_NOFS, &mode);
		if (retval < 0)
			return retval;
		if (retval > 0)
			*pacl = clone;
			*pacl = acl;
		else
			posix_acl_release(clone);
			posix_acl_release(acl);
	}
	*modep  = mode;
	return 0;
cleanup:
	return retval;

}

static int v9fs_remote_get_acl(struct dentry *dentry, const char *name,
+8 −16
Original line number Diff line number Diff line
@@ -238,8 +238,7 @@ int btrfs_init_acl(struct btrfs_trans_handle *trans,
	}

	if (IS_POSIXACL(dir) && acl) {
		struct posix_acl *clone;
		mode_t mode;
		mode_t mode = inode->i_mode;

		if (S_ISDIR(inode->i_mode)) {
			ret = btrfs_set_acl(trans, inode, acl,
@@ -247,22 +246,15 @@ int btrfs_init_acl(struct btrfs_trans_handle *trans,
			if (ret)
				goto failed;
		}
		clone = posix_acl_clone(acl, GFP_NOFS);
		ret = -ENOMEM;
		if (!clone)
			goto failed;
		ret = posix_acl_create(&acl, GFP_NOFS, &mode);
		if (ret < 0)
			return ret;

		mode = inode->i_mode;
		ret = posix_acl_create_masq(clone, &mode);
		if (ret >= 0) {
		inode->i_mode = mode;
		if (ret > 0) {
			/* we need an acl */
				ret = btrfs_set_acl(trans, inode, clone,
						    ACL_TYPE_ACCESS);
			}
			ret = btrfs_set_acl(trans, inode, acl, ACL_TYPE_ACCESS);
		}
		posix_acl_release(clone);
	}
failed:
	posix_acl_release(acl);
+8 −17
Original line number Diff line number Diff line
@@ -270,29 +270,20 @@ ext2_init_acl(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 = ext2_set_acl(inode, ACL_TYPE_DEFAULT, acl);
			if (error)
				goto cleanup;
		}
		clone = posix_acl_clone(acl, GFP_KERNEL);
		error = -ENOMEM;
		if (!clone)
			goto cleanup;
		mode = inode->i_mode;
		error = posix_acl_create_masq(clone, &mode);
		if (error >= 0) {
		error = posix_acl_create(&acl, GFP_KERNEL, &mode);
		if (error < 0)
			return error;
		inode->i_mode = mode;
		if (error > 0) {
			/* This is an extended ACL */
				error = ext2_set_acl(inode,
						     ACL_TYPE_ACCESS, clone);
			}
			error = ext2_set_acl(inode, ACL_TYPE_ACCESS, acl);
		}
		posix_acl_release(clone);
	}
cleanup:
       posix_acl_release(acl);
+9 −17
Original line number Diff line number Diff line
@@ -278,8 +278,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,
@@ -287,22 +286,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;
		error = posix_acl_create(&acl, GFP_NOFS, &mode);
		if (error < 0)
			return error;

		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 = ext3_set_acl(handle, inode, ACL_TYPE_ACCESS, acl);
		}
		posix_acl_release(clone);
	}
cleanup:
	posix_acl_release(acl);
+9 −17
Original line number Diff line number Diff line
@@ -276,8 +276,7 @@ ext4_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 = ext4_set_acl(handle, inode,
@@ -285,22 +284,15 @@ ext4_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;
		error = posix_acl_create(&acl, GFP_NOFS, &mode);
		if (error < 0)
			return error;

		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 = ext4_set_acl(handle, inode,
						     ACL_TYPE_ACCESS, clone);
			}
			error = ext4_set_acl(handle, inode, ACL_TYPE_ACCESS, acl);
		}
		posix_acl_release(clone);
	}
cleanup:
	posix_acl_release(acl);
Loading