• M
    Btrfs: fix BUG_ON() casued by the reserved space migration · 20dd2cbf
    Miao Xie 提交于
    When we did space balance and snapshot creation at the same time, we might
    meet the following oops:
     kernel BUG at fs/btrfs/inode.c:3038!
     [SNIP]
     Call Trace:
     [<ffffffffa0411ec7>] btrfs_orphan_cleanup+0x293/0x407 [btrfs]
     [<ffffffffa042dc45>] btrfs_mksubvol.isra.28+0x259/0x373 [btrfs]
     [<ffffffffa042de85>] btrfs_ioctl_snap_create_transid+0x126/0x156 [btrfs]
     [<ffffffffa042dff1>] btrfs_ioctl_snap_create_v2+0xd0/0x121 [btrfs]
     [<ffffffffa0430b2c>] btrfs_ioctl+0x414/0x1854 [btrfs]
     [<ffffffff813b60b7>] ? __do_page_fault+0x305/0x379
     [<ffffffff811215a9>] vfs_ioctl+0x1d/0x39
     [<ffffffff81121d7c>] do_vfs_ioctl+0x32d/0x3e2
     [<ffffffff81057fe7>] ? finish_task_switch+0x80/0xb8
     [<ffffffff81121e88>] SyS_ioctl+0x57/0x83
     [<ffffffff813b39ff>] ? do_device_not_available+0x12/0x14
     [<ffffffff813b99c2>] system_call_fastpath+0x16/0x1b
     [SNIP]
     RIP  [<ffffffffa040da40>] btrfs_orphan_add+0xc3/0x126 [btrfs]
    
    The reason of the problem is that the relocation root creation stole
    the reserved space, which was reserved for orphan item deletion.
    
    There are several ways to fix this problem, one is to increasing
    the reserved space size of the space balace, and then we can use
    that space to create the relocation tree for each fs/file trees.
    But it is hard to calculate the suitable size because we doesn't
    know how many fs/file trees we need relocate.
    
    We fixed this problem by reserving the space for relocation root creation
    actively since the space it need is very small (one tree block, used for
    root node copy), then we use that reserved space to create the
    relocation tree. If we don't reserve space for relocation tree creation,
    we will use the reserved space of the balance.
    Signed-off-by: NMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: NJosef Bacik <jbacik@fusionio.com>
    Signed-off-by: NChris Mason <chris.mason@fusionio.com>
    20dd2cbf
transaction.c 53.9 KB