diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 62a332d34fdb..98697be6bdde 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3649,7 +3649,6 @@ refill_cluster: | |||
3649 | goto loop; | 3649 | goto loop; |
3650 | checks: | 3650 | checks: |
3651 | search_start = stripe_align(root, offset); | 3651 | search_start = stripe_align(root, offset); |
3652 | |||
3653 | /* move on to the next group */ | 3652 | /* move on to the next group */ |
3654 | if (search_start + num_bytes >= search_end) { | 3653 | if (search_start + num_bytes >= search_end) { |
3655 | btrfs_add_free_space(block_group, offset, num_bytes); | 3654 | btrfs_add_free_space(block_group, offset, num_bytes); |
@@ -7040,6 +7039,16 @@ int btrfs_read_block_groups(struct btrfs_root *root) | |||
7040 | mutex_init(&cache->cache_mutex); | 7039 | mutex_init(&cache->cache_mutex); |
7041 | INIT_LIST_HEAD(&cache->list); | 7040 | INIT_LIST_HEAD(&cache->list); |
7042 | INIT_LIST_HEAD(&cache->cluster_list); | 7041 | INIT_LIST_HEAD(&cache->cluster_list); |
7042 | cache->sectorsize = root->sectorsize; | ||
7043 | |||
7044 | /* | ||
7045 | * we only want to have 32k of ram per block group for keeping | ||
7046 | * track of free space, and if we pass 1/2 of that we want to | ||
7047 | * start converting things over to using bitmaps | ||
7048 | */ | ||
7049 | cache->extents_thresh = ((1024 * 32) / 2) / | ||
7050 | sizeof(struct btrfs_free_space); | ||
7051 | |||
7043 | read_extent_buffer(leaf, &cache->item, | 7052 | read_extent_buffer(leaf, &cache->item, |
7044 | btrfs_item_ptr_offset(leaf, path->slots[0]), | 7053 | btrfs_item_ptr_offset(leaf, path->slots[0]), |
7045 | sizeof(cache->item)); | 7054 | sizeof(cache->item)); |
@@ -7091,6 +7100,15 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
7091 | cache->key.objectid = chunk_offset; | 7100 | cache->key.objectid = chunk_offset; |
7092 | cache->key.offset = size; | 7101 | cache->key.offset = size; |
7093 | cache->key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; | 7102 | cache->key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; |
7103 | cache->sectorsize = root->sectorsize; | ||
7104 | |||
7105 | /* | ||
7106 | * we only want to have 32k of ram per block group for keeping track | ||
7107 | * of free space, and if we pass 1/2 of that we want to start | ||
7108 | * converting things over to using bitmaps | ||
7109 | */ | ||
7110 | cache->extents_thresh = ((1024 * 32) / 2) / | ||
7111 | sizeof(struct btrfs_free_space); | ||
7094 | atomic_set(&cache->count, 1); | 7112 | atomic_set(&cache->count, 1); |
7095 | spin_lock_init(&cache->lock); | 7113 | spin_lock_init(&cache->lock); |
7096 | spin_lock_init(&cache->tree_lock); | 7114 | spin_lock_init(&cache->tree_lock); |
@@ -7103,6 +7121,11 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
7103 | cache->flags = type; | 7121 | cache->flags = type; |
7104 | btrfs_set_block_group_flags(&cache->item, type); | 7122 | btrfs_set_block_group_flags(&cache->item, type); |
7105 | 7123 | ||
7124 | cache->cached = 1; | ||
7125 | ret = btrfs_add_free_space(cache, chunk_offset, size); | ||
7126 | BUG_ON(ret); | ||
7127 | remove_sb_from_cache(root, cache); | ||
7128 | |||
7106 | ret = update_space_info(root->fs_info, cache->flags, size, bytes_used, | 7129 | ret = update_space_info(root->fs_info, cache->flags, size, bytes_used, |
7107 | &cache->space_info); | 7130 | &cache->space_info); |
7108 | BUG_ON(ret); | 7131 | BUG_ON(ret); |