Message ID | 20181011195431.3441-21-josef@toxicpanda.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | My current patch queue | expand |
On Thu, Oct 11, 2018 at 8:57 PM Josef Bacik <josef@toxicpanda.com> wrote: > > From: Josef Bacik <jbacik@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 <jbacik@fb.com> Reviewed-by: Filipe Manana <fdmanana@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 >
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);