diff options
Diffstat (limited to 'fs/btrfs/free-space-tree.c')
| -rw-r--r-- | fs/btrfs/free-space-tree.c | 133 | 
1 files changed, 66 insertions, 67 deletions
diff --git a/fs/btrfs/free-space-tree.c b/fs/btrfs/free-space-tree.c index 48a03f5240f5..258cb3fae17a 100644 --- a/fs/btrfs/free-space-tree.c +++ b/fs/btrfs/free-space-tree.c @@ -13,10 +13,10 @@  #include "block-group.h"  static int __add_block_group_free_space(struct btrfs_trans_handle *trans, -					struct btrfs_block_group_cache *block_group, +					struct btrfs_block_group *block_group,  					struct btrfs_path *path); -void set_free_space_tree_thresholds(struct btrfs_block_group_cache *cache) +void set_free_space_tree_thresholds(struct btrfs_block_group *cache)  {  	u32 bitmap_range;  	size_t bitmap_size; @@ -27,8 +27,7 @@ void set_free_space_tree_thresholds(struct btrfs_block_group_cache *cache)  	 * exceeds that required for using bitmaps.  	 */  	bitmap_range = cache->fs_info->sectorsize * BTRFS_FREE_SPACE_BITMAP_BITS; -	num_bitmaps = div_u64(cache->key.offset + bitmap_range - 1, -			      bitmap_range); +	num_bitmaps = div_u64(cache->length + bitmap_range - 1, bitmap_range);  	bitmap_size = sizeof(struct btrfs_item) + BTRFS_FREE_SPACE_BITMAP_SIZE;  	total_bitmap_size = num_bitmaps * bitmap_size;  	cache->bitmap_high_thresh = div_u64(total_bitmap_size, @@ -45,7 +44,7 @@ void set_free_space_tree_thresholds(struct btrfs_block_group_cache *cache)  }  static int add_new_free_space_info(struct btrfs_trans_handle *trans, -				   struct btrfs_block_group_cache *block_group, +				   struct btrfs_block_group *block_group,  				   struct btrfs_path *path)  {  	struct btrfs_root *root = trans->fs_info->free_space_root; @@ -54,9 +53,9 @@ static int add_new_free_space_info(struct btrfs_trans_handle *trans,  	struct extent_buffer *leaf;  	int ret; -	key.objectid = block_group->key.objectid; +	key.objectid = block_group->start;  	key.type = BTRFS_FREE_SPACE_INFO_KEY; -	key.offset = block_group->key.offset; +	key.offset = block_group->length;  	ret = btrfs_insert_empty_item(trans, root, path, &key, sizeof(*info));  	if (ret) @@ -78,7 +77,7 @@ out:  EXPORT_FOR_TESTS  struct btrfs_free_space_info *search_free_space_info(  		struct btrfs_trans_handle *trans, -		struct btrfs_block_group_cache *block_group, +		struct btrfs_block_group *block_group,  		struct btrfs_path *path, int cow)  {  	struct btrfs_fs_info *fs_info = block_group->fs_info; @@ -86,16 +85,16 @@ struct btrfs_free_space_info *search_free_space_info(  	struct btrfs_key key;  	int ret; -	key.objectid = block_group->key.objectid; +	key.objectid = block_group->start;  	key.type = BTRFS_FREE_SPACE_INFO_KEY; -	key.offset = block_group->key.offset; +	key.offset = block_group->length;  	ret = btrfs_search_slot(trans, root, &key, path, 0, cow);  	if (ret < 0)  		return ERR_PTR(ret);  	if (ret != 0) {  		btrfs_warn(fs_info, "missing free space info for %llu", -			   block_group->key.objectid); +			   block_group->start);  		ASSERT(0);  		return ERR_PTR(-ENOENT);  	} @@ -180,7 +179,7 @@ static void le_bitmap_set(unsigned long *map, unsigned int start, int len)  EXPORT_FOR_TESTS  int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans, -				  struct btrfs_block_group_cache *block_group, +				  struct btrfs_block_group *block_group,  				  struct btrfs_path *path)  {  	struct btrfs_fs_info *fs_info = trans->fs_info; @@ -197,7 +196,7 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,  	int done = 0, nr;  	int ret; -	bitmap_size = free_space_bitmap_size(block_group->key.offset, +	bitmap_size = free_space_bitmap_size(block_group->length,  					     fs_info->sectorsize);  	bitmap = alloc_bitmap(bitmap_size);  	if (!bitmap) { @@ -205,8 +204,8 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,  		goto out;  	} -	start = block_group->key.objectid; -	end = block_group->key.objectid + block_group->key.offset; +	start = block_group->start; +	end = block_group->start + block_group->length;  	key.objectid = end - 1;  	key.type = (u8)-1; @@ -224,8 +223,8 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,  			btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0] - 1);  			if (found_key.type == BTRFS_FREE_SPACE_INFO_KEY) { -				ASSERT(found_key.objectid == block_group->key.objectid); -				ASSERT(found_key.offset == block_group->key.offset); +				ASSERT(found_key.objectid == block_group->start); +				ASSERT(found_key.offset == block_group->length);  				done = 1;  				break;  			} else if (found_key.type == BTRFS_FREE_SPACE_EXTENT_KEY) { @@ -271,7 +270,7 @@ int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,  	if (extent_count != expected_extent_count) {  		btrfs_err(fs_info,  			  "incorrect extent count for %llu; counted %u, expected %u", -			  block_group->key.objectid, extent_count, +			  block_group->start, extent_count,  			  expected_extent_count);  		ASSERT(0);  		ret = -EIO; @@ -320,7 +319,7 @@ out:  EXPORT_FOR_TESTS  int convert_free_space_to_extents(struct btrfs_trans_handle *trans, -				  struct btrfs_block_group_cache *block_group, +				  struct btrfs_block_group *block_group,  				  struct btrfs_path *path)  {  	struct btrfs_fs_info *fs_info = trans->fs_info; @@ -336,7 +335,7 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,  	int done = 0, nr;  	int ret; -	bitmap_size = free_space_bitmap_size(block_group->key.offset, +	bitmap_size = free_space_bitmap_size(block_group->length,  					     fs_info->sectorsize);  	bitmap = alloc_bitmap(bitmap_size);  	if (!bitmap) { @@ -344,8 +343,8 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,  		goto out;  	} -	start = block_group->key.objectid; -	end = block_group->key.objectid + block_group->key.offset; +	start = block_group->start; +	end = block_group->start + block_group->length;  	key.objectid = end - 1;  	key.type = (u8)-1; @@ -363,8 +362,8 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,  			btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0] - 1);  			if (found_key.type == BTRFS_FREE_SPACE_INFO_KEY) { -				ASSERT(found_key.objectid == block_group->key.objectid); -				ASSERT(found_key.offset == block_group->key.offset); +				ASSERT(found_key.objectid == block_group->start); +				ASSERT(found_key.offset == block_group->length);  				done = 1;  				break;  			} else if (found_key.type == BTRFS_FREE_SPACE_BITMAP_KEY) { @@ -413,7 +412,7 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,  	btrfs_mark_buffer_dirty(leaf);  	btrfs_release_path(path); -	nrbits = div_u64(block_group->key.offset, block_group->fs_info->sectorsize); +	nrbits = div_u64(block_group->length, block_group->fs_info->sectorsize);  	start_bit = find_next_bit_le(bitmap, nrbits, 0);  	while (start_bit < nrbits) { @@ -437,7 +436,7 @@ int convert_free_space_to_extents(struct btrfs_trans_handle *trans,  	if (extent_count != expected_extent_count) {  		btrfs_err(fs_info,  			  "incorrect extent count for %llu; counted %u, expected %u", -			  block_group->key.objectid, extent_count, +			  block_group->start, extent_count,  			  expected_extent_count);  		ASSERT(0);  		ret = -EIO; @@ -453,7 +452,7 @@ out:  }  static int update_free_space_extent_count(struct btrfs_trans_handle *trans, -					  struct btrfs_block_group_cache *block_group, +					  struct btrfs_block_group *block_group,  					  struct btrfs_path *path,  					  int new_extents)  { @@ -491,7 +490,7 @@ out:  }  EXPORT_FOR_TESTS -int free_space_test_bit(struct btrfs_block_group_cache *block_group, +int free_space_test_bit(struct btrfs_block_group *block_group,  			struct btrfs_path *path, u64 offset)  {  	struct extent_buffer *leaf; @@ -513,7 +512,7 @@ int free_space_test_bit(struct btrfs_block_group_cache *block_group,  	return !!extent_buffer_test_bit(leaf, ptr, i);  } -static void free_space_set_bits(struct btrfs_block_group_cache *block_group, +static void free_space_set_bits(struct btrfs_block_group *block_group,  				struct btrfs_path *path, u64 *start, u64 *size,  				int bit)  { @@ -581,7 +580,7 @@ static int free_space_next_bitmap(struct btrfs_trans_handle *trans,   * the bitmap.   */  static int modify_free_space_bitmap(struct btrfs_trans_handle *trans, -				    struct btrfs_block_group_cache *block_group, +				    struct btrfs_block_group *block_group,  				    struct btrfs_path *path,  				    u64 start, u64 size, int remove)  { @@ -597,7 +596,7 @@ static int modify_free_space_bitmap(struct btrfs_trans_handle *trans,  	 * Read the bit for the block immediately before the extent of space if  	 * that block is within the block group.  	 */ -	if (start > block_group->key.objectid) { +	if (start > block_group->start) {  		u64 prev_block = start - block_group->fs_info->sectorsize;  		key.objectid = prev_block; @@ -649,7 +648,7 @@ static int modify_free_space_bitmap(struct btrfs_trans_handle *trans,  	 * Read the bit for the block immediately after the extent of space if  	 * that block is within the block group.  	 */ -	if (end < block_group->key.objectid + block_group->key.offset) { +	if (end < block_group->start + block_group->length) {  		/* The next block may be in the next bitmap. */  		btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);  		if (end >= key.objectid + key.offset) { @@ -694,7 +693,7 @@ out:  }  static int remove_free_space_extent(struct btrfs_trans_handle *trans, -				    struct btrfs_block_group_cache *block_group, +				    struct btrfs_block_group *block_group,  				    struct btrfs_path *path,  				    u64 start, u64 size)  { @@ -781,7 +780,7 @@ out:  EXPORT_FOR_TESTS  int __remove_from_free_space_tree(struct btrfs_trans_handle *trans, -				  struct btrfs_block_group_cache *block_group, +				  struct btrfs_block_group *block_group,  				  struct btrfs_path *path, u64 start, u64 size)  {  	struct btrfs_free_space_info *info; @@ -812,7 +811,7 @@ int __remove_from_free_space_tree(struct btrfs_trans_handle *trans,  int remove_from_free_space_tree(struct btrfs_trans_handle *trans,  				u64 start, u64 size)  { -	struct btrfs_block_group_cache *block_group; +	struct btrfs_block_group *block_group;  	struct btrfs_path *path;  	int ret; @@ -846,7 +845,7 @@ out:  }  static int add_free_space_extent(struct btrfs_trans_handle *trans, -				 struct btrfs_block_group_cache *block_group, +				 struct btrfs_block_group *block_group,  				 struct btrfs_path *path,  				 u64 start, u64 size)  { @@ -880,7 +879,7 @@ static int add_free_space_extent(struct btrfs_trans_handle *trans,  	new_key.offset = size;  	/* Search for a neighbor on the left. */ -	if (start == block_group->key.objectid) +	if (start == block_group->start)  		goto right;  	key.objectid = start - 1;  	key.type = (u8)-1; @@ -900,8 +899,8 @@ static int add_free_space_extent(struct btrfs_trans_handle *trans,  	found_start = key.objectid;  	found_end = key.objectid + key.offset; -	ASSERT(found_start >= block_group->key.objectid && -	       found_end > block_group->key.objectid); +	ASSERT(found_start >= block_group->start && +	       found_end > block_group->start);  	ASSERT(found_start < start && found_end <= start);  	/* @@ -920,7 +919,7 @@ static int add_free_space_extent(struct btrfs_trans_handle *trans,  right:  	/* Search for a neighbor on the right. */ -	if (end == block_group->key.objectid + block_group->key.offset) +	if (end == block_group->start + block_group->length)  		goto insert;  	key.objectid = end;  	key.type = (u8)-1; @@ -940,8 +939,8 @@ right:  	found_start = key.objectid;  	found_end = key.objectid + key.offset; -	ASSERT(found_start >= block_group->key.objectid && -	       found_end > block_group->key.objectid); +	ASSERT(found_start >= block_group->start && +	       found_end > block_group->start);  	ASSERT((found_start < start && found_end <= start) ||  	       (found_start >= end && found_end > end)); @@ -974,7 +973,7 @@ out:  EXPORT_FOR_TESTS  int __add_to_free_space_tree(struct btrfs_trans_handle *trans, -			     struct btrfs_block_group_cache *block_group, +			     struct btrfs_block_group *block_group,  			     struct btrfs_path *path, u64 start, u64 size)  {  	struct btrfs_free_space_info *info; @@ -1005,7 +1004,7 @@ int __add_to_free_space_tree(struct btrfs_trans_handle *trans,  int add_to_free_space_tree(struct btrfs_trans_handle *trans,  			   u64 start, u64 size)  { -	struct btrfs_block_group_cache *block_group; +	struct btrfs_block_group *block_group;  	struct btrfs_path *path;  	int ret; @@ -1043,7 +1042,7 @@ out:   * through the normal add/remove hooks.   */  static int populate_free_space_tree(struct btrfs_trans_handle *trans, -				    struct btrfs_block_group_cache *block_group) +				    struct btrfs_block_group *block_group)  {  	struct btrfs_root *extent_root = trans->fs_info->extent_root;  	struct btrfs_path *path, *path2; @@ -1075,7 +1074,7 @@ static int populate_free_space_tree(struct btrfs_trans_handle *trans,  	 * BLOCK_GROUP_ITEM, so an extent may precede the block group that it's  	 * contained in.  	 */ -	key.objectid = block_group->key.objectid; +	key.objectid = block_group->start;  	key.type = BTRFS_EXTENT_ITEM_KEY;  	key.offset = 0; @@ -1084,8 +1083,8 @@ static int populate_free_space_tree(struct btrfs_trans_handle *trans,  		goto out_locked;  	ASSERT(ret == 0); -	start = block_group->key.objectid; -	end = block_group->key.objectid + block_group->key.offset; +	start = block_group->start; +	end = block_group->start + block_group->length;  	while (1) {  		btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]); @@ -1109,7 +1108,7 @@ static int populate_free_space_tree(struct btrfs_trans_handle *trans,  			else  				start += key.offset;  		} else if (key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) { -			if (key.objectid != block_group->key.objectid) +			if (key.objectid != block_group->start)  				break;  		} @@ -1140,7 +1139,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)  	struct btrfs_trans_handle *trans;  	struct btrfs_root *tree_root = fs_info->tree_root;  	struct btrfs_root *free_space_root; -	struct btrfs_block_group_cache *block_group; +	struct btrfs_block_group *block_group;  	struct rb_node *node;  	int ret; @@ -1159,7 +1158,7 @@ int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)  	node = rb_first(&fs_info->block_group_cache_tree);  	while (node) { -		block_group = rb_entry(node, struct btrfs_block_group_cache, +		block_group = rb_entry(node, struct btrfs_block_group,  				       cache_node);  		ret = populate_free_space_tree(trans, block_group);  		if (ret) @@ -1265,7 +1264,7 @@ abort:  }  static int __add_block_group_free_space(struct btrfs_trans_handle *trans, -					struct btrfs_block_group_cache *block_group, +					struct btrfs_block_group *block_group,  					struct btrfs_path *path)  {  	int ret; @@ -1277,12 +1276,12 @@ static int __add_block_group_free_space(struct btrfs_trans_handle *trans,  		return ret;  	return __add_to_free_space_tree(trans, block_group, path, -					block_group->key.objectid, -					block_group->key.offset); +					block_group->start, +					block_group->length);  }  int add_block_group_free_space(struct btrfs_trans_handle *trans, -			       struct btrfs_block_group_cache *block_group) +			       struct btrfs_block_group *block_group)  {  	struct btrfs_fs_info *fs_info = trans->fs_info;  	struct btrfs_path *path = NULL; @@ -1312,7 +1311,7 @@ out:  }  int remove_block_group_free_space(struct btrfs_trans_handle *trans, -				  struct btrfs_block_group_cache *block_group) +				  struct btrfs_block_group *block_group)  {  	struct btrfs_root *root = trans->fs_info->free_space_root;  	struct btrfs_path *path; @@ -1336,8 +1335,8 @@ int remove_block_group_free_space(struct btrfs_trans_handle *trans,  		goto out;  	} -	start = block_group->key.objectid; -	end = block_group->key.objectid + block_group->key.offset; +	start = block_group->start; +	end = block_group->start + block_group->length;  	key.objectid = end - 1;  	key.type = (u8)-1; @@ -1355,8 +1354,8 @@ int remove_block_group_free_space(struct btrfs_trans_handle *trans,  			btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0] - 1);  			if (found_key.type == BTRFS_FREE_SPACE_INFO_KEY) { -				ASSERT(found_key.objectid == block_group->key.objectid); -				ASSERT(found_key.offset == block_group->key.offset); +				ASSERT(found_key.objectid == block_group->start); +				ASSERT(found_key.offset == block_group->length);  				done = 1;  				nr++;  				path->slots[0]--; @@ -1391,7 +1390,7 @@ static int load_free_space_bitmaps(struct btrfs_caching_control *caching_ctl,  				   struct btrfs_path *path,  				   u32 expected_extent_count)  { -	struct btrfs_block_group_cache *block_group; +	struct btrfs_block_group *block_group;  	struct btrfs_fs_info *fs_info;  	struct btrfs_root *root;  	struct btrfs_key key; @@ -1407,7 +1406,7 @@ static int load_free_space_bitmaps(struct btrfs_caching_control *caching_ctl,  	fs_info = block_group->fs_info;  	root = fs_info->free_space_root; -	end = block_group->key.objectid + block_group->key.offset; +	end = block_group->start + block_group->length;  	while (1) {  		ret = btrfs_next_item(root, path); @@ -1454,7 +1453,7 @@ static int load_free_space_bitmaps(struct btrfs_caching_control *caching_ctl,  	if (extent_count != expected_extent_count) {  		btrfs_err(fs_info,  			  "incorrect extent count for %llu; counted %u, expected %u", -			  block_group->key.objectid, extent_count, +			  block_group->start, extent_count,  			  expected_extent_count);  		ASSERT(0);  		ret = -EIO; @@ -1472,7 +1471,7 @@ static int load_free_space_extents(struct btrfs_caching_control *caching_ctl,  				   struct btrfs_path *path,  				   u32 expected_extent_count)  { -	struct btrfs_block_group_cache *block_group; +	struct btrfs_block_group *block_group;  	struct btrfs_fs_info *fs_info;  	struct btrfs_root *root;  	struct btrfs_key key; @@ -1485,7 +1484,7 @@ static int load_free_space_extents(struct btrfs_caching_control *caching_ctl,  	fs_info = block_group->fs_info;  	root = fs_info->free_space_root; -	end = block_group->key.objectid + block_group->key.offset; +	end = block_group->start + block_group->length;  	while (1) {  		ret = btrfs_next_item(root, path); @@ -1516,7 +1515,7 @@ static int load_free_space_extents(struct btrfs_caching_control *caching_ctl,  	if (extent_count != expected_extent_count) {  		btrfs_err(fs_info,  			  "incorrect extent count for %llu; counted %u, expected %u", -			  block_group->key.objectid, extent_count, +			  block_group->start, extent_count,  			  expected_extent_count);  		ASSERT(0);  		ret = -EIO; @@ -1532,7 +1531,7 @@ out:  int load_free_space_tree(struct btrfs_caching_control *caching_ctl)  { -	struct btrfs_block_group_cache *block_group; +	struct btrfs_block_group *block_group;  	struct btrfs_free_space_info *info;  	struct btrfs_path *path;  	u32 extent_count, flags;  |