On Fri, Sep 28, 2018 at 07:17:55AM -0400, Josef Bacik wrote:
> With severe fragmentation we can end up with our inode rsv size being
> huge during writeout, which would cause us to need to make very large
> metadata reservations. However we may not actually need that much once
> writeout is complete. So instead try to make our reservation, and if we
> couldn't make it re-calculate our new reservation size and try again.
> If our reservation size doesn't change between tries then we know we are
> actually out of space and can error out.
>
> Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx>
> ---
> fs/btrfs/extent-tree.c | 26 ++++++++++++++++++++++++--
> 1 file changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 7a53f6a29ebc..461b8076928b 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -5781,10 +5781,11 @@ static int btrfs_inode_rsv_refill(struct btrfs_inode *inode,
> {
> struct btrfs_root *root = inode->root;
> struct btrfs_block_rsv *block_rsv = &inode->block_rsv;
> - u64 num_bytes = 0;
> + u64 num_bytes = 0, last = 0;
> u64 qgroup_num_bytes = 0;
> int ret = -ENOSPC;
>
> +again:
Could this be restructured so there's no new 'goto again;' pattern
added?