btrfs: drop block from cache on error in relocation
authorJosef Bacik <josef@toxicpanda.com>
Wed, 4 Mar 2020 16:18:23 +0000 (11:18 -0500)
committerDavid Sterba <dsterba@suse.com>
Mon, 23 Mar 2020 16:01:57 +0000 (17:01 +0100)
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>
fs/btrfs/relocation.c

index 536fc4cb8fcc0ed0d80e8431f2f398b92ecb6a16..d7f3d2197fa15891e09b789abbc5bc7c1cdee52c 100644 (file)
@@ -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);