Btrfs: fix an oops when doing balance relocation
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>
Wed, 11 Dec 2013 11:29:51 +0000 (19:29 +0800)
committerChris Mason <clm@fb.com>
Thu, 12 Dec 2013 15:12:20 +0000 (07:12 -0800)
commitc974c4642fee8c58239c7753d0bf548b23799923
treea671a832030045d977a38ec25a84044fcbca5d1e
parent639eefc8afd1b8b839b1fd5605378d869d3612a1
Btrfs: fix an oops when doing balance relocation

I hit an oops when inserting reloc root into @reloc_root_tree(it can be
easily triggered when forcing cow for relocation root)

[  866.494539]  [<ffffffffa0499579>] btrfs_init_reloc_root+0x79/0xb0 [btrfs]
[  866.495321]  [<ffffffffa044c240>] record_root_in_trans+0xb0/0x110 [btrfs]
[  866.496109]  [<ffffffffa044d758>] btrfs_record_root_in_trans+0x48/0x80 [btrfs]
[  866.496908]  [<ffffffffa0494da8>] select_reloc_root+0xa8/0x210 [btrfs]
[  866.497703]  [<ffffffffa0495c8a>] do_relocation+0x16a/0x540 [btrfs]

This is because reloc root inserted into @reloc_root_tree is not within one
transaction,reloc root may be cowed and root block bytenr will be reused then
oops happens.We should update reloc root in @reloc_root_tree when cow reloc
root node, fix it.

Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Reviewed-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/relocation.c