@@ -286,6 +286,8 @@ struct backref_cache {
/* The list of useless backref nodes during backref cache build */
struct list_head useless_node;
+
+ struct btrfs_fs_info *fs_info;
};
#endif
@@ -185,10 +185,12 @@ static void mapping_tree_init(struct mapping_tree *tree)
spin_lock_init(&tree->lock);
}
-static void backref_cache_init(struct backref_cache *cache, int is_reloc)
+static void backref_cache_init(struct btrfs_fs_info *fs_info,
+ struct backref_cache *cache, int is_reloc)
{
int i;
cache->rb_root = RB_ROOT;
+ cache->fs_info = fs_info;
for (i = 0; i < BTRFS_MAX_LEVEL; i++)
INIT_LIST_HEAD(&cache->pending[i]);
INIT_LIST_HEAD(&cache->changed);
@@ -579,14 +581,13 @@ static struct btrfs_root *read_fs_root(struct btrfs_fs_info *fs_info,
return btrfs_get_fs_root(fs_info, &key, false);
}
-static int handle_one_tree_backref(struct reloc_control *rc,
+static int handle_one_tree_backref(struct backref_cache *cache,
struct btrfs_path *path,
struct btrfs_key *ref_key,
struct btrfs_key *tree_key,
struct backref_node *cur)
{
- struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
- struct backref_cache *cache = &rc->backref_cache;
+ struct btrfs_fs_info *fs_info = cache->fs_info;
struct list_head *useless_node = &cache->useless_node;
struct list_head *pending_edge = &cache->pending_edge;
struct backref_node *upper;
@@ -777,13 +778,12 @@ static int handle_one_tree_backref(struct reloc_control *rc,
return ret;
}
-static int handle_one_tree_block(struct reloc_control *rc,
+static int handle_one_tree_block(struct backref_cache *cache,
struct btrfs_path *path,
struct btrfs_backref_iter *iter,
struct btrfs_key *node_key,
struct backref_node *cur)
{
- struct backref_cache *cache = &rc->backref_cache;
struct backref_edge *edge;
struct backref_node *exist;
int ret;
@@ -867,7 +867,7 @@ static int handle_one_tree_block(struct reloc_control *rc,
continue;
}
- ret = handle_one_tree_backref(rc, path, &key, node_key, cur);
+ ret = handle_one_tree_backref(cache, path, &key, node_key, cur);
if (ret < 0)
goto out;
}
@@ -1109,7 +1109,7 @@ struct backref_node *build_backref_tree(struct reloc_control *rc,
/* Breadth-first search to build backref cache */
while (1) {
- ret = handle_one_tree_block(rc, path, iter, node_key, cur);
+ ret = handle_one_tree_block(cache, path, iter, node_key, cur);
if (ret < 0) {
err = ret;
goto out;
@@ -4307,7 +4307,7 @@ static struct reloc_control *alloc_reloc_control(struct btrfs_fs_info *fs_info)
INIT_LIST_HEAD(&rc->reloc_roots);
INIT_LIST_HEAD(&rc->dirty_subvol_roots);
- backref_cache_init(&rc->backref_cache, 1);
+ backref_cache_init(fs_info, &rc->backref_cache, 1);
mapping_tree_init(&rc->reloc_root_tree);
extent_io_tree_init(fs_info, &rc->processed_blocks,
IO_TREE_RELOC_BLOCKS, NULL);
Add this member so that we can grab fs_info without the help from reloc_control. Signed-off-by: Qu Wenruo <wqu@suse.com> --- fs/btrfs/backref.h | 2 ++ fs/btrfs/relocation.c | 18 +++++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-)