diff options
Diffstat (limited to 'fs/btrfs/relocation.c')
| -rw-r--r-- | fs/btrfs/relocation.c | 40 | 
1 files changed, 19 insertions, 21 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 776f0aa128f..300e09ac365 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -2025,7 +2025,6 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,  	struct btrfs_root_item *root_item;  	struct btrfs_path *path;  	struct extent_buffer *leaf; -	unsigned long nr;  	int level;  	int max_level;  	int replaced = 0; @@ -2074,7 +2073,8 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,  		BUG_ON(IS_ERR(trans));  		trans->block_rsv = rc->block_rsv; -		ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved); +		ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved, +					     BTRFS_RESERVE_FLUSH_ALL);  		if (ret) {  			BUG_ON(ret != -EAGAIN);  			ret = btrfs_commit_transaction(trans, root); @@ -2125,10 +2125,9 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,  			       path->slots[level]);  		root_item->drop_level = level; -		nr = trans->blocks_used;  		btrfs_end_transaction_throttle(trans, root); -		btrfs_btree_balance_dirty(root, nr); +		btrfs_btree_balance_dirty(root);  		if (replaced && rc->stage == UPDATE_DATA_PTRS)  			invalidate_extent_cache(root, &key, &next_key); @@ -2155,10 +2154,9 @@ out:  		btrfs_update_reloc_root(trans, root);  	} -	nr = trans->blocks_used;  	btrfs_end_transaction_throttle(trans, root); -	btrfs_btree_balance_dirty(root, nr); +	btrfs_btree_balance_dirty(root);  	if (replaced && rc->stage == UPDATE_DATA_PTRS)  		invalidate_extent_cache(root, &key, &next_key); @@ -2184,7 +2182,8 @@ int prepare_to_merge(struct reloc_control *rc, int err)  again:  	if (!err) {  		num_bytes = rc->merging_rsv_size; -		ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes); +		ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes, +					  BTRFS_RESERVE_FLUSH_ALL);  		if (ret)  			err = ret;  	} @@ -2459,7 +2458,8 @@ static int reserve_metadata_space(struct btrfs_trans_handle *trans,  	num_bytes = calcu_metadata_size(rc, node, 1) * 2;  	trans->block_rsv = rc->block_rsv; -	ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes); +	ret = btrfs_block_rsv_add(root, rc->block_rsv, num_bytes, +				  BTRFS_RESERVE_FLUSH_ALL);  	if (ret) {  		if (ret == -EAGAIN)  			rc->commit_transaction = 1; @@ -3259,7 +3259,6 @@ static int delete_block_group_cache(struct btrfs_fs_info *fs_info,  	struct btrfs_path *path;  	struct btrfs_root *root = fs_info->tree_root;  	struct btrfs_trans_handle *trans; -	unsigned long nr;  	int ret = 0;  	if (inode) @@ -3293,9 +3292,8 @@ truncate:  	ret = btrfs_truncate_free_space_cache(root, trans, path, inode);  	btrfs_free_path(path); -	nr = trans->blocks_used;  	btrfs_end_transaction(trans, root); -	btrfs_btree_balance_dirty(root, nr); +	btrfs_btree_balance_dirty(root);  out:  	iput(inode);  	return ret; @@ -3685,7 +3683,8 @@ int prepare_to_relocate(struct reloc_control *rc)  	 * is no reservation in transaction handle.  	 */  	ret = btrfs_block_rsv_add(rc->extent_root, rc->block_rsv, -				  rc->extent_root->nodesize * 256); +				  rc->extent_root->nodesize * 256, +				  BTRFS_RESERVE_FLUSH_ALL);  	if (ret)  		return ret; @@ -3711,7 +3710,6 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc)  	struct btrfs_trans_handle *trans = NULL;  	struct btrfs_path *path;  	struct btrfs_extent_item *ei; -	unsigned long nr;  	u64 flags;  	u32 item_size;  	int ret; @@ -3828,9 +3826,8 @@ restart:  			ret = btrfs_commit_transaction(trans, rc->extent_root);  			BUG_ON(ret);  		} else { -			nr = trans->blocks_used;  			btrfs_end_transaction_throttle(trans, rc->extent_root); -			btrfs_btree_balance_dirty(rc->extent_root, nr); +			btrfs_btree_balance_dirty(rc->extent_root);  		}  		trans = NULL; @@ -3860,9 +3857,8 @@ restart:  			  GFP_NOFS);  	if (trans) { -		nr = trans->blocks_used;  		btrfs_end_transaction_throttle(trans, rc->extent_root); -		btrfs_btree_balance_dirty(rc->extent_root, nr); +		btrfs_btree_balance_dirty(rc->extent_root);  	}  	if (!err) { @@ -3941,7 +3937,6 @@ struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info,  	struct btrfs_trans_handle *trans;  	struct btrfs_root *root;  	struct btrfs_key key; -	unsigned long nr;  	u64 objectid = BTRFS_FIRST_FREE_OBJECTID;  	int err = 0; @@ -3969,9 +3964,8 @@ struct inode *create_reloc_inode(struct btrfs_fs_info *fs_info,  	err = btrfs_orphan_add(trans, inode);  out: -	nr = trans->blocks_used;  	btrfs_end_transaction(trans, root); -	btrfs_btree_balance_dirty(root, nr); +	btrfs_btree_balance_dirty(root);  	if (err) {  		if (inode)  			iput(inode); @@ -4057,7 +4051,11 @@ int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start)  	       (unsigned long long)rc->block_group->key.objectid,  	       (unsigned long long)rc->block_group->flags); -	btrfs_start_delalloc_inodes(fs_info->tree_root, 0); +	ret = btrfs_start_delalloc_inodes(fs_info->tree_root, 0); +	if (ret < 0) { +		err = ret; +		goto out; +	}  	btrfs_wait_ordered_extents(fs_info->tree_root, 0);  	while (1) {  |