diff options
author | Liu Bo <bo.li.liu@oracle.com> | 2016-07-12 10:29:37 -0700 |
---|---|---|
committer | David Sterba <dsterba@suse.com> | 2016-07-26 13:52:25 +0200 |
commit | 0fd8c3dae14fb64947842472940b807ca0781da9 (patch) | |
tree | a45c5235f5267739564328a3ee0ba6ecf96e73fe /fs/btrfs/relocation.c | |
parent | baf863b9c29617cc9eaf24e039f58846e700db48 (diff) | |
download | op-kernel-dev-0fd8c3dae14fb64947842472940b807ca0781da9.zip op-kernel-dev-0fd8c3dae14fb64947842472940b807ca0781da9.tar.gz |
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>
Diffstat (limited to 'fs/btrfs/relocation.c')
-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 13c9a48..97cafe7 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); |