forked from mirrors/linux
		
	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: Anand Jain <anand.jain@oracle.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									353c2ea735
								
							
						
					
					
						commit
						04e6863b19
					
				
					 3 changed files with 33 additions and 13 deletions
				
			
		| 
						 | 
					@ -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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)
 | 
				
			||||||
					   NULL, 0, flags);
 | 
								ret = btrfs_setxattr(trans, inode, handler->xattr_name,
 | 
				
			||||||
 | 
										     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,14 +89,23 @@ 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)
 | 
				
			||||||
				   value, value_len, flags);
 | 
							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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	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)
 | 
				
			||||||
				     NULL, 0, flags);
 | 
								btrfs_setxattr(trans, inode, handler->xattr_name, NULL,
 | 
				
			||||||
 | 
									       0, flags);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								btrfs_setxattr_trans(NULL, inode, handler->xattr_name,
 | 
				
			||||||
 | 
										     NULL, 0, flags);
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -358,13 +372,13 @@ 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,
 | 
				
			||||||
					&BTRFS_I(inode)->runtime_flags);
 | 
										&BTRFS_I(inode)->runtime_flags);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,8 +439,8 @@ 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)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue