Btrfs: fix an oops when we fail to relocate tree blocks
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>
Sat, 28 Dec 2013 11:52:39 +0000 (19:52 +0800)
committerChris Mason <clm@fb.com>
Tue, 28 Jan 2014 21:20:14 +0000 (13:20 -0800)
During balance test, we hit an oops:
[ 2013.841551] kernel BUG at fs/btrfs/relocation.c:1174!

The problem is that if we fail to relocate tree blocks, we should
update backref cache, otherwise, some pending nodes are not updated
while snapshot check @cache->last_trans is within one transaction
and won't update it and then oops happen.

Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: Josef Bacik <jbacik@fb.com>
Signed-off-by: Chris Mason <clm@fb.com>
fs/btrfs/relocation.c

index 9189f9e3c3598fb5ce517fc09cde7ac8a36a0862..07b3b36f40ee51657b248112a6d1f028cea9e364 100644 (file)
@@ -4009,6 +4009,12 @@ restart:
                if (!RB_EMPTY_ROOT(&blocks)) {
                        ret = relocate_tree_blocks(trans, rc, &blocks);
                        if (ret < 0) {
+                               /*
+                                * if we fail to relocate tree blocks, force to update
+                                * backref cache when committing transaction.
+                                */
+                               rc->backref_cache.last_trans = trans->transid - 1;
+
                                if (ret != -EAGAIN) {
                                        err = ret;
                                        break;