Lines Matching refs:rc
182 static void mark_block_processed(struct reloc_control *rc, in mark_block_processed() argument
188 in_range(node->bytenr, rc->block_group->start, in mark_block_processed()
189 rc->block_group->length)) { in mark_block_processed()
190 blocksize = rc->extent_root->fs_info->nodesize; in mark_block_processed()
191 btrfs_set_extent_bit(&rc->processed_blocks, node->bytenr, in mark_block_processed()
307 struct reloc_control *rc = fs_info->reloc_ctl; in find_reloc_root() local
312 ASSERT(rc); in find_reloc_root()
313 spin_lock(&rc->reloc_root_tree.lock); in find_reloc_root()
314 rb_node = rb_simple_search(&rc->reloc_root_tree.rb_root, bytenr); in find_reloc_root()
319 spin_unlock(&rc->reloc_root_tree.lock); in find_reloc_root()
336 static bool handle_useless_nodes(struct reloc_control *rc, in handle_useless_nodes() argument
339 struct btrfs_backref_cache *cache = &rc->backref_cache; in handle_useless_nodes()
373 mark_block_processed(rc, cur); in handle_useless_nodes()
406 struct reloc_control *rc, struct btrfs_key *node_key, in build_backref_tree() argument
410 struct btrfs_backref_cache *cache = &rc->backref_cache; in build_backref_tree()
418 iter = btrfs_backref_iter_alloc(rc->extent_root->fs_info); in build_backref_tree()
459 if (handle_useless_nodes(rc, node)) in build_backref_tree()
483 struct reloc_control *rc = fs_info->reloc_ctl; in __add_reloc_root() local
492 spin_lock(&rc->reloc_root_tree.lock); in __add_reloc_root()
493 rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root, &node->simple_node); in __add_reloc_root()
494 spin_unlock(&rc->reloc_root_tree.lock); in __add_reloc_root()
502 list_add_tail(&root->root_list, &rc->reloc_roots); in __add_reloc_root()
515 struct reloc_control *rc = fs_info->reloc_ctl; in __del_reloc_root() local
518 if (rc && root->node) { in __del_reloc_root()
519 spin_lock(&rc->reloc_root_tree.lock); in __del_reloc_root()
520 rb_node = rb_simple_search(&rc->reloc_root_tree.rb_root, in __del_reloc_root()
524 rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); in __del_reloc_root()
527 spin_unlock(&rc->reloc_root_tree.lock); in __del_reloc_root()
559 struct reloc_control *rc = fs_info->reloc_ctl; in __update_reloc_root() local
561 spin_lock(&rc->reloc_root_tree.lock); in __update_reloc_root()
562 rb_node = rb_simple_search(&rc->reloc_root_tree.rb_root, in __update_reloc_root()
566 rb_erase(&node->rb_node, &rc->reloc_root_tree.rb_root); in __update_reloc_root()
568 spin_unlock(&rc->reloc_root_tree.lock); in __update_reloc_root()
574 spin_lock(&rc->reloc_root_tree.lock); in __update_reloc_root()
576 rb_node = rb_simple_insert(&rc->reloc_root_tree.rb_root, &node->simple_node); in __update_reloc_root()
577 spin_unlock(&rc->reloc_root_tree.lock); in __update_reloc_root()
710 struct reloc_control *rc = fs_info->reloc_ctl; in btrfs_init_reloc_root() local
715 if (!rc) in btrfs_init_reloc_root()
743 if (!rc->create_reloc_tree || btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID) in btrfs_init_reloc_root()
748 trans->block_rsv = rc->block_rsv; in btrfs_init_reloc_root()
870 struct reloc_control *rc, in replace_file_extents() argument
888 if (rc->stage != UPDATE_DATA_PTRS) in replace_file_extents()
913 if (!in_range(bytenr, rc->block_group->start, in replace_file_extents()
914 rc->block_group->length)) in replace_file_extents()
955 ret = get_new_location(rc->data_inode, &new_bytenr, in replace_file_extents()
1022 int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc, in replace_path() argument
1178 rc->block_group, parent, slot, in replace_path()
1438 struct reloc_control *rc, in insert_dirty_subvol() argument
1460 list_add_tail(&root->reloc_dirty_list, &rc->dirty_subvol_roots); in insert_dirty_subvol()
1466 static int clean_dirty_subvols(struct reloc_control *rc) in clean_dirty_subvols() argument
1473 list_for_each_entry_safe(root, next, &rc->dirty_subvol_roots, in clean_dirty_subvols()
1518 static noinline_for_stack int merge_reloc_root(struct reloc_control *rc, in merge_reloc_root() argument
1521 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in merge_reloc_root()
1582 ret = btrfs_block_rsv_refill(fs_info, rc->block_rsv, in merge_reloc_root()
1605 trans->block_rsv = rc->block_rsv; in merge_reloc_root()
1620 ret = replace_path(trans, rc, root, reloc_root, path, in merge_reloc_root()
1650 if (replaced && rc->stage == UPDATE_DATA_PTRS) in merge_reloc_root()
1667 ret = insert_dirty_subvol(trans, rc, root); in merge_reloc_root()
1677 if (replaced && rc->stage == UPDATE_DATA_PTRS) in merge_reloc_root()
1684 int prepare_to_merge(struct reloc_control *rc, int err) in prepare_to_merge() argument
1686 struct btrfs_root *root = rc->extent_root; in prepare_to_merge()
1695 rc->merging_rsv_size += fs_info->nodesize * (BTRFS_MAX_LEVEL - 1) * 2; in prepare_to_merge()
1696 rc->merging_rsv_size += rc->nodes_relocated * 2; in prepare_to_merge()
1701 num_bytes = rc->merging_rsv_size; in prepare_to_merge()
1702 ret = btrfs_block_rsv_add(fs_info, rc->block_rsv, num_bytes, in prepare_to_merge()
1708 trans = btrfs_join_transaction(rc->extent_root); in prepare_to_merge()
1711 btrfs_block_rsv_release(fs_info, rc->block_rsv, in prepare_to_merge()
1717 if (num_bytes != rc->merging_rsv_size) { in prepare_to_merge()
1719 btrfs_block_rsv_release(fs_info, rc->block_rsv, in prepare_to_merge()
1725 rc->merge_reloc_tree = true; in prepare_to_merge()
1727 while (!list_empty(&rc->reloc_roots)) { in prepare_to_merge()
1728 reloc_root = list_first_entry(&rc->reloc_roots, in prepare_to_merge()
1802 list_splice(&reloc_roots, &rc->reloc_roots); in prepare_to_merge()
1821 void merge_reloc_roots(struct reloc_control *rc) in merge_reloc_roots() argument
1823 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in merge_reloc_roots()
1830 root = rc->extent_root; in merge_reloc_roots()
1839 list_splice_init(&rc->reloc_roots, &reloc_roots); in merge_reloc_roots()
1869 ret = merge_reloc_root(rc, root); in merge_reloc_roots()
1891 &rc->dirty_subvol_roots); in merge_reloc_roots()
1906 list_splice_init(&rc->reloc_roots, &reloc_roots); in merge_reloc_roots()
1979 struct reloc_control *rc, in select_reloc_root() argument
2052 mark_block_processed(rc, next); in select_reloc_root()
2057 rc->backref_cache.path[next->level] = next; in select_reloc_root()
2116 static noinline_for_stack u64 calcu_metadata_size(struct reloc_control *rc, in calcu_metadata_size() argument
2119 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in calcu_metadata_size()
2150 struct reloc_control *rc, u64 num_bytes) in refill_metadata_space() argument
2155 trans->block_rsv = rc->block_rsv; in refill_metadata_space()
2156 rc->reserved_bytes += num_bytes; in refill_metadata_space()
2163 ret = btrfs_block_rsv_refill(fs_info, rc->block_rsv, num_bytes, in refill_metadata_space()
2168 while (tmp <= rc->reserved_bytes) in refill_metadata_space()
2177 rc->block_rsv->size = tmp + fs_info->nodesize * in refill_metadata_space()
2186 struct reloc_control *rc, in reserve_metadata_space() argument
2191 num_bytes = calcu_metadata_size(rc, node) * 2; in reserve_metadata_space()
2192 return refill_metadata_space(trans, rc, num_bytes); in reserve_metadata_space()
2203 struct reloc_control *rc, in do_relocation() argument
2225 rc->backref_cache.path[node->level] = node; in do_relocation()
2230 root = select_reloc_root(trans, rc, upper, edges); in do_relocation()
2364 struct reloc_control *rc, in link_to_upper() argument
2371 return do_relocation(trans, rc, node, &key, path, 0); in link_to_upper()
2375 struct reloc_control *rc, in finish_pending_nodes() argument
2379 struct btrfs_backref_cache *cache = &rc->backref_cache; in finish_pending_nodes()
2392 ret = link_to_upper(trans, rc, node, path); in finish_pending_nodes()
2406 static void update_processed_blocks(struct reloc_control *rc, in update_processed_blocks() argument
2420 mark_block_processed(rc, next); in update_processed_blocks()
2434 static int tree_block_processed(u64 bytenr, struct reloc_control *rc) in tree_block_processed() argument
2436 u32 blocksize = rc->extent_root->fs_info->nodesize; in tree_block_processed()
2438 if (btrfs_test_range_bit(&rc->processed_blocks, bytenr, in tree_block_processed()
2474 struct reloc_control *rc, in relocate_tree_block() argument
2489 ret = reserve_metadata_space(trans, rc, node); in relocate_tree_block()
2502 update_processed_blocks(rc, node); in relocate_tree_block()
2553 update_processed_blocks(rc, node); in relocate_tree_block()
2555 ret = do_relocation(trans, rc, node, key, path, 1); in relocate_tree_block()
2559 btrfs_backref_cleanup_node(&rc->backref_cache, node); in relocate_tree_block()
2564 struct reloc_control *rc, struct tree_block *block, in relocate_cowonly_block() argument
2580 ret = refill_metadata_space(trans, rc, num_bytes); in relocate_cowonly_block()
2607 struct reloc_control *rc, struct rb_root *blocks) in relocate_tree_blocks() argument
2609 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in relocate_tree_blocks()
2649 ret = relocate_cowonly_block(trans, rc, block, path); in relocate_tree_blocks()
2655 node = build_backref_tree(trans, rc, &block->key, in relocate_tree_blocks()
2662 ret = relocate_tree_block(trans, rc, node, &block->key, in relocate_tree_blocks()
2668 ret = finish_pending_nodes(trans, rc, path, ret); in relocate_tree_blocks()
2677 static noinline_for_stack int prealloc_file_extent_cluster(struct reloc_control *rc) in prealloc_file_extent_cluster() argument
2679 const struct file_extent_cluster *cluster = &rc->cluster; in prealloc_file_extent_cluster()
2680 struct btrfs_inode *inode = BTRFS_I(rc->data_inode); in prealloc_file_extent_cluster()
2741 static noinline_for_stack int setup_relocation_extent_mapping(struct reloc_control *rc) in setup_relocation_extent_mapping() argument
2743 struct btrfs_inode *inode = BTRFS_I(rc->data_inode); in setup_relocation_extent_mapping()
2747 u64 start = rc->cluster.start - offset; in setup_relocation_extent_mapping()
2748 u64 end = rc->cluster.end - offset; in setup_relocation_extent_mapping()
2757 em->disk_bytenr = rc->cluster.start; in setup_relocation_extent_mapping()
2792 static int relocate_one_folio(struct reloc_control *rc, in relocate_one_folio() argument
2796 const struct file_extent_cluster *cluster = &rc->cluster; in relocate_one_folio()
2797 struct inode *inode = rc->data_inode; in relocate_one_folio()
2809 const bool use_rst = btrfs_need_stripe_tree_update(fs_info, rc->block_group->flags); in relocate_one_folio()
2951 static int relocate_file_extent_cluster(struct reloc_control *rc) in relocate_file_extent_cluster() argument
2953 struct inode *inode = rc->data_inode; in relocate_file_extent_cluster()
2954 const struct file_extent_cluster *cluster = &rc->cluster; in relocate_file_extent_cluster()
2968 ret = prealloc_file_extent_cluster(rc); in relocate_file_extent_cluster()
2974 ret = setup_relocation_extent_mapping(rc); in relocate_file_extent_cluster()
2979 ret = relocate_one_folio(rc, ra, &cluster_nr, &cur_file_offset); in relocate_file_extent_cluster()
2990 static noinline_for_stack int relocate_data_extent(struct reloc_control *rc, in relocate_data_extent() argument
2993 struct inode *inode = rc->data_inode; in relocate_data_extent()
2994 struct file_extent_cluster *cluster = &rc->cluster; in relocate_data_extent()
2999 ret = relocate_file_extent_cluster(rc); in relocate_data_extent()
3025 ret = relocate_file_extent_cluster(rc); in relocate_data_extent()
3044 ret = relocate_file_extent_cluster(rc); in relocate_data_extent()
3056 static int add_tree_block(struct reloc_control *rc, in add_tree_block() argument
3123 btrfs_err(rc->block_group->fs_info, in add_tree_block()
3139 block->key.objectid = rc->extent_root->fs_info->nodesize; in add_tree_block()
3147 btrfs_backref_panic(rc->extent_root->fs_info, block->bytenr, in add_tree_block()
3156 static int __add_tree_block(struct reloc_control *rc, in __add_tree_block() argument
3160 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in __add_tree_block()
3166 if (tree_block_processed(bytenr, rc)) in __add_tree_block()
3187 ret = btrfs_search_slot(NULL, rc->extent_root, &key, path, 0, 0); in __add_tree_block()
3220 ret = add_tree_block(rc, &key, path, blocks); in __add_tree_block()
3309 static noinline_for_stack int add_data_references(struct reloc_control *rc, in add_data_references() argument
3317 const u32 blocksize = rc->extent_root->fs_info->nodesize; in add_data_references()
3324 ctx.fs_info = rc->extent_root->fs_info; in add_data_references()
3340 ret = delete_v1_space_cache(eb, rc->block_group, in add_data_references()
3345 ret = __add_tree_block(rc, ref_node->val, blocksize, blocks); in add_data_references()
3359 int find_next_extent(struct reloc_control *rc, struct btrfs_path *path, in find_next_extent() argument
3362 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in find_next_extent()
3368 last = rc->block_group->start + rc->block_group->length; in find_next_extent()
3373 if (rc->search_start >= last) { in find_next_extent()
3378 key.objectid = rc->search_start; in find_next_extent()
3384 ret = btrfs_search_slot(NULL, rc->extent_root, &key, path, in find_next_extent()
3391 ret = btrfs_next_leaf(rc->extent_root, path); in find_next_extent()
3410 key.objectid + key.offset <= rc->search_start) { in find_next_extent()
3417 rc->search_start) { in find_next_extent()
3422 block_found = btrfs_find_first_extent_bit(&rc->processed_blocks, in find_next_extent()
3428 rc->search_start = end + 1; in find_next_extent()
3431 rc->search_start = key.objectid + key.offset; in find_next_extent()
3433 rc->search_start = key.objectid + in find_next_extent()
3443 static void set_reloc_control(struct reloc_control *rc) in set_reloc_control() argument
3445 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in set_reloc_control()
3448 fs_info->reloc_ctl = rc; in set_reloc_control()
3452 static void unset_reloc_control(struct reloc_control *rc) in unset_reloc_control() argument
3454 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in unset_reloc_control()
3462 int prepare_to_relocate(struct reloc_control *rc) in prepare_to_relocate() argument
3467 rc->block_rsv = btrfs_alloc_block_rsv(rc->extent_root->fs_info, in prepare_to_relocate()
3469 if (!rc->block_rsv) in prepare_to_relocate()
3472 memset(&rc->cluster, 0, sizeof(rc->cluster)); in prepare_to_relocate()
3473 rc->search_start = rc->block_group->start; in prepare_to_relocate()
3474 rc->extents_found = 0; in prepare_to_relocate()
3475 rc->nodes_relocated = 0; in prepare_to_relocate()
3476 rc->merging_rsv_size = 0; in prepare_to_relocate()
3477 rc->reserved_bytes = 0; in prepare_to_relocate()
3478 rc->block_rsv->size = rc->extent_root->fs_info->nodesize * in prepare_to_relocate()
3480 ret = btrfs_block_rsv_refill(rc->extent_root->fs_info, in prepare_to_relocate()
3481 rc->block_rsv, rc->block_rsv->size, in prepare_to_relocate()
3486 rc->create_reloc_tree = true; in prepare_to_relocate()
3487 set_reloc_control(rc); in prepare_to_relocate()
3489 trans = btrfs_join_transaction(rc->extent_root); in prepare_to_relocate()
3491 unset_reloc_control(rc); in prepare_to_relocate()
3502 unset_reloc_control(rc); in prepare_to_relocate()
3507 static noinline_for_stack int relocate_block_group(struct reloc_control *rc) in relocate_block_group() argument
3509 struct btrfs_fs_info *fs_info = rc->extent_root->fs_info; in relocate_block_group()
3525 ret = prepare_to_relocate(rc); in relocate_block_group()
3532 rc->reserved_bytes = 0; in relocate_block_group()
3533 ret = btrfs_block_rsv_refill(fs_info, rc->block_rsv, in relocate_block_group()
3534 rc->block_rsv->size, in relocate_block_group()
3541 trans = btrfs_start_transaction(rc->extent_root, 0); in relocate_block_group()
3548 if (rc->backref_cache.last_trans != trans->transid) in relocate_block_group()
3549 btrfs_backref_release_cache(&rc->backref_cache); in relocate_block_group()
3550 rc->backref_cache.last_trans = trans->transid; in relocate_block_group()
3552 ret = find_next_extent(rc, path, &key); in relocate_block_group()
3558 rc->extents_found++; in relocate_block_group()
3571 struct btrfs_root *root = BTRFS_I(rc->data_inode)->root; in relocate_block_group()
3580 ret = add_tree_block(rc, &key, path, &blocks); in relocate_block_group()
3581 } else if (rc->stage == UPDATE_DATA_PTRS && in relocate_block_group()
3583 ret = add_data_references(rc, &key, path, &blocks); in relocate_block_group()
3594 ret = relocate_tree_blocks(trans, rc, &blocks); in relocate_block_group()
3600 rc->extents_found--; in relocate_block_group()
3601 rc->search_start = key.objectid; in relocate_block_group()
3609 if (rc->stage == MOVE_DATA_EXTENTS && in relocate_block_group()
3611 rc->found_file_extent = true; in relocate_block_group()
3612 ret = relocate_data_extent(rc, &key); in relocate_block_group()
3624 ret = btrfs_force_chunk_alloc(trans, rc->block_group->flags); in relocate_block_group()
3633 btrfs_clear_extent_bit(&rc->processed_blocks, 0, (u64)-1, EXTENT_DIRTY, NULL); in relocate_block_group()
3641 ret = relocate_file_extent_cluster(rc); in relocate_block_group()
3646 rc->create_reloc_tree = false; in relocate_block_group()
3647 set_reloc_control(rc); in relocate_block_group()
3649 btrfs_backref_release_cache(&rc->backref_cache); in relocate_block_group()
3650 btrfs_block_rsv_release(fs_info, rc->block_rsv, (u64)-1, NULL); in relocate_block_group()
3660 err = prepare_to_merge(rc, err); in relocate_block_group()
3662 merge_reloc_roots(rc); in relocate_block_group()
3664 rc->merge_reloc_tree = false; in relocate_block_group()
3665 unset_reloc_control(rc); in relocate_block_group()
3666 btrfs_block_rsv_release(fs_info, rc->block_rsv, (u64)-1, NULL); in relocate_block_group()
3669 trans = btrfs_join_transaction(rc->extent_root); in relocate_block_group()
3678 ret = clean_dirty_subvols(rc); in relocate_block_group()
3681 btrfs_free_block_rsv(fs_info, rc->block_rsv); in relocate_block_group()
3838 struct reloc_control *rc; in alloc_reloc_control() local
3840 rc = kzalloc(sizeof(*rc), GFP_NOFS); in alloc_reloc_control()
3841 if (!rc) in alloc_reloc_control()
3844 INIT_LIST_HEAD(&rc->reloc_roots); in alloc_reloc_control()
3845 INIT_LIST_HEAD(&rc->dirty_subvol_roots); in alloc_reloc_control()
3846 btrfs_backref_init_cache(fs_info, &rc->backref_cache, true); in alloc_reloc_control()
3847 rc->reloc_root_tree.rb_root = RB_ROOT; in alloc_reloc_control()
3848 spin_lock_init(&rc->reloc_root_tree.lock); in alloc_reloc_control()
3849 btrfs_extent_io_tree_init(fs_info, &rc->processed_blocks, IO_TREE_RELOC_BLOCKS); in alloc_reloc_control()
3850 return rc; in alloc_reloc_control()
3853 static void free_reloc_control(struct reloc_control *rc) in free_reloc_control() argument
3857 free_reloc_roots(&rc->reloc_roots); in free_reloc_control()
3859 &rc->reloc_root_tree.rb_root, rb_node) in free_reloc_control()
3862 kfree(rc); in free_reloc_control()
3895 struct reloc_control *rc; in btrfs_relocate_block_group() local
3935 rc = alloc_reloc_control(fs_info); in btrfs_relocate_block_group()
3936 if (!rc) { in btrfs_relocate_block_group()
3947 rc->extent_root = extent_root; in btrfs_relocate_block_group()
3948 rc->block_group = bg; in btrfs_relocate_block_group()
3950 ret = btrfs_inc_block_group_ro(rc->block_group, true); in btrfs_relocate_block_group()
3963 inode = lookup_free_space_inode(rc->block_group, path); in btrfs_relocate_block_group()
3967 ret = delete_block_group_cache(rc->block_group, inode, 0); in btrfs_relocate_block_group()
3976 rc->data_inode = create_reloc_inode(rc->block_group); in btrfs_relocate_block_group()
3977 if (IS_ERR(rc->data_inode)) { in btrfs_relocate_block_group()
3978 err = PTR_ERR(rc->data_inode); in btrfs_relocate_block_group()
3979 rc->data_inode = NULL; in btrfs_relocate_block_group()
3984 describe_relocation(rc->block_group); in btrfs_relocate_block_group()
3986 btrfs_wait_block_group_reservations(rc->block_group); in btrfs_relocate_block_group()
3987 btrfs_wait_nocow_writers(rc->block_group); in btrfs_relocate_block_group()
3988 btrfs_wait_ordered_roots(fs_info, U64_MAX, rc->block_group); in btrfs_relocate_block_group()
3990 ret = btrfs_zone_finish(rc->block_group); in btrfs_relocate_block_group()
3997 ret = relocate_block_group(rc); in btrfs_relocate_block_group()
4002 finishes_stage = rc->stage; in btrfs_relocate_block_group()
4012 if (rc->stage == MOVE_DATA_EXTENTS && rc->found_file_extent) { in btrfs_relocate_block_group()
4013 ret = btrfs_wait_ordered_range(BTRFS_I(rc->data_inode), 0, in btrfs_relocate_block_group()
4017 invalidate_mapping_pages(rc->data_inode->i_mapping, in btrfs_relocate_block_group()
4019 rc->stage = UPDATE_DATA_PTRS; in btrfs_relocate_block_group()
4025 if (rc->extents_found == 0) in btrfs_relocate_block_group()
4030 rc->extents_found, in btrfs_relocate_block_group()
4034 WARN_ON(rc->block_group->pinned > 0); in btrfs_relocate_block_group()
4035 WARN_ON(rc->block_group->reserved > 0); in btrfs_relocate_block_group()
4036 WARN_ON(rc->block_group->used > 0); in btrfs_relocate_block_group()
4039 btrfs_dec_block_group_ro(rc->block_group); in btrfs_relocate_block_group()
4040 iput(rc->data_inode); in btrfs_relocate_block_group()
4044 free_reloc_control(rc); in btrfs_relocate_block_group()
4085 struct reloc_control *rc = NULL; in btrfs_recover_relocation() local
4153 rc = alloc_reloc_control(fs_info); in btrfs_recover_relocation()
4154 if (!rc) { in btrfs_recover_relocation()
4163 rc->extent_root = btrfs_extent_root(fs_info, 0); in btrfs_recover_relocation()
4165 set_reloc_control(rc); in btrfs_recover_relocation()
4167 trans = btrfs_join_transaction(rc->extent_root); in btrfs_recover_relocation()
4173 rc->merge_reloc_tree = true; in btrfs_recover_relocation()
4181 &rc->reloc_roots); in btrfs_recover_relocation()
4210 merge_reloc_roots(rc); in btrfs_recover_relocation()
4212 unset_reloc_control(rc); in btrfs_recover_relocation()
4214 trans = btrfs_join_transaction(rc->extent_root); in btrfs_recover_relocation()
4221 ret2 = clean_dirty_subvols(rc); in btrfs_recover_relocation()
4225 unset_reloc_control(rc); in btrfs_recover_relocation()
4228 free_reloc_control(rc); in btrfs_recover_relocation()
4298 struct reloc_control *rc; in btrfs_reloc_cow_block() local
4304 rc = fs_info->reloc_ctl; in btrfs_reloc_cow_block()
4305 if (!rc) in btrfs_reloc_cow_block()
4308 BUG_ON(rc->stage == UPDATE_DATA_PTRS && btrfs_is_data_reloc_root(root)); in btrfs_reloc_cow_block()
4315 if (btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID && rc->create_reloc_tree) { in btrfs_reloc_cow_block()
4318 node = rc->backref_cache.path[level]; in btrfs_reloc_cow_block()
4339 &rc->backref_cache.pending[level]); in btrfs_reloc_cow_block()
4344 mark_block_processed(rc, node); in btrfs_reloc_cow_block()
4347 rc->nodes_relocated += buf->len; in btrfs_reloc_cow_block()
4350 if (level == 0 && first_cow && rc->stage == UPDATE_DATA_PTRS) in btrfs_reloc_cow_block()
4351 ret = replace_file_extents(trans, rc, root, cow); in btrfs_reloc_cow_block()
4363 struct reloc_control *rc = root->fs_info->reloc_ctl; in btrfs_reloc_pre_snapshot() local
4365 if (!rc || !have_reloc_root(root)) in btrfs_reloc_pre_snapshot()
4368 if (!rc->merge_reloc_tree) in btrfs_reloc_pre_snapshot()
4383 *bytes_to_reserve += rc->nodes_relocated; in btrfs_reloc_pre_snapshot()
4400 struct reloc_control *rc = root->fs_info->reloc_ctl; in btrfs_reloc_post_snapshot() local
4403 if (!rc || !have_reloc_root(root)) in btrfs_reloc_post_snapshot()
4406 rc = root->fs_info->reloc_ctl; in btrfs_reloc_post_snapshot()
4407 rc->merging_rsv_size += rc->nodes_relocated; in btrfs_reloc_post_snapshot()
4409 if (rc->merge_reloc_tree) { in btrfs_reloc_post_snapshot()
4411 rc->block_rsv, in btrfs_reloc_post_snapshot()
4412 rc->nodes_relocated, true); in btrfs_reloc_post_snapshot()