• David Sterba's avatar
    btrfs: allow use of global block reserve for balance item deletion · 3502a8c0
    David Sterba authored
    On a filesystem with exhausted metadata, but still enough to start
    balance, it's possible to hit this error:
    
    [324402.053842] BTRFS info (device loop0): 1 enospc errors during balance
    [324402.060769] BTRFS info (device loop0): balance: ended with status: -28
    [324402.172295] BTRFS: error (device loop0) in reset_balance_state:3321: errno=-28 No space left
    
    It fails inside reset_balance_state and turns the filesystem to
    read-only, which is unnecessary and should be fixed too, but the problem
    is caused by lack for space when the balance item is deleted. This is a
    one-time operation and from the same rank as unlink that is allowed to
    use the global block reserve. So do the same for the balance item.
    
    Status of the filesystem (100GiB) just after the balance fails:
    
    $ btrfs fi df mnt
    Data, single: total=80.01GiB, used=38.58GiB
    System, single: total=4.00MiB, used=16.00KiB
    Metadata, single: total=19.99GiB, used=19.48GiB
    GlobalReserve, single: total=512.00MiB, used=50.11MiB
    
    CC: stable@vger.kernel.org # 4.4+
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    3502a8c0
volumes.c 203 KB