Commit 8e19c973 authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: drop block from cache on error in relocation

If we have an error while building the backref tree in relocation we'll
process all the pending edges and then free the node.  However if we
integrated some edges into the cache we'll lose our link to those edges
by simply freeing this node, which means we'll leak memory and
references to any roots that we've found.

Instead we need to use remove_backref_node(), which walks through all of
the edges that are still linked to this node and free's them up and
drops any root references we may be holding.

CC: stable@vger.kernel.org # 4.9+
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 19b546d7
...@@ -1228,7 +1228,7 @@ struct backref_node *build_backref_tree(struct reloc_control *rc, ...@@ -1228,7 +1228,7 @@ struct backref_node *build_backref_tree(struct reloc_control *rc,
free_backref_node(cache, lower); free_backref_node(cache, lower);
} }
free_backref_node(cache, node); remove_backref_node(cache, node);
return ERR_PTR(err); return ERR_PTR(err);
} }
ASSERT(!node || !node->detached); ASSERT(!node || !node->detached);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment