aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r--fs/btrfs/extent-tree.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 93e376ada28b..5f3544e5f3cb 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -201,6 +201,7 @@ static int exclude_super_stripes(struct btrfs_root *root,
201 BUG_ON(ret); 201 BUG_ON(ret);
202 202
203 while (nr--) { 203 while (nr--) {
204 cache->bytes_super += stripe_len;
204 ret = add_excluded_extent(root, logical[nr], 205 ret = add_excluded_extent(root, logical[nr],
205 stripe_len); 206 stripe_len);
206 BUG_ON(ret); 207 BUG_ON(ret);
@@ -295,6 +296,9 @@ static int caching_kthread(void *data)
295 return -ENOMEM; 296 return -ENOMEM;
296 297
297 exclude_super_stripes(extent_root, block_group); 298 exclude_super_stripes(extent_root, block_group);
299 spin_lock(&block_group->space_info->lock);
300 block_group->space_info->bytes_super += block_group->bytes_super;
301 spin_unlock(&block_group->space_info->lock);
298 302
299 last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET); 303 last = max_t(u64, block_group->key.objectid, BTRFS_SUPER_INFO_OFFSET);
300 304
@@ -2785,7 +2789,8 @@ again:
2785 do_div(thresh, 100); 2789 do_div(thresh, 100);
2786 2790
2787 if (meta_sinfo->bytes_used + meta_sinfo->bytes_reserved + 2791 if (meta_sinfo->bytes_used + meta_sinfo->bytes_reserved +
2788 meta_sinfo->bytes_pinned + meta_sinfo->bytes_readonly > thresh) { 2792 meta_sinfo->bytes_pinned + meta_sinfo->bytes_readonly +
2793 meta_sinfo->bytes_super > thresh) {
2789 struct btrfs_trans_handle *trans; 2794 struct btrfs_trans_handle *trans;
2790 if (!meta_sinfo->full) { 2795 if (!meta_sinfo->full) {
2791 meta_sinfo->force_alloc = 1; 2796 meta_sinfo->force_alloc = 1;
@@ -2839,7 +2844,7 @@ again:
2839 if (data_sinfo->total_bytes - data_sinfo->bytes_used - 2844 if (data_sinfo->total_bytes - data_sinfo->bytes_used -
2840 data_sinfo->bytes_delalloc - data_sinfo->bytes_reserved - 2845 data_sinfo->bytes_delalloc - data_sinfo->bytes_reserved -
2841 data_sinfo->bytes_pinned - data_sinfo->bytes_readonly - 2846 data_sinfo->bytes_pinned - data_sinfo->bytes_readonly -
2842 data_sinfo->bytes_may_use < bytes) { 2847 data_sinfo->bytes_may_use - data_sinfo->bytes_super < bytes) {
2843 struct btrfs_trans_handle *trans; 2848 struct btrfs_trans_handle *trans;
2844 2849
2845 /* 2850 /*
@@ -6957,8 +6962,10 @@ int btrfs_read_block_groups(struct btrfs_root *root)
6957 * time, particularly in the full case. 6962 * time, particularly in the full case.
6958 */ 6963 */
6959 if (found_key.offset == btrfs_block_group_used(&cache->item)) { 6964 if (found_key.offset == btrfs_block_group_used(&cache->item)) {
6965 exclude_super_stripes(root, cache);
6960 cache->last_byte_to_unpin = (u64)-1; 6966 cache->last_byte_to_unpin = (u64)-1;
6961 cache->cached = BTRFS_CACHE_FINISHED; 6967 cache->cached = BTRFS_CACHE_FINISHED;
6968 free_excluded_extents(root, cache);
6962 } else if (btrfs_block_group_used(&cache->item) == 0) { 6969 } else if (btrfs_block_group_used(&cache->item) == 0) {
6963 exclude_super_stripes(root, cache); 6970 exclude_super_stripes(root, cache);
6964 cache->last_byte_to_unpin = (u64)-1; 6971 cache->last_byte_to_unpin = (u64)-1;
@@ -6975,6 +6982,10 @@ int btrfs_read_block_groups(struct btrfs_root *root)
6975 &space_info); 6982 &space_info);
6976 BUG_ON(ret); 6983 BUG_ON(ret);
6977 cache->space_info = space_info; 6984 cache->space_info = space_info;
6985 spin_lock(&cache->space_info->lock);
6986 cache->space_info->bytes_super += cache->bytes_super;
6987 spin_unlock(&cache->space_info->lock);
6988
6978 down_write(&space_info->groups_sem); 6989 down_write(&space_info->groups_sem);
6979 list_add_tail(&cache->list, &space_info->block_groups); 6990 list_add_tail(&cache->list, &space_info->block_groups);
6980 up_write(&space_info->groups_sem); 6991 up_write(&space_info->groups_sem);
@@ -7044,6 +7055,11 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans,
7044 ret = update_space_info(root->fs_info, cache->flags, size, bytes_used, 7055 ret = update_space_info(root->fs_info, cache->flags, size, bytes_used,
7045 &cache->space_info); 7056 &cache->space_info);
7046 BUG_ON(ret); 7057 BUG_ON(ret);
7058
7059 spin_lock(&cache->space_info->lock);
7060 cache->space_info->bytes_super += cache->bytes_super;
7061 spin_unlock(&cache->space_info->lock);
7062
7047 down_write(&cache->space_info->groups_sem); 7063 down_write(&cache->space_info->groups_sem);
7048 list_add_tail(&cache->list, &cache->space_info->block_groups); 7064 list_add_tail(&cache->list, &cache->space_info->block_groups);
7049 up_write(&cache->space_info->groups_sem); 7065 up_write(&cache->space_info->groups_sem);