diff options
Diffstat (limited to 'fs/btrfs/relocation.c')
| -rw-r--r-- | fs/btrfs/relocation.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 7f219851fa23..00504657b602 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -21,6 +21,7 @@  #include "qgroup.h"  #include "print-tree.h"  #include "delalloc-space.h" +#include "block-group.h"  /*   * backref_node, mapping_node and tree_block start with this @@ -1434,6 +1435,13 @@ int btrfs_init_reloc_root(struct btrfs_trans_handle *trans,  	int clear_rsv = 0;  	int ret; +	/* +	 * The subvolume has reloc tree but the swap is finished, no need to +	 * create/update the dead reloc tree +	 */ +	if (test_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state)) +		return 0; +  	if (root->reloc_root) {  		reloc_root = root->reloc_root;  		reloc_root->last_trans = trans->transid; @@ -2186,7 +2194,6 @@ static int clean_dirty_subvols(struct reloc_control *rc)  			/* Merged subvolume, cleanup its reloc root */  			struct btrfs_root *reloc_root = root->reloc_root; -			clear_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state);  			list_del_init(&root->reloc_dirty_list);  			root->reloc_root = NULL;  			if (reloc_root) { @@ -2195,6 +2202,7 @@ static int clean_dirty_subvols(struct reloc_control *rc)  				if (ret2 < 0 && !ret)  					ret = ret2;  			} +			clear_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state);  			btrfs_put_fs_root(root);  		} else {  			/* Orphan reloc tree, just clean it up */ @@ -3311,7 +3319,7 @@ static int relocate_file_extent_cluster(struct inode *inode,  		}  		ret = btrfs_set_extent_delalloc(inode, page_start, page_end, 0, -						NULL, 0); +						NULL);  		if (ret) {  			unlock_page(page);  			put_page(page);  |