lkml.org 
[lkml]   [2020]   [Aug]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 013/232] btrfs: allow use of global block reserve for balance item deletion
    Date
    From: David Sterba <dsterba@suse.com>

    commit 3502a8c0dc1bd4b4970b59b06e348f22a1c05581 upstream.

    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: Johannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/btrfs/volumes.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/fs/btrfs/volumes.c
    +++ b/fs/btrfs/volumes.c
    @@ -3231,7 +3231,7 @@ static int del_balance_item(struct btrfs
    if (!path)
    return -ENOMEM;

    - trans = btrfs_start_transaction(root, 0);
    + trans = btrfs_start_transaction_fallback_global_rsv(root, 0);
    if (IS_ERR(trans)) {
    btrfs_free_path(path);
    return PTR_ERR(trans);

    \
     
     \ /
      Last update: 2020-08-20 11:24    [W:4.088 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site