Commit 04e6863b authored by Anand Jain's avatar Anand Jain Committed by David Sterba
Browse files

btrfs: split btrfs_setxattr calls regarding transaction



When the caller has already created the transaction handle,
btrfs_setxattr() will use it. Also adds assert in btrfs_setxattr().

Signed-off-by: default avatarAnand Jain <anand.jain@oracle.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 353c2ea7
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -93,7 +93,11 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans,
			goto out;
			goto out;
	}
	}


	ret = btrfs_setxattr_trans(trans, inode, name, value, size, 0);
	if (trans)
		ret = btrfs_setxattr(trans, inode, name, value, size, 0);
	else
		ret = btrfs_setxattr_trans(NULL, inode, name, value, size, 0);

out:
out:
	kfree(value);
	kfree(value);


+24 −10
Original line number Original line Diff line number Diff line
@@ -70,8 +70,13 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
		return -EINVAL;
		return -EINVAL;


	if (value_len == 0) {
	if (value_len == 0) {
		ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name,
		if (trans)
			ret = btrfs_setxattr(trans, inode, handler->xattr_name,
					     NULL, 0, flags);
					     NULL, 0, flags);
		else
			ret = btrfs_setxattr_trans(NULL, inode,
						   handler->xattr_name, NULL, 0,
						   flags);
		if (ret)
		if (ret)
			return ret;
			return ret;


@@ -84,13 +89,22 @@ static int btrfs_set_prop(struct btrfs_trans_handle *trans, struct inode *inode,
	ret = handler->validate(value, value_len);
	ret = handler->validate(value, value_len);
	if (ret)
	if (ret)
		return ret;
		return ret;
	ret = btrfs_setxattr_trans(trans, inode, handler->xattr_name,
	if (trans)
		ret = btrfs_setxattr(trans, inode, handler->xattr_name, value,
				     value_len, flags);
	else
		ret = btrfs_setxattr_trans(NULL, inode, handler->xattr_name,
					   value, value_len, flags);
					   value, value_len, flags);

	if (ret)
	if (ret)
		return ret;
		return ret;
	ret = handler->apply(inode, value, value_len);
	ret = handler->apply(inode, value, value_len);
	if (ret) {
	if (ret) {
		btrfs_setxattr_trans(trans, inode, handler->xattr_name,
		if (trans)
			btrfs_setxattr(trans, inode, handler->xattr_name, NULL,
				       0, flags);
		else
			btrfs_setxattr_trans(NULL, inode, handler->xattr_name,
					     NULL, 0, flags);
					     NULL, 0, flags);
		return ret;
		return ret;
	}
	}
@@ -358,12 +372,12 @@ static int inherit_props(struct btrfs_trans_handle *trans,
		if (ret)
		if (ret)
			return ret;
			return ret;


		ret = btrfs_setxattr_trans(trans, inode, h->xattr_name, value,
		ret = btrfs_setxattr(trans, inode, h->xattr_name, value,
				     strlen(value), 0);
				     strlen(value), 0);
		if (!ret) {
		if (!ret) {
			ret = h->apply(inode, value, strlen(value));
			ret = h->apply(inode, value, strlen(value));
			if (ret)
			if (ret)
				btrfs_setxattr_trans(trans, inode, h->xattr_name,
				btrfs_setxattr(trans, inode, h->xattr_name,
					       NULL, 0, 0);
					       NULL, 0, 0);
			else
			else
				set_bit(BTRFS_INODE_HAS_PROPS,
				set_bit(BTRFS_INODE_HAS_PROPS,
+4 −2
Original line number Original line Diff line number Diff line
@@ -86,6 +86,8 @@ int btrfs_setxattr(struct btrfs_trans_handle *trans, struct inode *inode,
	size_t name_len = strlen(name);
	size_t name_len = strlen(name);
	int ret = 0;
	int ret = 0;


	ASSERT(trans);

	if (name_len + size > BTRFS_MAX_XATTR_SIZE(root->fs_info))
	if (name_len + size > BTRFS_MAX_XATTR_SIZE(root->fs_info))
		return -ENOSPC;
		return -ENOSPC;


@@ -437,7 +439,7 @@ static int btrfs_initxattrs(struct inode *inode,
		}
		}
		strcpy(name, XATTR_SECURITY_PREFIX);
		strcpy(name, XATTR_SECURITY_PREFIX);
		strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name);
		strcpy(name + XATTR_SECURITY_PREFIX_LEN, xattr->name);
		err = btrfs_setxattr_trans(trans, inode, name, xattr->value,
		err = btrfs_setxattr(trans, inode, name, xattr->value,
				     xattr->value_len, 0);
				     xattr->value_len, 0);
		kfree(name);
		kfree(name);
		if (err < 0)
		if (err < 0)