• Miao Xie's avatar
    Btrfs: fix oops caused by the space balance and dead roots · c00869f1
    Miao Xie authored
    When doing space balance and subvolume destroy at the same time, we met
    the following oops:
    
    kernel BUG at fs/btrfs/relocation.c:2247!
    RIP: 0010: [<ffffffffa04cec16>] prepare_to_merge+0x154/0x1f0 [btrfs]
    Call Trace:
     [<ffffffffa04b5ab7>] relocate_block_group+0x466/0x4e6 [btrfs]
     [<ffffffffa04b5c7a>] btrfs_relocate_block_group+0x143/0x275 [btrfs]
     [<ffffffffa0495c56>] btrfs_relocate_chunk.isra.27+0x5c/0x5a2 [btrfs]
     [<ffffffffa0459871>] ? btrfs_item_key_to_cpu+0x15/0x31 [btrfs]
     [<ffffffffa048b46a>] ? btrfs_get_token_64+0x7e/0xcd [btrfs]
     [<ffffffffa04a3467>] ? btrfs_tree_read_unlock_blocking+0xb2/0xb7 [btrfs]
     [<ffffffffa049907d>] btrfs_balance+0x9c7/0xb6f [btrfs]
     [<ffffffffa049ef84>] btrfs_ioctl_balance+0x234/0x2ac [btrfs]
     [<ffffffffa04a1e8e>] btrfs_ioctl+0xd87/0x1ef9 [btrfs]
     [<ffffffff81122f53>] ? path_openat+0x234/0x4db
     [<ffffffff813c3b78>] ? __do_page_fault+0x31d/0x391
     [<ffffffff810f8ab6>] ? vma_link+0x74/0x94
     [<ffffffff811250f5>] vfs_ioctl+0x1d/0x39
     [<ffffffff811258c8>] do_vfs_ioctl+0x32d/0x3e2
     [<ffffffff811259d4>] SyS_ioctl+0x57/0x83
     [<ffffffff813c3bfa>] ? do_page_fault+0xe/0x10
     [<ffffffff813c73c2>] system_call_fastpath+0x16/0x1b
    
    It is because we returned the error number if the reference of the root was 0
    when doing space relocation. It was not right here, because though the root
    was dead(refs == 0), but the space it held still need be relocated, or we
    could not remove the block group. So in this case, we should return the root
    no matter it is dead or not.
    Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
    Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
    Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
    c00869f1
relocation.c 108 KB