btrfs: introduce a bitmap based csum range search function
[sfrench/cifs-2.6.git] / fs / btrfs / relocation.c
index 977afbb4cd45a6c6eca73915af201b9853f84713..aa80e51bc8ca4d6f16aaa2cf48aa0b16bf11bbec 100644 (file)
 #include "inode-item.h"
 #include "space-info.h"
 #include "fs.h"
+#include "accessors.h"
+#include "extent-tree.h"
+#include "root-tree.h"
+#include "file-item.h"
+#include "relocation.h"
+#include "super.h"
 
 /*
  * Relocation overview
@@ -472,7 +478,7 @@ static noinline_for_stack struct btrfs_backref_node *build_backref_tree(
        int ret;
        int err = 0;
 
-       iter = btrfs_backref_iter_alloc(rc->extent_root->fs_info, GFP_NOFS);
+       iter = btrfs_backref_iter_alloc(rc->extent_root->fs_info);
        if (!iter)
                return ERR_PTR(-ENOMEM);
        path = btrfs_alloc_path();
@@ -1111,7 +1117,7 @@ int replace_file_extents(struct btrfs_trans_handle *trans,
                                inode = find_next_inode(root, key.objectid);
                                first = 0;
                        } else if (inode && btrfs_ino(BTRFS_I(inode)) < key.objectid) {
-                               btrfs_add_delayed_iput(inode);
+                               btrfs_add_delayed_iput(BTRFS_I(inode));
                                inode = find_next_inode(root, key.objectid);
                        }
                        if (inode && btrfs_ino(BTRFS_I(inode)) == key.objectid) {
@@ -1175,7 +1181,7 @@ int replace_file_extents(struct btrfs_trans_handle *trans,
        if (dirty)
                btrfs_mark_buffer_dirty(leaf);
        if (inode)
-               btrfs_add_delayed_iput(inode);
+               btrfs_add_delayed_iput(BTRFS_I(inode));
        return ret;
 }
 
@@ -2604,10 +2610,14 @@ static int tree_block_processed(u64 bytenr, struct reloc_control *rc)
 static int get_tree_block_key(struct btrfs_fs_info *fs_info,
                              struct tree_block *block)
 {
+       struct btrfs_tree_parent_check check = {
+               .level = block->level,
+               .owner_root = block->owner,
+               .transid = block->key.offset
+       };
        struct extent_buffer *eb;
 
-       eb = read_tree_block(fs_info, block->bytenr, block->owner,
-                            block->key.offset, block->level, NULL);
+       eb = read_tree_block(fs_info, block->bytenr, &check);
        if (IS_ERR(eb))
                return PTR_ERR(eb);
        if (!extent_buffer_uptodate(eb)) {
@@ -2868,7 +2878,7 @@ static noinline_for_stack int prealloc_file_extent_cluster(
        if (ret)
                return ret;
 
-       btrfs_inode_lock(&inode->vfs_inode, 0);
+       btrfs_inode_lock(inode, 0);
        for (nr = 0; nr < cluster->nr; nr++) {
                struct extent_state *cached_state = NULL;
 
@@ -2888,7 +2898,7 @@ static noinline_for_stack int prealloc_file_extent_cluster(
                if (ret)
                        break;
        }
-       btrfs_inode_unlock(&inode->vfs_inode, 0);
+       btrfs_inode_unlock(inode, 0);
 
        if (cur_offset < prealloc_end)
                btrfs_free_reserved_data_space_noquota(inode->root->fs_info,
@@ -3402,24 +3412,28 @@ int add_data_references(struct reloc_control *rc,
                        struct btrfs_path *path,
                        struct rb_root *blocks)
 {
-       struct btrfs_fs_info *fs_info = rc->extent_root->fs_info;
-       struct ulist *leaves = NULL;
+       struct btrfs_backref_walk_ctx ctx = { 0 };
        struct ulist_iterator leaf_uiter;
        struct ulist_node *ref_node = NULL;
-       const u32 blocksize = fs_info->nodesize;
+       const u32 blocksize = rc->extent_root->fs_info->nodesize;
        int ret = 0;
 
        btrfs_release_path(path);
-       ret = btrfs_find_all_leafs(NULL, fs_info, extent_key->objectid,
-                                  0, &leaves, NULL, true);
+
+       ctx.bytenr = extent_key->objectid;
+       ctx.ignore_extent_item_pos = true;
+       ctx.fs_info = rc->extent_root->fs_info;
+
+       ret = btrfs_find_all_leafs(&ctx);
        if (ret < 0)
                return ret;
 
        ULIST_ITER_INIT(&leaf_uiter);
-       while ((ref_node = ulist_next(leaves, &leaf_uiter))) {
+       while ((ref_node = ulist_next(ctx.refs, &leaf_uiter))) {
+               struct btrfs_tree_parent_check check = { 0 };
                struct extent_buffer *eb;
 
-               eb = read_tree_block(fs_info, ref_node->val, 0, 0, 0, NULL);
+               eb = read_tree_block(ctx.fs_info, ref_node->val, &check);
                if (IS_ERR(eb)) {
                        ret = PTR_ERR(eb);
                        break;
@@ -3435,7 +3449,7 @@ int add_data_references(struct reloc_control *rc,
        }
        if (ret < 0)
                free_block_list(blocks);
-       ulist_free(leaves);
+       ulist_free(ctx.refs);
        return ret;
 }
 
@@ -3919,8 +3933,7 @@ static struct reloc_control *alloc_reloc_control(struct btrfs_fs_info *fs_info)
        INIT_LIST_HEAD(&rc->dirty_subvol_roots);
        btrfs_backref_init_cache(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);
+       extent_io_tree_init(fs_info, &rc->processed_blocks, IO_TREE_RELOC_BLOCKS);
        return rc;
 }
 
@@ -4344,8 +4357,8 @@ int btrfs_reloc_clone_csums(struct btrfs_inode *inode, u64 file_pos, u64 len)
 
        disk_bytenr = file_pos + inode->index_cnt;
        csum_root = btrfs_csum_root(fs_info, disk_bytenr);
-       ret = btrfs_lookup_csums_range(csum_root, disk_bytenr,
-                                      disk_bytenr + len - 1, &list, 0, false);
+       ret = btrfs_lookup_csums_list(csum_root, disk_bytenr,
+                                     disk_bytenr + len - 1, &list, 0, false);
        if (ret)
                goto out;