btrfs: backref: rename and move remove_backref_node()
authorQu Wenruo <wqu@suse.com>
Mon, 23 Mar 2020 07:42:25 +0000 (15:42 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 May 2020 09:25:20 +0000 (11:25 +0200)
Also add comment explaining the cleanup progress, to differ it from
btrfs_backref_drop_node().

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/backref.c
fs/btrfs/backref.h
fs/btrfs/relocation.c

index 4837dcf..daac20c 100644 (file)
@@ -2514,3 +2514,48 @@ struct btrfs_backref_edge *btrfs_backref_alloc_edge(
                cache->nr_edges++;
        return edge;
 }
+
+/*
+ * Drop the backref node from cache, also cleaning up all its
+ * upper edges and any uncached nodes in the path.
+ *
+ * This cleanup happens bottom up, thus the node should either
+ * be the lowest node in the cache or a detached node.
+ */
+void btrfs_backref_cleanup_node(struct btrfs_backref_cache *cache,
+                               struct btrfs_backref_node *node)
+{
+       struct btrfs_backref_node *upper;
+       struct btrfs_backref_edge *edge;
+
+       if (!node)
+               return;
+
+       BUG_ON(!node->lowest && !node->detached);
+       while (!list_empty(&node->upper)) {
+               edge = list_entry(node->upper.next, struct btrfs_backref_edge,
+                                 list[LOWER]);
+               upper = edge->node[UPPER];
+               list_del(&edge->list[LOWER]);
+               list_del(&edge->list[UPPER]);
+               btrfs_backref_free_edge(cache, edge);
+
+               if (RB_EMPTY_NODE(&upper->rb_node)) {
+                       BUG_ON(!list_empty(&node->upper));
+                       btrfs_backref_drop_node(cache, node);
+                       node = upper;
+                       node->lowest = 1;
+                       continue;
+               }
+               /*
+                * Add the node to leaf node list if no other child block
+                * cached.
+                */
+               if (list_empty(&upper->lower)) {
+                       list_add_tail(&upper->lower, &cache->leaves);
+                       upper->lowest = 1;
+               }
+       }
+
+       btrfs_backref_drop_node(cache, node);
+}
index a14c79b..1710cf9 100644 (file)
@@ -350,4 +350,7 @@ static inline void btrfs_backref_drop_node(struct btrfs_backref_cache *tree,
        btrfs_backref_free_node(tree, node);
 }
 
+void btrfs_backref_cleanup_node(struct btrfs_backref_cache *cache,
+                               struct btrfs_backref_node *node);
+
 #endif
index d23b9a5..4b7d7d5 100644 (file)
@@ -153,9 +153,6 @@ struct reloc_control {
 #define MOVE_DATA_EXTENTS      0
 #define UPDATE_DATA_PTRS       1
 
-static void remove_backref_node(struct btrfs_backref_cache *cache,
-                               struct btrfs_backref_node *node);
-
 static void mark_block_processed(struct reloc_control *rc,
                                 struct btrfs_backref_node *node)
 {
@@ -186,13 +183,13 @@ static void backref_cache_cleanup(struct btrfs_backref_cache *cache)
        while (!list_empty(&cache->detached)) {
                node = list_entry(cache->detached.next,
                                  struct btrfs_backref_node, list);
-               remove_backref_node(cache, node);
+               btrfs_backref_cleanup_node(cache, node);
        }
 
        while (!list_empty(&cache->leaves)) {
                node = list_entry(cache->leaves.next,
                                  struct btrfs_backref_node, lower);
-               remove_backref_node(cache, node);
+               btrfs_backref_cleanup_node(cache, node);
        }
 
        cache->last_trans = 0;
@@ -268,46 +265,6 @@ static struct btrfs_backref_node *walk_down_backref(
        *index = 0;
        return NULL;
 }
-/*
- * remove a backref node from the backref cache
- */
-static void remove_backref_node(struct btrfs_backref_cache *cache,
-                               struct btrfs_backref_node *node)
-{
-       struct btrfs_backref_node *upper;
-       struct btrfs_backref_edge *edge;
-
-       if (!node)
-               return;
-
-       BUG_ON(!node->lowest && !node->detached);
-       while (!list_empty(&node->upper)) {
-               edge = list_entry(node->upper.next, struct btrfs_backref_edge,
-                                 list[LOWER]);
-               upper = edge->node[UPPER];
-               list_del(&edge->list[LOWER]);
-               list_del(&edge->list[UPPER]);
-               btrfs_backref_free_edge(cache, edge);
-
-               if (RB_EMPTY_NODE(&upper->rb_node)) {
-                       BUG_ON(!list_empty(&node->upper));
-                       btrfs_backref_drop_node(cache, node);
-                       node = upper;
-                       node->lowest = 1;
-                       continue;
-               }
-               /*
-                * add the node to leaf node list if no other
-                * child block cached.
-                */
-               if (list_empty(&upper->lower)) {
-                       list_add_tail(&upper->lower, &cache->leaves);
-                       upper->lowest = 1;
-               }
-       }
-
-       btrfs_backref_drop_node(cache, node);
-}
 
 static void update_backref_node(struct btrfs_backref_cache *cache,
                                struct btrfs_backref_node *node, u64 bytenr)
@@ -345,7 +302,7 @@ static int update_backref_cache(struct btrfs_trans_handle *trans,
        while (!list_empty(&cache->detached)) {
                node = list_entry(cache->detached.next,
                                  struct btrfs_backref_node, list);
-               remove_backref_node(cache, node);
+               btrfs_backref_cleanup_node(cache, node);
        }
 
        while (!list_empty(&cache->changed)) {
@@ -1120,7 +1077,7 @@ out:
                        btrfs_backref_free_node(cache, lower);
                }
 
-               remove_backref_node(cache, node);
+               btrfs_backref_cleanup_node(cache, node);
                ASSERT(list_empty(&cache->useless_node) &&
                       list_empty(&cache->pending_edge));
                return ERR_PTR(err);
@@ -3103,7 +3060,7 @@ static int relocate_tree_block(struct btrfs_trans_handle *trans,
        }
 out:
        if (ret || node->level == 0 || node->cowonly)
-               remove_backref_node(&rc->backref_cache, node);
+               btrfs_backref_cleanup_node(&rc->backref_cache, node);
        return ret;
 }