On Thu, Oct 11, 2018 at 8:57 PM Josef Bacik <josef@xxxxxxxxxxxxxx> wrote:
>
> From: Josef Bacik <jbacik@xxxxxx>
>
> 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.
>
> Signed-off-by: Josef Bacik <jbacik@xxxxxx>
Reviewed-by: Filipe Manana <fdmanana@xxxxxxxx>
> ---
> fs/btrfs/extent-tree.c | 7 +++++--
> 1 file changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 6e7bc3197737..4f48d047a1ec 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -7496,6 +7496,7 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
> struct btrfs_block_group_cache *block_group = NULL;
> u64 search_start = 0;
> u64 max_extent_size = 0;
> + u64 max_free_space = 0;
> u64 empty_cluster = 0;
> struct btrfs_space_info *space_info;
> int loop = 0;
> @@ -7791,8 +7792,8 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
> spin_lock(&ctl->tree_lock);
> if (ctl->free_space <
> num_bytes + empty_cluster + empty_size) {
> - if (ctl->free_space > max_extent_size)
> - max_extent_size = ctl->free_space;
> + max_free_space = max(max_free_space,
> + ctl->free_space);
> spin_unlock(&ctl->tree_lock);
> goto loop;
> }
> @@ -7959,6 +7960,8 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,
> }
> out:
> if (ret == -ENOSPC) {
> + if (!max_extent_size)
> + max_extent_size = max_free_space;
> spin_lock(&space_info->lock);
> space_info->max_extent_size = max_extent_size;
> spin_unlock(&space_info->lock);
> --
> 2.14.3
>
--
Filipe David Manana,
“Whether you think you can, or you think you can't — you're right.”