On Thu, Oct 11, 2018 at 8:57 PM Josef Bacik <jo...@toxicpanda.com> wrote: > > From: Josef Bacik <jba...@fb.com> > > 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 <jba...@fb.com> Reviewed-by: Filipe Manana <fdman...@suse.com>
> --- > 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.”