]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: stop accessing ->extent_root directly
authorJosef Bacik <josef@toxicpanda.com>
Fri, 5 Nov 2021 20:45:45 +0000 (16:45 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 3 Jan 2022 14:09:49 +0000 (15:09 +0100)
When we start having multiple extent roots we'll need to use a helper to
get to the correct extent_root.  Rename fs_info->extent_root to
_extent_root and convert all of the users of the extent root to using
the btrfs_extent_root() helper.  This will allow us to easily clean up
the remaining direct accesses in the future.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
16 files changed:
fs/btrfs/backref.c
fs/btrfs/block-group.c
fs/btrfs/block-rsv.c
fs/btrfs/ctree.h
fs/btrfs/disk-io.c
fs/btrfs/disk-io.h
fs/btrfs/extent-tree.c
fs/btrfs/free-space-tree.c
fs/btrfs/qgroup.c
fs/btrfs/ref-verify.c
fs/btrfs/relocation.c
fs/btrfs/scrub.c
fs/btrfs/tests/free-space-tests.c
fs/btrfs/tests/qgroup-tests.c
fs/btrfs/transaction.c
fs/btrfs/zoned.c

index b51f8f90f226a3c77d5a680b965f872983e30e29..c9ee579bc5a61cac421ad54e91a53eb969307f1b 100644 (file)
@@ -1170,7 +1170,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans,
                             struct ulist *roots, const u64 *extent_item_pos,
                             struct share_check *sc, bool ignore_offset)
 {
-       struct btrfs_root *root = fs_info->extent_root;
+       struct btrfs_root *root = btrfs_extent_root(fs_info, bytenr);
        struct btrfs_key key;
        struct btrfs_path *path;
        struct btrfs_delayed_ref_root *delayed_refs = NULL;
@@ -1747,6 +1747,7 @@ int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
                        struct btrfs_path *path, struct btrfs_key *found_key,
                        u64 *flags_ret)
 {
+       struct btrfs_root *extent_root = btrfs_extent_root(fs_info, logical);
        int ret;
        u64 flags;
        u64 size = 0;
@@ -1762,11 +1763,11 @@ int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
        key.objectid = logical;
        key.offset = (u64)-1;
 
-       ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
+       ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0);
        if (ret < 0)
                return ret;
 
-       ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0);
+       ret = btrfs_previous_extent_item(extent_root, path, 0);
        if (ret) {
                if (ret > 0)
                        ret = -ENOENT;
@@ -2335,6 +2336,7 @@ struct btrfs_backref_iter *btrfs_backref_iter_alloc(
 int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr)
 {
        struct btrfs_fs_info *fs_info = iter->fs_info;
+       struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr);
        struct btrfs_path *path = iter->path;
        struct btrfs_extent_item *ei;
        struct btrfs_key key;
@@ -2345,7 +2347,7 @@ int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr)
        key.offset = (u64)-1;
        iter->bytenr = bytenr;
 
-       ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
+       ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0);
        if (ret < 0)
                return ret;
        if (ret == 0) {
@@ -2388,7 +2390,7 @@ int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr)
 
        /* If there is no inline backref, go search for keyed backref */
        if (iter->cur_ptr >= iter->end_ptr) {
-               ret = btrfs_next_item(fs_info->extent_root, path);
+               ret = btrfs_next_item(extent_root, path);
 
                /* No inline nor keyed ref */
                if (ret > 0) {
@@ -2432,6 +2434,7 @@ release:
 int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
 {
        struct extent_buffer *eb = btrfs_backref_get_eb(iter);
+       struct btrfs_root *extent_root;
        struct btrfs_path *path = iter->path;
        struct btrfs_extent_inline_ref *iref;
        int ret;
@@ -2462,7 +2465,8 @@ int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
        }
 
        /* We're at keyed items, there is no inline item, go to the next one */
-       ret = btrfs_next_item(iter->fs_info->extent_root, iter->path);
+       extent_root = btrfs_extent_root(iter->fs_info, iter->bytenr);
+       ret = btrfs_next_item(extent_root, iter->path);
        if (ret)
                return ret;
 
index d3d4200e2afc03fd66380f6baf3729006d3876a8..7d6372103aaf0abced99546a9fc2b6548a3ce8e7 100644 (file)
@@ -514,7 +514,7 @@ static int load_extent_tree_free(struct btrfs_caching_control *caching_ctl)
 {
        struct btrfs_block_group *block_group = caching_ctl->block_group;
        struct btrfs_fs_info *fs_info = block_group->fs_info;
-       struct btrfs_root *extent_root = fs_info->extent_root;
+       struct btrfs_root *extent_root;
        struct btrfs_path *path;
        struct extent_buffer *leaf;
        struct btrfs_key key;
@@ -529,6 +529,7 @@ static int load_extent_tree_free(struct btrfs_caching_control *caching_ctl)
                return -ENOMEM;
 
        last = max_t(u64, block_group->start, BTRFS_SUPER_INFO_OFFSET);
+       extent_root = btrfs_extent_root(fs_info, last);
 
 #ifdef CONFIG_BTRFS_DEBUG
        /*
index 454f3c629dd8c402bcda4e18cfd6e64f30f1dc75..b216c4c7292a36b7ecccfc4f2b9296cf4216fe2e 100644 (file)
@@ -6,6 +6,7 @@
 #include "space-info.h"
 #include "transaction.h"
 #include "block-group.h"
+#include "disk-io.h"
 
 /*
  * HOW DO BLOCK RESERVES WORK
@@ -351,6 +352,7 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info)
 {
        struct btrfs_block_rsv *block_rsv = &fs_info->global_block_rsv;
        struct btrfs_space_info *sinfo = block_rsv->space_info;
+       struct btrfs_root *extent_root = btrfs_extent_root(fs_info, 0);
        u64 num_bytes;
        unsigned min_items;
 
@@ -359,7 +361,7 @@ void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info)
         * checksum tree and the root tree.  If the fs is empty we want to set
         * it to a minimal amount for safety.
         */
-       num_bytes = btrfs_root_used(&fs_info->extent_root->root_item) +
+       num_bytes = btrfs_root_used(&extent_root->root_item) +
                btrfs_root_used(&fs_info->csum_root->root_item) +
                btrfs_root_used(&fs_info->tree_root->root_item);
 
index 6474e3094daee6f994ba756678b5c89de5fc795c..aa4f0ad558d41e15541cf8bd651b95fb3fb7886a 100644 (file)
@@ -621,7 +621,7 @@ enum btrfs_exclusive_operation {
 struct btrfs_fs_info {
        u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
        unsigned long flags;
-       struct btrfs_root *extent_root;
+       struct btrfs_root *_extent_root;
        struct btrfs_root *tree_root;
        struct btrfs_root *chunk_root;
        struct btrfs_root *dev_root;
index ff5ec8218501a828c1197a2e6e9eee48fd86b9c1..1b69f8e52939d01681e5c809bc43dd628886b053 100644 (file)
@@ -1557,7 +1557,7 @@ static struct btrfs_root *btrfs_get_global_root(struct btrfs_fs_info *fs_info,
        if (objectid == BTRFS_ROOT_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->tree_root);
        if (objectid == BTRFS_EXTENT_TREE_OBJECTID)
-               return btrfs_grab_root(fs_info->extent_root);
+               return btrfs_grab_root(fs_info->_extent_root);
        if (objectid == BTRFS_CHUNK_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->chunk_root);
        if (objectid == BTRFS_DEV_TREE_OBJECTID)
@@ -1630,7 +1630,7 @@ void btrfs_free_fs_info(struct btrfs_fs_info *fs_info)
        btrfs_free_ref_cache(fs_info);
        kfree(fs_info->balance_ctl);
        kfree(fs_info->delayed_root);
-       btrfs_put_root(fs_info->extent_root);
+       btrfs_put_root(fs_info->_extent_root);
        btrfs_put_root(fs_info->tree_root);
        btrfs_put_root(fs_info->chunk_root);
        btrfs_put_root(fs_info->dev_root);
@@ -2008,6 +2008,7 @@ static void backup_super_roots(struct btrfs_fs_info *info)
 {
        const int next_backup = info->backup_root_index;
        struct btrfs_root_backup *root_backup;
+       struct btrfs_root *extent_root = btrfs_extent_root(info, 0);
 
        root_backup = info->super_for_commit->super_roots + next_backup;
 
@@ -2032,11 +2033,11 @@ static void backup_super_roots(struct btrfs_fs_info *info)
        btrfs_set_backup_chunk_root_level(root_backup,
                               btrfs_header_level(info->chunk_root->node));
 
-       btrfs_set_backup_extent_root(root_backup, info->extent_root->node->start);
+       btrfs_set_backup_extent_root(root_backup, extent_root->node->start);
        btrfs_set_backup_extent_root_gen(root_backup,
-                              btrfs_header_generation(info->extent_root->node));
+                              btrfs_header_generation(extent_root->node));
        btrfs_set_backup_extent_root_level(root_backup,
-                              btrfs_header_level(info->extent_root->node));
+                              btrfs_header_level(extent_root->node));
 
        /*
         * we might commit during log recovery, which happens before we set
@@ -2166,7 +2167,7 @@ static void free_root_pointers(struct btrfs_fs_info *info, bool free_chunk_root)
        free_root_extent_buffers(info->tree_root);
 
        free_root_extent_buffers(info->dev_root);
-       free_root_extent_buffers(info->extent_root);
+       free_root_extent_buffers(info->_extent_root);
        free_root_extent_buffers(info->csum_root);
        free_root_extent_buffers(info->quota_root);
        free_root_extent_buffers(info->uuid_root);
@@ -2456,7 +2457,7 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info)
                }
        } else {
                set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
-               fs_info->extent_root = root;
+               fs_info->_extent_root = root;
        }
 
        location.objectid = BTRFS_DEV_TREE_OBJECTID;
index baca29523d35c53e6b60dbef7aa39e1287c23a7a..e2824c6ada720e06197e99cdb5404289786ea940 100644 (file)
@@ -103,9 +103,15 @@ static inline struct btrfs_root *btrfs_grab_root(struct btrfs_root *root)
        return NULL;
 }
 
+static inline struct btrfs_root *btrfs_extent_root(struct btrfs_fs_info *fs_info,
+                                                  u64 bytenr)
+{
+       return fs_info->_extent_root;
+}
+
 static inline struct btrfs_root *btrfs_block_group_root(struct btrfs_fs_info *fs_info)
 {
-       return fs_info->extent_root;
+       return btrfs_extent_root(fs_info, 0);
 }
 
 void btrfs_put_root(struct btrfs_root *root);
index ae25ca54cbe80ababe013e12d0378c5b78427714..8e5dcb9928f5b43c138fb6d432270ed2efd73cc2 100644 (file)
@@ -87,6 +87,7 @@ void btrfs_free_excluded_extents(struct btrfs_block_group *cache)
 /* simple helper to search for an existing data extent at a given offset */
 int btrfs_lookup_data_extent(struct btrfs_fs_info *fs_info, u64 start, u64 len)
 {
+       struct btrfs_root *root = btrfs_extent_root(fs_info, start);
        int ret;
        struct btrfs_key key;
        struct btrfs_path *path;
@@ -98,7 +99,7 @@ int btrfs_lookup_data_extent(struct btrfs_fs_info *fs_info, u64 start, u64 len)
        key.objectid = start;
        key.offset = len;
        key.type = BTRFS_EXTENT_ITEM_KEY;
-       ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
+       ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
        btrfs_free_path(path);
        return ret;
 }
@@ -116,6 +117,7 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans,
                             struct btrfs_fs_info *fs_info, u64 bytenr,
                             u64 offset, int metadata, u64 *refs, u64 *flags)
 {
+       struct btrfs_root *extent_root;
        struct btrfs_delayed_ref_head *head;
        struct btrfs_delayed_ref_root *delayed_refs;
        struct btrfs_path *path;
@@ -153,7 +155,8 @@ search_again:
        else
                key.type = BTRFS_EXTENT_ITEM_KEY;
 
-       ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
+       extent_root = btrfs_extent_root(fs_info, bytenr);
+       ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0);
        if (ret < 0)
                goto out_free;
 
@@ -443,7 +446,7 @@ static noinline int lookup_extent_data_ref(struct btrfs_trans_handle *trans,
                                           u64 root_objectid,
                                           u64 owner, u64 offset)
 {
-       struct btrfs_root *root = trans->fs_info->extent_root;
+       struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr);
        struct btrfs_key key;
        struct btrfs_extent_data_ref *ref;
        struct extent_buffer *leaf;
@@ -519,7 +522,7 @@ static noinline int insert_extent_data_ref(struct btrfs_trans_handle *trans,
                                           u64 root_objectid, u64 owner,
                                           u64 offset, int refs_to_add)
 {
-       struct btrfs_root *root = trans->fs_info->extent_root;
+       struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr);
        struct btrfs_key key;
        struct extent_buffer *leaf;
        u32 size;
@@ -686,7 +689,7 @@ static noinline int lookup_tree_block_ref(struct btrfs_trans_handle *trans,
                                          u64 bytenr, u64 parent,
                                          u64 root_objectid)
 {
-       struct btrfs_root *root = trans->fs_info->extent_root;
+       struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr);
        struct btrfs_key key;
        int ret;
 
@@ -710,6 +713,7 @@ static noinline int insert_tree_block_ref(struct btrfs_trans_handle *trans,
                                          u64 bytenr, u64 parent,
                                          u64 root_objectid)
 {
+       struct btrfs_root *root = btrfs_extent_root(trans->fs_info, bytenr);
        struct btrfs_key key;
        int ret;
 
@@ -722,8 +726,7 @@ static noinline int insert_tree_block_ref(struct btrfs_trans_handle *trans,
                key.offset = root_objectid;
        }
 
-       ret = btrfs_insert_empty_item(trans, trans->fs_info->extent_root,
-                                     path, &key, 0);
+       ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
        btrfs_release_path(path);
        return ret;
 }
@@ -788,7 +791,7 @@ int lookup_inline_extent_backref(struct btrfs_trans_handle *trans,
                                 u64 owner, u64 offset, int insert)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
-       struct btrfs_root *root = fs_info->extent_root;
+       struct btrfs_root *root = btrfs_extent_root(fs_info, bytenr);
        struct btrfs_key key;
        struct extent_buffer *leaf;
        struct btrfs_extent_item *ei;
@@ -1574,6 +1577,7 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,
                                 struct btrfs_delayed_extent_op *extent_op)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
+       struct btrfs_root *root;
        struct btrfs_key key;
        struct btrfs_path *path;
        struct btrfs_extent_item *ei;
@@ -1603,8 +1607,9 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,
                key.offset = head->num_bytes;
        }
 
+       root = btrfs_extent_root(fs_info, key.objectid);
 again:
-       ret = btrfs_search_slot(trans, fs_info->extent_root, &key, path, 0, 1);
+       ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
        if (ret < 0) {
                err = ret;
                goto out;
@@ -2287,7 +2292,7 @@ static noinline int check_committed_ref(struct btrfs_root *root,
                                        bool strict)
 {
        struct btrfs_fs_info *fs_info = root->fs_info;
-       struct btrfs_root *extent_root = fs_info->extent_root;
+       struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr);
        struct extent_buffer *leaf;
        struct btrfs_extent_data_ref *ref;
        struct btrfs_extent_inline_ref *iref;
@@ -2922,7 +2927,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
        struct btrfs_fs_info *info = trans->fs_info;
        struct btrfs_key key;
        struct btrfs_path *path;
-       struct btrfs_root *extent_root = info->extent_root;
+       struct btrfs_root *extent_root;
        struct extent_buffer *leaf;
        struct btrfs_extent_item *ei;
        struct btrfs_extent_inline_ref *iref;
@@ -2938,6 +2943,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
        int last_ref = 0;
        bool skinny_metadata = btrfs_fs_incompat(info, SKINNY_METADATA);
 
+       extent_root = btrfs_extent_root(info, bytenr);
+
        path = btrfs_alloc_path();
        if (!path)
                return -ENOMEM;
@@ -4572,6 +4579,7 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
                                      struct btrfs_key *ins, int ref_mod)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
+       struct btrfs_root *extent_root;
        int ret;
        struct btrfs_extent_item *extent_item;
        struct btrfs_extent_inline_ref *iref;
@@ -4591,8 +4599,8 @@ static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
        if (!path)
                return -ENOMEM;
 
-       ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path,
-                                     ins, size);
+       extent_root = btrfs_extent_root(fs_info, ins->objectid);
+       ret = btrfs_insert_empty_item(trans, extent_root, path, ins, size);
        if (ret) {
                btrfs_free_path(path);
                return ret;
@@ -4644,6 +4652,7 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
                                     struct btrfs_delayed_extent_op *extent_op)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
+       struct btrfs_root *extent_root;
        int ret;
        struct btrfs_extent_item *extent_item;
        struct btrfs_key extent_key;
@@ -4675,8 +4684,9 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
        if (!path)
                return -ENOMEM;
 
-       ret = btrfs_insert_empty_item(trans, fs_info->extent_root, path,
-                                     &extent_key, size);
+       extent_root = btrfs_extent_root(fs_info, extent_key.objectid);
+       ret = btrfs_insert_empty_item(trans, extent_root, path, &extent_key,
+                                     size);
        if (ret) {
                btrfs_free_path(path);
                return ret;
index 3abec44c62559df0b926230f6776bbf2a0e2e88b..4e9bf940a566ec5103d0c344c87decfc5c8fa16a 100644 (file)
@@ -1046,7 +1046,7 @@ out:
 static int populate_free_space_tree(struct btrfs_trans_handle *trans,
                                    struct btrfs_block_group *block_group)
 {
-       struct btrfs_root *extent_root = trans->fs_info->extent_root;
+       struct btrfs_root *extent_root;
        struct btrfs_path *path, *path2;
        struct btrfs_key key;
        u64 start, end;
@@ -1080,6 +1080,7 @@ static int populate_free_space_tree(struct btrfs_trans_handle *trans,
        key.type = BTRFS_EXTENT_ITEM_KEY;
        key.offset = 0;
 
+       extent_root = btrfs_extent_root(trans->fs_info, key.objectid);
        ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0);
        if (ret < 0)
                goto out_locked;
index 071f7334f81891dda4ace689c93ba2f3075d8fec..8928275823a1708779fe5edad275971f9de25c4e 100644 (file)
@@ -3161,6 +3161,7 @@ static int qgroup_rescan_leaf(struct btrfs_trans_handle *trans,
                              struct btrfs_path *path)
 {
        struct btrfs_fs_info *fs_info = trans->fs_info;
+       struct btrfs_root *extent_root;
        struct btrfs_key found;
        struct extent_buffer *scratch_leaf = NULL;
        struct ulist *roots = NULL;
@@ -3170,7 +3171,9 @@ static int qgroup_rescan_leaf(struct btrfs_trans_handle *trans,
        int ret;
 
        mutex_lock(&fs_info->qgroup_rescan_lock);
-       ret = btrfs_search_slot_for_read(fs_info->extent_root,
+       extent_root = btrfs_extent_root(fs_info,
+                               fs_info->qgroup_rescan_progress.objectid);
+       ret = btrfs_search_slot_for_read(extent_root,
                                         &fs_info->qgroup_rescan_progress,
                                         path, 1, 0);
 
index f34130d90dee556f94deaa54c809f09d4f686e08..a248f46cfe728cfe0e2a7d6b965e7db51f98b786 100644 (file)
@@ -972,6 +972,7 @@ void btrfs_free_ref_tree_range(struct btrfs_fs_info *fs_info, u64 start,
 /* Walk down all roots and build the ref tree, meant to be called at mount */
 int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info)
 {
+       struct btrfs_root *extent_root;
        struct btrfs_path *path;
        struct extent_buffer *eb;
        int tree_block_level = 0;
@@ -985,7 +986,8 @@ int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info)
        if (!path)
                return -ENOMEM;
 
-       eb = btrfs_read_lock_root_node(fs_info->extent_root);
+       extent_root = btrfs_extent_root(fs_info, 0);
+       eb = btrfs_read_lock_root_node(extent_root);
        level = btrfs_header_level(eb);
        path->nodes[level] = eb;
        path->slots[level] = 0;
@@ -998,7 +1000,7 @@ int btrfs_build_ref_tree(struct btrfs_fs_info *fs_info)
                 * would have had to added a ref key item which may appear on a
                 * different leaf from the original extent item.
                 */
-               ret = walk_down_tree(fs_info->extent_root, path, level,
+               ret = walk_down_tree(extent_root, path, level,
                                     &bytenr, &num_bytes, &tree_block_level);
                if (ret)
                        break;
index a455a1ead0d6dd6adcd4abe31ba61a416c205290..681fb2544a059751556e31e68d25b6024dd9fad4 100644 (file)
@@ -3964,7 +3964,7 @@ static const char *stage_to_string(int stage)
 int btrfs_relocate_block_group(struct btrfs_fs_info *fs_info, u64 group_start)
 {
        struct btrfs_block_group *bg;
-       struct btrfs_root *extent_root = fs_info->extent_root;
+       struct btrfs_root *extent_root = btrfs_extent_root(fs_info, group_start);
        struct reloc_control *rc;
        struct inode *inode;
        struct btrfs_path *path;
@@ -4215,7 +4215,7 @@ int btrfs_recover_relocation(struct btrfs_root *root)
                goto out_end;
        }
 
-       rc->extent_root = fs_info->extent_root;
+       rc->extent_root = btrfs_extent_root(fs_info, 0);
 
        set_reloc_control(rc);
 
index d175c5ab113496fb2f50b6a1ec065e0b334ab99c..a0017351e5585ad7bd314f5cc1de2d5608d22bdf 100644 (file)
@@ -2897,7 +2897,7 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx,
                                                  u64 logic_end)
 {
        struct btrfs_fs_info *fs_info = sctx->fs_info;
-       struct btrfs_root *root = fs_info->extent_root;
+       struct btrfs_root *root = btrfs_extent_root(fs_info, logic_start);
        struct btrfs_root *csum_root = fs_info->csum_root;
        struct btrfs_extent_item *extent;
        struct btrfs_io_context *bioc = NULL;
@@ -3168,7 +3168,7 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
 {
        struct btrfs_path *path, *ppath;
        struct btrfs_fs_info *fs_info = sctx->fs_info;
-       struct btrfs_root *root = fs_info->extent_root;
+       struct btrfs_root *root;
        struct btrfs_root *csum_root = fs_info->csum_root;
        struct btrfs_extent_item *extent;
        struct blk_plug plug;
@@ -3262,6 +3262,8 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
                   atomic_read(&sctx->bios_in_flight) == 0);
        scrub_blocked_if_needed(fs_info);
 
+       root = btrfs_extent_root(fs_info, logical);
+
        /* FIXME it might be better to start readahead at commit root */
        key.objectid = logical;
        key.type = BTRFS_EXTENT_ITEM_KEY;
index 87ae4aed3b06849eda1c6d3a23a10a5c7df0ea56..13428dec04d3e421cebe56536589dc0fbad83fb9 100644 (file)
@@ -1036,7 +1036,7 @@ int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize)
                goto out;
        }
 
-       root->fs_info->extent_root = root;
+       root->fs_info->_extent_root = root;
 
        ret = test_extents(cache);
        if (ret)
index 19ba7d5b7d8ff471906d1157572848b563a15b06..88e19781e83f01e3b8e544e9dd9da6539fe73d0b 100644 (file)
@@ -455,7 +455,7 @@ int btrfs_test_qgroups(u32 sectorsize, u32 nodesize)
        }
 
        /* We are using this root as our extent root */
-       root->fs_info->extent_root = root;
+       root->fs_info->_extent_root = root;
 
        /*
         * Some of the paths we test assume we have a filled out fs_info, so we
index c9f85c412b23e56e45708a2a127d1cb1bd6d3f28..cc83ae624b4ba3c0c415b0f9ca6b8fbb6abec8d3 100644 (file)
@@ -419,7 +419,7 @@ static int record_root_in_trans(struct btrfs_trans_handle *trans,
 
        if ((test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
            root->last_trans < trans->transid) || force) {
-               WARN_ON(root == fs_info->extent_root);
+               WARN_ON(root == fs_info->_extent_root);
                WARN_ON(!force && root->commit_root != root->node);
 
                /*
index b06059a5db2a34c6e1c79be019f9281abe09f3af..5ef430f02fd243e090239c86c581a5147355bf04 100644 (file)
@@ -1154,7 +1154,7 @@ static int calculate_alloc_pointer(struct btrfs_block_group *cache,
                                   u64 *offset_ret)
 {
        struct btrfs_fs_info *fs_info = cache->fs_info;
-       struct btrfs_root *root = fs_info->extent_root;
+       struct btrfs_root *root;
        struct btrfs_path *path;
        struct btrfs_key key;
        struct btrfs_key found_key;
@@ -1169,6 +1169,7 @@ static int calculate_alloc_pointer(struct btrfs_block_group *cache,
        key.type = 0;
        key.offset = 0;
 
+       root = btrfs_extent_root(fs_info, key.objectid);
        ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
        /* We should not find the exact match */
        if (!ret)