On 16.08.19 г. 18:20 ч., Josef Bacik wrote:
> While messing with the overcommit logic I noticed that sometimes we'd
> ENOSPC out when really we should have run out of space much earlier. It
> turns out it's because we'll only reserve up to the free amount left in
> the space info for the global reserve, but that doesn't make sense with
> overcommit because we could be well above our actual size. This results
> in the global reserve not carving out it's entire reservation, and thus
> not putting enough pressure on the rest of the infrastructure to do the
> right thing and ENOSPC out at a convenient time. Fix this by always
> taking our full reservation amount for the global reserve.
>
> Signed-off-by: Josef Bacik <[email protected]>
In effect you could possibly overcommit by increasing bytes_may_use you
potentially cause callers of reserve_metadata_bytes to get ENOSPC, am I
right? In any case the code itself looks ok:
Reviewed-by: Nikolay Borisov <[email protected]>
> ---
> fs/btrfs/block-rsv.c | 13 ++++---------
> 1 file changed, 4 insertions(+), 9 deletions(-)
>
> diff --git a/fs/btrfs/block-rsv.c b/fs/btrfs/block-rsv.c
> index 657675eef443..18a0af20ee5a 100644
> --- a/fs/btrfs/block-rsv.c
> +++ b/fs/btrfs/block-rsv.c
> @@ -295,15 +295,10 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info
> *fs_info)
> block_rsv->size = min_t(u64, num_bytes, SZ_512M);
>
> if (block_rsv->reserved < block_rsv->size) {
> - num_bytes = btrfs_space_info_used(sinfo, true);
> - if (sinfo->total_bytes > num_bytes) {
> - num_bytes = sinfo->total_bytes - num_bytes;
> - num_bytes = min(num_bytes,
> - block_rsv->size - block_rsv->reserved);
> - block_rsv->reserved += num_bytes;
> - btrfs_space_info_update_bytes_may_use(fs_info, sinfo,
> - num_bytes);
> - }
> + num_bytes = block_rsv->size - block_rsv->reserved;
> + block_rsv->reserved += num_bytes;
> + btrfs_space_info_update_bytes_may_use(fs_info, sinfo,
> + num_bytes);
> } else if (block_rsv->reserved > block_rsv->size) {
> num_bytes = block_rsv->reserved - block_rsv->size;
> btrfs_space_info_update_bytes_may_use(fs_info, sinfo,
>