summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosef Bacik <josef@toxicpanda.com>2020-03-04 11:18:23 -0500
committerDavid Sterba <dsterba@suse.com>2020-03-23 17:01:57 +0100
commit8e19c9732ad1d127b5575a10f4fbcacf740500ff (patch)
treee55fba46052da1750f5556500c64ca3ebef943e6
parent19b546d7a1b2eaf575d04a8434e32f679877c45e (diff)
downloadlinux-stable-8e19c9732ad1d127b5575a10f4fbcacf740500ff.tar.gz
linux-stable-8e19c9732ad1d127b5575a10f4fbcacf740500ff.tar.bz2
linux-stable-8e19c9732ad1d127b5575a10f4fbcacf740500ff.zip
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: Qu Wenruo <wqu@suse.com> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/relocation.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 536fc4cb8fcc..d7f3d2197fa1 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1228,7 +1228,7 @@ out:
free_backref_node(cache, lower);
}
- free_backref_node(cache, node);
+ remove_backref_node(cache, node);
return ERR_PTR(err);
}
ASSERT(!node || !node->detached);