diff options
Diffstat (limited to 'fs/btrfs/relocation.c')
| -rw-r--r-- | fs/btrfs/relocation.c | 47 | 
1 files changed, 32 insertions, 15 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index c0c13dc6fe12..0ec8ffa37ab0 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c @@ -337,8 +337,9 @@ static void backref_tree_panic(struct rb_node *rb_node, int errno, u64 bytenr)  					      rb_node);  	if (bnode->root)  		fs_info = bnode->root->fs_info; -	btrfs_panic(fs_info, errno, "Inconsistency in backref cache " -		    "found at offset %llu", bytenr); +	btrfs_panic(fs_info, errno, +		    "Inconsistency in backref cache found at offset %llu", +		    bytenr);  }  /* @@ -923,9 +924,16 @@ again:  			path2->slots[level]--;  		eb = path2->nodes[level]; -		WARN_ON(btrfs_node_blockptr(eb, path2->slots[level]) != -			cur->bytenr); - +		if (btrfs_node_blockptr(eb, path2->slots[level]) != +		    cur->bytenr) { +			btrfs_err(root->fs_info, +	"couldn't find block (%llu) (level %d) in tree (%llu) with key (%llu %u %llu)", +				  cur->bytenr, level - 1, root->objectid, +				  node_key->objectid, node_key->type, +				  node_key->offset); +			err = -ENOENT; +			goto out; +		}  		lower = cur;  		need_check = true;  		for (; level < BTRFS_MAX_LEVEL; level++) { @@ -1296,9 +1304,9 @@ static int __must_check __add_reloc_root(struct btrfs_root *root)  			      node->bytenr, &node->rb_node);  	spin_unlock(&rc->reloc_root_tree.lock);  	if (rb_node) { -		btrfs_panic(root->fs_info, -EEXIST, "Duplicate root found " -			    "for start=%llu while inserting into relocation " -			    "tree", node->bytenr); +		btrfs_panic(root->fs_info, -EEXIST, +			    "Duplicate root found for start=%llu while inserting into relocation tree", +			    node->bytenr);  		kfree(node);  		return -EEXIST;  	} @@ -2350,6 +2358,10 @@ void free_reloc_roots(struct list_head *list)  	while (!list_empty(list)) {  		reloc_root = list_entry(list->next, struct btrfs_root,  					root_list); +		free_extent_buffer(reloc_root->node); +		free_extent_buffer(reloc_root->commit_root); +		reloc_root->node = NULL; +		reloc_root->commit_root = NULL;  		__del_reloc_root(reloc_root);  	}  } @@ -2686,11 +2698,15 @@ static int do_relocation(struct btrfs_trans_handle *trans,  		if (!upper->eb) {  			ret = btrfs_search_slot(trans, root, key, path, 0, 1); -			if (ret < 0) { -				err = ret; +			if (ret) { +				if (ret < 0) +					err = ret; +				else +					err = -ENOENT; + +				btrfs_release_path(path);  				break;  			} -			BUG_ON(ret > 0);  			if (!upper->eb) {  				upper->eb = path->nodes[upper->level]; @@ -3203,7 +3219,7 @@ static int relocate_file_extent_cluster(struct inode *inode,  			nr++;  		} -		btrfs_set_extent_delalloc(inode, page_start, page_end, NULL); +		btrfs_set_extent_delalloc(inode, page_start, page_end, NULL, 0);  		set_page_dirty(page);  		unlock_extent(&BTRFS_I(inode)->io_tree, @@ -3952,7 +3968,7 @@ static int qgroup_fix_relocated_data_extents(struct btrfs_trans_handle *trans,  	struct btrfs_key key;  	int ret = 0; -	if (!fs_info->quota_enabled) +	if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags))  		return 0;  	/* @@ -4365,8 +4381,9 @@ int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start)  		goto out;  	} -	btrfs_info(extent_root->fs_info, "relocating block group %llu flags %llu", -	       rc->block_group->key.objectid, rc->block_group->flags); +	btrfs_info(extent_root->fs_info, +		   "relocating block group %llu flags %llu", +		   rc->block_group->key.objectid, rc->block_group->flags);  	btrfs_wait_block_group_reservations(rc->block_group);  	btrfs_wait_nocow_writers(rc->block_group);  |