• J
    btrfs: do not account global reserve in can_overcommit · 0096420a
    Josef Bacik 提交于
    We ran into a problem in production where a box with plenty of space was
    getting wedged doing ENOSPC flushing.  These boxes only had 20% of the
    disk allocated, but their metadata space + global reserve was right at
    the size of their metadata chunk.
    
    In this case can_overcommit should be allowing allocations without
    problem, but there's logic in can_overcommit that doesn't allow us to
    overcommit if there's not enough real space to satisfy the global
    reserve.
    
    This is for historical reasons.  Before there were only certain places
    we could allocate chunks.  We could go to commit the transaction and not
    have enough space for our pending delayed refs and such and be unable to
    allocate a new chunk.  This would result in a abort because of ENOSPC.
    This code was added to solve this problem.
    
    However since then we've gained the ability to always be able to
    allocate a chunk.  So we can easily overcommit in these cases without
    risking a transaction abort because of ENOSPC.
    
    Also prior to now the global reserve really would be used because that's
    the space we relied on for delayed refs.  With delayed refs being
    tracked separately we no longer have to worry about running out of
    delayed refs space while committing.  We are much less likely to
    exhaust our global reserve space during transaction commit.
    
    Fix the can_overcommit code to simply see if our current usage + what we
    want is less than our current free space plus whatever slack space we
    have in the disk is.  This solves the problem we were seeing in
    production and keeps us from flushing as aggressively as we approach our
    actual metadata size usage.
    Reviewed-by: NNikolay Borisov <nborisov@suse.com>
    Signed-off-by: NJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    0096420a
space-info.c 30.4 KB