• Josef Bacik's avatar
    btrfs: include the free space tree in the global rsv minimum calculation · 9506f953
    Josef Bacik authored
    
    
    Filipe reported a problem where generic/619 was failing with an ENOSPC
    abort while running delayed refs, like the following
    
      BTRFS: Transaction aborted (error -28)
      WARNING: CPU: 3 PID: 522920 at fs/btrfs/free-space-tree.c:1049 add_to_free_space_tree+0xe5/0x110 [btrfs]
      CPU: 3 PID: 522920 Comm: kworker/u16:19 Tainted: G        W         5.16.0-rc2-btrfs-next-106 #1
      Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.14.0-0-g155821a1990b-prebuilt.qemu.org 04/01/2014
      Workqueue: events_unbound btrfs_async_reclaim_metadata_space [btrfs]
      RIP: 0010:add_to_free_space_tree+0xe5/0x110 [btrfs]
      RSP: 0000:ffffa65087fb7b20 EFLAGS: 00010282
      RAX: 0000000000000000 RBX: 0000000000001000 RCX: 0000000000000000
      RDX: 0000000000000001 RSI: ffffffff9131eeaa RDI: 00000000ffffffff
      RBP: ffff8d62e26481b8 R08: ffffffff9ad97ce0 R09: 0000000000000001
      R10: 0000000000000000 R11: 0000000000000001 R12: 00000000ffffffe4
      R13: ffff8d61c25fe688 R14: ffff8d61ebd88800 R15: ffff8d61ebd88a90
      FS:  0000000000000000(0000) GS:ffff8d64ed400000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 00007fa46a8b1000 CR3: 0000000148d18003 CR4: 0000000000370ee0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      Call Trace:
       <TASK>
       __btrfs_free_extent+0x516/0x950 [btrfs]
       __btrfs_run_delayed_refs+0x2b1/0x1250 [btrfs]
       btrfs_run_delayed_refs+0x86/0x210 [btrfs]
       flush_space+0x403/0x630 [btrfs]
       ? call_rcu_tasks_generic+0x50/0x80
       ? lock_release+0x223/0x4a0
       ? btrfs_get_alloc_profile+0xb5/0x290 [btrfs]
       ? do_raw_spin_unlock+0x4b/0xa0
       btrfs_async_reclaim_metadata_space+0x139/0x320 [btrfs]
       process_one_work+0x24c/0x5b0
       worker_thread+0x55/0x3c0
       ? process_one_work+0x5b0/0x5b0
       kthread+0x17c/0x1a0
       ? set_kthread_struct+0x40/0x40
       ret_from_fork+0x22/0x30
    
    There's a couple of reasons for this, but in generic/619's case the
    largest reason is because it is a very small file system, ad we do not
    reserve enough space for the global reserve.
    
    With the free space tree we now have the free space tree that we need to
    modify when running delayed refs.  This means we need the global reserve
    to take this into account when it calculates the minimum size it needs
    to be.  This is especially important for very small file systems.
    
    Fix this by adjusting the minimum global block rsv size math to include
    the size of the free space tree when calculating the size.
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    9506f953
block-rsv.c 16.5 KB