btrfs: pass the owner_root and level to alloc_extent_buffer
authorJosef Bacik <josef@toxicpanda.com>
Thu, 5 Nov 2020 15:45:20 +0000 (10:45 -0500)
committerDavid Sterba <dsterba@suse.com>
Tue, 8 Dec 2020 14:54:07 +0000 (15:54 +0100)
Now that we've plumbed all of the callers to have the owner root and the
level, plumb it down into alloc_extent_buffer().

Reviewed-by: Filipe Manana <fdmanana@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/disk-io.c
fs/btrfs/disk-io.h
fs/btrfs/extent-tree.c
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h
fs/btrfs/reada.c
fs/btrfs/relocation.c
fs/btrfs/tree-log.c
fs/btrfs/volumes.c

index 763121380942b7abb5e29a7c86249c5881f2bfbc..6abe3c8f025d331ab136fe2762dae30cb37115de 100644 (file)
@@ -955,11 +955,12 @@ static const struct address_space_operations btree_aops = {
 
 struct extent_buffer *btrfs_find_create_tree_block(
                                                struct btrfs_fs_info *fs_info,
-                                               u64 bytenr)
+                                               u64 bytenr, u64 owner_root,
+                                               int level)
 {
        if (btrfs_is_testing(fs_info))
                return alloc_test_extent_buffer(fs_info, bytenr);
-       return alloc_extent_buffer(fs_info, bytenr);
+       return alloc_extent_buffer(fs_info, bytenr, owner_root, level);
 }
 
 /*
@@ -978,7 +979,7 @@ struct extent_buffer *read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr,
        struct extent_buffer *buf = NULL;
        int ret;
 
-       buf = btrfs_find_create_tree_block(fs_info, bytenr);
+       buf = btrfs_find_create_tree_block(fs_info, bytenr, owner_root, level);
        if (IS_ERR(buf))
                return buf;
 
index 41588babf2eddd18fdf104148398592689125f25..e75ea6092942311ece25ceb39a93a0a1c6d9f1f4 100644 (file)
@@ -47,7 +47,8 @@ struct extent_buffer *read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr,
                                      int level, struct btrfs_key *first_key);
 struct extent_buffer *btrfs_find_create_tree_block(
                                                struct btrfs_fs_info *fs_info,
-                                               u64 bytenr);
+                                               u64 bytenr, u64 owner_root,
+                                               int level);
 void btrfs_clean_tree_block(struct extent_buffer *buf);
 int __cold open_ctree(struct super_block *sb,
               struct btrfs_fs_devices *fs_devices,
index 90f1ec0802bda18d5e7cfe3e13412e56e6090349..0d1b12e5b16645f6f0dd3b64d71e413eed7d3eb6 100644 (file)
@@ -4617,7 +4617,7 @@ btrfs_init_new_buffer(struct btrfs_trans_handle *trans, struct btrfs_root *root,
        struct btrfs_fs_info *fs_info = root->fs_info;
        struct extent_buffer *buf;
 
-       buf = btrfs_find_create_tree_block(fs_info, bytenr);
+       buf = btrfs_find_create_tree_block(fs_info, bytenr, owner, level);
        if (IS_ERR(buf))
                return buf;
 
@@ -5018,7 +5018,8 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
 
        next = find_extent_buffer(fs_info, bytenr);
        if (!next) {
-               next = btrfs_find_create_tree_block(fs_info, bytenr);
+               next = btrfs_find_create_tree_block(fs_info, bytenr,
+                               root->root_key.objectid, level - 1);
                if (IS_ERR(next))
                        return PTR_ERR(next);
 
index 973254b1f21607cc638b9a19ee910b235d1a95ec..bd0d4d195d7673242ce633e91c6cd5f33a6fa57c 100644 (file)
@@ -5180,7 +5180,7 @@ free_eb:
 #endif
 
 struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
-                                         u64 start)
+                                         u64 start, u64 owner_root, int level)
 {
        unsigned long len = fs_info->nodesize;
        int num_pages;
@@ -6128,19 +6128,21 @@ int try_release_extent_buffer(struct page *page)
  * btrfs_readahead_tree_block - attempt to readahead a child block
  * @fs_info:   the fs_info
  * @bytenr:    bytenr to read
+ * @owner_root: objectid of the root that owns this eb
  * @gen:       generation for the uptodate check, can be 0
+ * @level:     level for the eb
  *
  * Attempt to readahead a tree block at @bytenr.  If @gen is 0 then we do a
  * normal uptodate check of the eb, without checking the generation.  If we have
  * to read the block we will not block on anything.
  */
 void btrfs_readahead_tree_block(struct btrfs_fs_info *fs_info,
-                               u64 bytenr, u64 gen)
+                               u64 bytenr, u64 owner_root, u64 gen, int level)
 {
        struct extent_buffer *eb;
        int ret;
 
-       eb = btrfs_find_create_tree_block(fs_info, bytenr);
+       eb = btrfs_find_create_tree_block(fs_info, bytenr, owner_root, level);
        if (IS_ERR(eb))
                return;
 
@@ -6168,5 +6170,7 @@ void btrfs_readahead_node_child(struct extent_buffer *node, int slot)
 {
        btrfs_readahead_tree_block(node->fs_info,
                                   btrfs_node_blockptr(node, slot),
-                                  btrfs_node_ptr_generation(node, slot));
+                                  btrfs_header_owner(node),
+                                  btrfs_node_ptr_generation(node, slot),
+                                  btrfs_header_level(node) - 1);
 }
index a211e90292f8f517a33d74666cc1b52f2d9fdcae..c76697fc31208be675fe720f5728ff785aea69d0 100644 (file)
@@ -182,7 +182,7 @@ int extent_fiemap(struct btrfs_inode *inode, struct fiemap_extent_info *fieinfo,
 void set_page_extent_mapped(struct page *page);
 
 struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
-                                         u64 start);
+                                         u64 start, u64 owner_root, int level);
 struct extent_buffer *__alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
                                                  u64 start, unsigned long len);
 struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
@@ -199,7 +199,7 @@ int read_extent_buffer_pages(struct extent_buffer *eb, int wait,
                             int mirror_num);
 void wait_on_extent_buffer_writeback(struct extent_buffer *eb);
 void btrfs_readahead_tree_block(struct btrfs_fs_info *fs_info,
-                               u64 bytenr, u64 gen);
+                               u64 bytenr, u64 owner_root, u64 gen, int level);
 void btrfs_readahead_node_child(struct extent_buffer *node, int slot);
 
 static inline int num_extent_pages(const struct extent_buffer *eb)
index b1bea0d59e136a8c72dfdbe643a4a8c3a28c6c93..20fd4aa48a8ce0df75ea9525e2f1ebbb35912a9a 100644 (file)
@@ -656,12 +656,13 @@ static int reada_pick_zone(struct btrfs_device *dev)
 }
 
 static int reada_tree_block_flagged(struct btrfs_fs_info *fs_info, u64 bytenr,
-                                   int mirror_num, struct extent_buffer **eb)
+                                   u64 owner_root, int level, int mirror_num,
+                                   struct extent_buffer **eb)
 {
        struct extent_buffer *buf = NULL;
        int ret;
 
-       buf = btrfs_find_create_tree_block(fs_info, bytenr);
+       buf = btrfs_find_create_tree_block(fs_info, bytenr, owner_root, level);
        if (IS_ERR(buf))
                return 0;
 
@@ -749,7 +750,8 @@ static int reada_start_machine_dev(struct btrfs_device *dev)
        logical = re->logical;
 
        atomic_inc(&dev->reada_in_flight);
-       ret = reada_tree_block_flagged(fs_info, logical, mirror_num, &eb);
+       ret = reada_tree_block_flagged(fs_info, logical, re->owner_root,
+                                      re->level, mirror_num, &eb);
        if (ret)
                __readahead_hook(fs_info, re, NULL, ret);
        else if (eb)
index 7ebada33502faab2c66af85bed7f3818eb008650..c5774a8e6ff7e9698f3ed8305e2afb534abd5daa 100644 (file)
@@ -2513,7 +2513,8 @@ int relocate_tree_blocks(struct btrfs_trans_handle *trans,
        /* Kick in readahead for tree blocks with missing keys */
        rbtree_postorder_for_each_entry_safe(block, next, blocks, rb_node) {
                if (!block->key_ready)
-                       btrfs_readahead_tree_block(fs_info, block->bytenr, 0);
+                       btrfs_readahead_tree_block(fs_info, block->bytenr, 0, 0,
+                                                  block->level);
        }
 
        /* Get first keys */
index eb86c632535afdcaa304c16d75784c0d40141cf8..b1f97be57bb3540d449465189fd851d4a613db5d 100644 (file)
@@ -2699,7 +2699,9 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
                btrfs_node_key_to_cpu(cur, &first_key, path->slots[*level]);
                blocksize = fs_info->nodesize;
 
-               next = btrfs_find_create_tree_block(fs_info, bytenr);
+               next = btrfs_find_create_tree_block(fs_info, bytenr,
+                                                   btrfs_header_owner(cur),
+                                                   *level - 1);
                if (IS_ERR(next))
                        return PTR_ERR(next);
 
index 814abc0b3ff3dd4b5d4651d919692b4fc3327299..cf9a48e27ab0eec38c96af5ccf75faff26c44930 100644 (file)
@@ -6903,7 +6903,8 @@ int btrfs_read_sys_array(struct btrfs_fs_info *fs_info)
         * fixed to BTRFS_SUPER_INFO_SIZE. If nodesize > sb size, this will
         * overallocate but we can keep it as-is, only the first page is used.
         */
-       sb = btrfs_find_create_tree_block(fs_info, BTRFS_SUPER_INFO_OFFSET);
+       sb = btrfs_find_create_tree_block(fs_info, BTRFS_SUPER_INFO_OFFSET,
+                                         root->root_key.objectid, 0);
        if (IS_ERR(sb))
                return PTR_ERR(sb);
        set_extent_buffer_uptodate(sb);