Commit fb5c39d7 authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: don't use ctl->free_space for max_extent_size

max_extent_size is supposed to be the largest contiguous range for the
space info, and ctl->free_space is the total free space in the block
group.  We need to keep track of these separately and _only_ use the
max_free_space if we don't have a max_extent_size, as that means our
original request was too large to search any of the block groups for and
therefore wouldn't have a max_extent_size set.

CC: stable@vger.kernel.org # 4.14+
Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fb.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent ad22cf6e
...@@ -7257,6 +7257,7 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info, ...@@ -7257,6 +7257,7 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
struct btrfs_block_group_cache *block_group = NULL; struct btrfs_block_group_cache *block_group = NULL;
u64 search_start = 0; u64 search_start = 0;
u64 max_extent_size = 0; u64 max_extent_size = 0;
u64 max_free_space = 0;
u64 empty_cluster = 0; u64 empty_cluster = 0;
struct btrfs_space_info *space_info; struct btrfs_space_info *space_info;
int loop = 0; int loop = 0;
...@@ -7552,8 +7553,8 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info, ...@@ -7552,8 +7553,8 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
spin_lock(&ctl->tree_lock); spin_lock(&ctl->tree_lock);
if (ctl->free_space < if (ctl->free_space <
num_bytes + empty_cluster + empty_size) { num_bytes + empty_cluster + empty_size) {
if (ctl->free_space > max_extent_size) max_free_space = max(max_free_space,
max_extent_size = ctl->free_space; ctl->free_space);
spin_unlock(&ctl->tree_lock); spin_unlock(&ctl->tree_lock);
goto loop; goto loop;
} }
...@@ -7720,6 +7721,8 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info, ...@@ -7720,6 +7721,8 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
} }
out: out:
if (ret == -ENOSPC) { if (ret == -ENOSPC) {
if (!max_extent_size)
max_extent_size = max_free_space;
spin_lock(&space_info->lock); spin_lock(&space_info->lock);
space_info->max_extent_size = max_extent_size; space_info->max_extent_size = max_extent_size;
spin_unlock(&space_info->lock); spin_unlock(&space_info->lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment