btrfs: reloc: pass essential members for alloc_backref_node()
authorQu Wenruo <wqu@suse.com>
Mon, 24 Feb 2020 01:34:55 +0000 (09:34 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 May 2020 09:25:18 +0000 (11:25 +0200)
Bytenr and level are essential parameters for backref_node, thus it
makes sense to initialize them at allocation time.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
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/relocation.c

index d197f44..be66d03 100644 (file)
@@ -339,18 +339,24 @@ static void backref_cache_cleanup(struct backref_cache *cache)
        ASSERT(!cache->nr_edges);
 }
 
-static struct backref_node *alloc_backref_node(struct backref_cache *cache)
+static struct backref_node *alloc_backref_node(struct backref_cache *cache,
+                                               u64 bytenr, int level)
 {
        struct backref_node *node;
 
+       ASSERT(level >= 0 && level < BTRFS_MAX_LEVEL);
        node = kzalloc(sizeof(*node), GFP_NOFS);
-       if (node) {
-               INIT_LIST_HEAD(&node->list);
-               INIT_LIST_HEAD(&node->upper);
-               INIT_LIST_HEAD(&node->lower);
-               RB_CLEAR_NODE(&node->rb_node);
-               cache->nr_nodes++;
-       }
+       if (!node)
+               return node;
+
+       INIT_LIST_HEAD(&node->list);
+       INIT_LIST_HEAD(&node->upper);
+       INIT_LIST_HEAD(&node->lower);
+       RB_CLEAR_NODE(&node->rb_node);
+       cache->nr_nodes++;
+       node->level = level;
+       node->bytenr = bytenr;
+
        return node;
 }
 
@@ -775,13 +781,12 @@ static int handle_direct_tree_backref(struct backref_cache *cache,
        rb_node = tree_search(&cache->rb_root, ref_key->offset);
        if (!rb_node) {
                /* Parent node not yet cached */
-               upper = alloc_backref_node(cache);
+               upper = alloc_backref_node(cache, ref_key->offset,
+                                          cur->level + 1);
                if (!upper) {
                        free_backref_edge(cache, edge);
                        return -ENOMEM;
                }
-               upper->bytenr = ref_key->offset;
-               upper->level = cur->level + 1;
 
                /*
                 *  Backrefs for the upper level block isn't cached, add the
@@ -896,16 +901,15 @@ static int handle_indirect_tree_backref(struct backref_cache *cache,
                eb = path->nodes[level];
                rb_node = tree_search(&cache->rb_root, eb->start);
                if (!rb_node) {
-                       upper = alloc_backref_node(cache);
+                       upper = alloc_backref_node(cache, eb->start,
+                                                  lower->level + 1);
                        if (!upper) {
                                btrfs_put_root(root);
                                free_backref_edge(cache, edge);
                                ret = -ENOMEM;
                                goto out;
                        }
-                       upper->bytenr = eb->start;
                        upper->owner = btrfs_header_owner(eb);
-                       upper->level = lower->level + 1;
                        if (!test_bit(BTRFS_ROOT_REF_COWS, &root->state))
                                upper->cowonly = 1;
 
@@ -996,14 +1000,12 @@ struct backref_node *build_backref_tree(struct reloc_control *rc,
                goto out;
        }
 
-       node = alloc_backref_node(cache);
+       node = alloc_backref_node(cache, bytenr, level);
        if (!node) {
                err = -ENOMEM;
                goto out;
        }
 
-       node->bytenr = bytenr;
-       node->level = level;
        node->lowest = 1;
        cur = node;
 again:
@@ -1346,12 +1348,10 @@ static int clone_backref_node(struct btrfs_trans_handle *trans,
        if (!node)
                return 0;
 
-       new_node = alloc_backref_node(cache);
+       new_node = alloc_backref_node(cache, dest->node->start, node->level);
        if (!new_node)
                return -ENOMEM;
 
-       new_node->bytenr = dest->node->start;
-       new_node->level = node->level;
        new_node->lowest = node->lowest;
        new_node->checked = 1;
        new_node->root = btrfs_grab_root(dest);