| From 8e19c9732ad1d127b5575a10f4fbcacf740500ff Mon Sep 17 00:00:00 2001 |
| From: Josef Bacik <josef@toxicpanda.com> |
| Date: Wed, 4 Mar 2020 11:18:23 -0500 |
| Subject: btrfs: drop block from cache on error in relocation |
| |
| From: Josef Bacik <josef@toxicpanda.com> |
| |
| commit 8e19c9732ad1d127b5575a10f4fbcacf740500ff upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/btrfs/relocation.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/btrfs/relocation.c |
| +++ b/fs/btrfs/relocation.c |
| @@ -1186,7 +1186,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); |