summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiu Bo <bo.li.liu@oracle.com>2016-07-12 20:29:37 +0300
committerDavid Sterba <dsterba@suse.com>2016-07-26 14:52:25 +0300
commit0fd8c3dae14fb64947842472940b807ca0781da9 (patch)
treea45c5235f5267739564328a3ee0ba6ecf96e73fe
parentbaf863b9c29617cc9eaf24e039f58846e700db48 (diff)
downloadlinux-0fd8c3dae14fb64947842472940b807ca0781da9.tar.xz
Btrfs: fix panic in balance due to EIO
During build_backref_tree(), if we fail to read a btree node, we can eventually run into BUG_ON(cache->nr_nodes) that we put in backref_cache_cleanup(), meaning we have at least one memory leak. This frees the backref_node that we's allocated at the very beginning of build_backref_tree(). Signed-off-by: Liu Bo <bo.li.liu@oracle.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/relocation.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 13c9a48c83b0..97cafe7291b8 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1171,8 +1171,12 @@ out:
lower = list_entry(useless.next,
struct backref_node, list);
list_del_init(&lower->list);
+ if (lower == node)
+ node = NULL;
free_backref_node(cache, lower);
}
+
+ free_backref_node(cache, node);
return ERR_PTR(err);
}
ASSERT(!node || !node->detached);