diff options
-rw-r--r-- | fs/btrfs/extent-tree.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 87d6666cd8e3..85d1ceb90273 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -7257,6 +7257,7 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info, | |||
7257 | struct btrfs_block_group_cache *block_group = NULL; | 7257 | struct btrfs_block_group_cache *block_group = NULL; |
7258 | u64 search_start = 0; | 7258 | u64 search_start = 0; |
7259 | u64 max_extent_size = 0; | 7259 | u64 max_extent_size = 0; |
7260 | u64 max_free_space = 0; | ||
7260 | u64 empty_cluster = 0; | 7261 | u64 empty_cluster = 0; |
7261 | struct btrfs_space_info *space_info; | 7262 | struct btrfs_space_info *space_info; |
7262 | int loop = 0; | 7263 | int loop = 0; |
@@ -7552,8 +7553,8 @@ unclustered_alloc: | |||
7552 | spin_lock(&ctl->tree_lock); | 7553 | spin_lock(&ctl->tree_lock); |
7553 | if (ctl->free_space < | 7554 | if (ctl->free_space < |
7554 | num_bytes + empty_cluster + empty_size) { | 7555 | num_bytes + empty_cluster + empty_size) { |
7555 | if (ctl->free_space > max_extent_size) | 7556 | max_free_space = max(max_free_space, |
7556 | max_extent_size = ctl->free_space; | 7557 | ctl->free_space); |
7557 | spin_unlock(&ctl->tree_lock); | 7558 | spin_unlock(&ctl->tree_lock); |
7558 | goto loop; | 7559 | goto loop; |
7559 | } | 7560 | } |
@@ -7720,6 +7721,8 @@ loop: | |||
7720 | } | 7721 | } |
7721 | out: | 7722 | out: |
7722 | if (ret == -ENOSPC) { | 7723 | if (ret == -ENOSPC) { |
7724 | if (!max_extent_size) | ||
7725 | max_extent_size = max_free_space; | ||
7723 | spin_lock(&space_info->lock); | 7726 | spin_lock(&space_info->lock); |
7724 | space_info->max_extent_size = max_extent_size; | 7727 | space_info->max_extent_size = max_extent_size; |
7725 | spin_unlock(&space_info->lock); | 7728 | spin_unlock(&space_info->lock); |