diff options
author | Liu Bo <bo.li.liu@oracle.com> | 2016-07-12 20:29:37 +0300 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2016-07-26 14:52:25 +0300 |
commit | 0fd8c3dae14fb64947842472940b807ca0781da9 (patch) | |
tree | a45c5235f5267739564328a3ee0ba6ecf96e73fe | |
parent | baf863b9c29617cc9eaf24e039f58846e700db48 (diff) | |
download | linux-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.c | 4 |
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); |