Lines Matching refs:root

246 static bool reloc_root_is_dead(const struct btrfs_root *root)  in reloc_root_is_dead()  argument
254 if (test_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state)) in reloc_root_is_dead()
267 static bool have_reloc_root(const struct btrfs_root *root) in have_reloc_root() argument
269 if (reloc_root_is_dead(root)) in have_reloc_root()
271 if (!root->reloc_root) in have_reloc_root()
276 bool btrfs_should_ignore_reloc_root(const struct btrfs_root *root) in btrfs_should_ignore_reloc_root() argument
280 if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) in btrfs_should_ignore_reloc_root()
284 if (reloc_root_is_dead(root)) in btrfs_should_ignore_reloc_root()
287 reloc_root = root->reloc_root; in btrfs_should_ignore_reloc_root()
292 root->fs_info->running_transaction->transid) in btrfs_should_ignore_reloc_root()
310 struct btrfs_root *root = NULL; in find_reloc_root() local
317 root = node->data; in find_reloc_root()
320 return btrfs_grab_root(root); in find_reloc_root()
478 static int __add_reloc_root(struct btrfs_root *root) in __add_reloc_root() argument
480 struct btrfs_fs_info *fs_info = root->fs_info; in __add_reloc_root()
489 node->bytenr = root->commit_root->start; in __add_reloc_root()
490 node->data = root; in __add_reloc_root()
502 list_add_tail(&root->root_list, &rc->reloc_roots); in __add_reloc_root()
510 static void __del_reloc_root(struct btrfs_root *root) in __del_reloc_root() argument
512 struct btrfs_fs_info *fs_info = root->fs_info; in __del_reloc_root()
518 if (rc && root->node) { in __del_reloc_root()
521 root->commit_root->start); in __del_reloc_root()
528 ASSERT(!node || (struct btrfs_root *)node->data == root); in __del_reloc_root()
540 if (!list_empty(&root->root_list)) { in __del_reloc_root()
542 list_del_init(&root->root_list); in __del_reloc_root()
546 btrfs_put_root(root); in __del_reloc_root()
554 static int __update_reloc_root(struct btrfs_root *root) in __update_reloc_root() argument
556 struct btrfs_fs_info *fs_info = root->fs_info; in __update_reloc_root()
563 root->commit_root->start); in __update_reloc_root()
572 BUG_ON((struct btrfs_root *)node->data != root); in __update_reloc_root()
575 node->bytenr = root->node->start; in __update_reloc_root()
584 struct btrfs_root *root, u64 objectid) in create_reloc_root() argument
586 struct btrfs_fs_info *fs_info = root->fs_info; in create_reloc_root()
602 if (btrfs_root_id(root) == objectid) { in create_reloc_root()
613 if (unlikely(btrfs_disk_key_objectid(&root->root_item.drop_progress))) { in create_reloc_root()
616 btrfs_disk_key_to_cpu(&cpu_key, &root->root_item.drop_progress); in create_reloc_root()
625 ret = btrfs_copy_root(trans, root, root->commit_root, &eb, in create_reloc_root()
638 commit_root_gen = btrfs_header_generation(root->commit_root); in create_reloc_root()
639 btrfs_set_root_last_snapshot(&root->root_item, commit_root_gen); in create_reloc_root()
648 ret = btrfs_copy_root(trans, root, root->node, &eb, in create_reloc_root()
660 memcpy(root_item, &root->root_item, sizeof(*root_item)); in create_reloc_root()
665 if (btrfs_root_id(root) == objectid) { in create_reloc_root()
706 struct btrfs_root *root) in btrfs_init_reloc_root() argument
708 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_init_reloc_root()
722 if (reloc_root_is_dead(root)) in btrfs_init_reloc_root()
733 if (root->reloc_root) { in btrfs_init_reloc_root()
734 reloc_root = root->reloc_root; in btrfs_init_reloc_root()
743 if (!rc->create_reloc_tree || btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID) in btrfs_init_reloc_root()
751 reloc_root = create_reloc_root(trans, root, btrfs_root_id(root)); in btrfs_init_reloc_root()
764 root->reloc_root = btrfs_grab_root(reloc_root); in btrfs_init_reloc_root()
772 struct btrfs_root *root) in btrfs_update_reloc_root() argument
774 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_update_reloc_root()
779 if (!have_reloc_root(root)) in btrfs_update_reloc_root()
782 reloc_root = root->reloc_root; in btrfs_update_reloc_root()
795 set_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state); in btrfs_update_reloc_root()
823 struct btrfs_root *root = BTRFS_I(reloc_inode)->root; in get_new_location() local
834 ret = btrfs_lookup_file_extent(NULL, root, path, in get_new_location()
871 struct btrfs_root *root, in replace_file_extents() argument
874 struct btrfs_fs_info *fs_info = root->fs_info; in replace_file_extents()
892 if (btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID) in replace_file_extents()
921 if (btrfs_root_id(root) != BTRFS_TREE_RELOC_OBJECTID) { in replace_file_extents()
923 inode = btrfs_find_first_inode(root, key.objectid); in replace_file_extents()
927 inode = btrfs_find_first_inode(root, key.objectid); in replace_file_extents()
972 ref.owning_root = btrfs_root_id(root); in replace_file_extents()
975 btrfs_root_id(root), false); in replace_file_extents()
986 ref.owning_root = btrfs_root_id(root); in replace_file_extents()
989 btrfs_root_id(root), false); in replace_file_extents()
1262 int walk_up_reloc_tree(struct btrfs_root *root, struct btrfs_path *path, in walk_up_reloc_tree() argument
1270 last_snapshot = btrfs_root_last_snapshot(&root->root_item); in walk_up_reloc_tree()
1299 int walk_down_reloc_tree(struct btrfs_root *root, struct btrfs_path *path, in walk_down_reloc_tree() argument
1308 last_snapshot = btrfs_root_last_snapshot(&root->root_item); in walk_down_reloc_tree()
1344 static int invalidate_extent_cache(struct btrfs_root *root, in invalidate_extent_cache() argument
1348 struct btrfs_fs_info *fs_info = root->fs_info; in invalidate_extent_cache()
1365 inode = btrfs_find_first_inode(root, objectid); in invalidate_extent_cache()
1439 struct btrfs_root *root) in insert_dirty_subvol() argument
1441 struct btrfs_root *reloc_root = root->reloc_root; in insert_dirty_subvol()
1446 ASSERT(btrfs_root_id(root) != BTRFS_TREE_RELOC_OBJECTID); in insert_dirty_subvol()
1454 ret = btrfs_update_reloc_root(trans, root); in insert_dirty_subvol()
1458 if (list_empty(&root->reloc_dirty_list)) { in insert_dirty_subvol()
1459 btrfs_grab_root(root); in insert_dirty_subvol()
1460 list_add_tail(&root->reloc_dirty_list, &rc->dirty_subvol_roots); in insert_dirty_subvol()
1468 struct btrfs_root *root; in clean_dirty_subvols() local
1473 list_for_each_entry_safe(root, next, &rc->dirty_subvol_roots, in clean_dirty_subvols()
1475 if (btrfs_root_id(root) != BTRFS_TREE_RELOC_OBJECTID) { in clean_dirty_subvols()
1477 struct btrfs_root *reloc_root = root->reloc_root; in clean_dirty_subvols()
1479 list_del_init(&root->reloc_dirty_list); in clean_dirty_subvols()
1480 root->reloc_root = NULL; in clean_dirty_subvols()
1486 clear_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state); in clean_dirty_subvols()
1500 btrfs_put_root(root); in clean_dirty_subvols()
1503 ret2 = btrfs_drop_snapshot(root, 0, 1); in clean_dirty_subvols()
1505 btrfs_put_root(root); in clean_dirty_subvols()
1519 struct btrfs_root *root) in merge_reloc_root() argument
1541 reloc_root = root->reloc_root; in merge_reloc_root()
1587 trans = btrfs_start_transaction(root, 0); in merge_reloc_root()
1620 ret = replace_path(trans, rc, root, reloc_root, path, in merge_reloc_root()
1651 invalidate_extent_cache(root, &key, &next_key); in merge_reloc_root()
1658 leaf = btrfs_lock_root_node(root); in merge_reloc_root()
1659 ret = btrfs_cow_block(trans, root, leaf, NULL, 0, &leaf, in merge_reloc_root()
1667 ret = insert_dirty_subvol(trans, rc, root); in merge_reloc_root()
1678 invalidate_extent_cache(root, &key, &next_key); in merge_reloc_root()
1686 struct btrfs_root *root = rc->extent_root; in prepare_to_merge() local
1687 struct btrfs_fs_info *fs_info = root->fs_info; in prepare_to_merge()
1732 root = btrfs_get_fs_root(fs_info, reloc_root->root_key.offset, in prepare_to_merge()
1734 if (IS_ERR(root)) { in prepare_to_merge()
1740 btrfs_abort_transaction(trans, (int)PTR_ERR(root)); in prepare_to_merge()
1742 err = PTR_ERR(root); in prepare_to_merge()
1746 if (unlikely(root->reloc_root != reloc_root)) { in prepare_to_merge()
1747 if (root->reloc_root) { in prepare_to_merge()
1750 btrfs_root_id(root), in prepare_to_merge()
1751 btrfs_root_id(root->reloc_root), in prepare_to_merge()
1752 root->reloc_root->root_key.type, in prepare_to_merge()
1753 root->reloc_root->root_key.offset, in prepare_to_merge()
1755 &root->reloc_root->root_item), in prepare_to_merge()
1764 btrfs_root_id(root), in prepare_to_merge()
1772 btrfs_put_root(root); in prepare_to_merge()
1785 ret = btrfs_update_reloc_root(trans, root); in prepare_to_merge()
1792 btrfs_put_root(root); in prepare_to_merge()
1824 struct btrfs_root *root; in merge_reloc_roots() local
1830 root = rc->extent_root; in merge_reloc_roots()
1846 root = btrfs_get_fs_root(fs_info, reloc_root->root_key.offset, in merge_reloc_roots()
1849 if (WARN_ON(IS_ERR(root))) { in merge_reloc_roots()
1858 ret = PTR_ERR(root); in merge_reloc_roots()
1861 if (WARN_ON(root->reloc_root != reloc_root)) { in merge_reloc_roots()
1869 ret = merge_reloc_root(rc, root); in merge_reloc_roots()
1870 btrfs_put_root(root); in merge_reloc_roots()
1878 if (!IS_ERR(root)) { in merge_reloc_roots()
1879 if (root->reloc_root == reloc_root) { in merge_reloc_roots()
1880 root->reloc_root = NULL; in merge_reloc_roots()
1884 &root->state); in merge_reloc_roots()
1885 btrfs_put_root(root); in merge_reloc_roots()
1943 struct btrfs_root *root; in record_reloc_root_in_trans() local
1949 root = btrfs_get_fs_root(fs_info, reloc_root->root_key.offset, false); in record_reloc_root_in_trans()
1959 if (IS_ERR(root)) { in record_reloc_root_in_trans()
1960 DEBUG_WARN("error %ld reading root for reloc root", PTR_ERR(root)); in record_reloc_root_in_trans()
1961 return PTR_ERR(root); in record_reloc_root_in_trans()
1963 if (root->reloc_root != reloc_root) { in record_reloc_root_in_trans()
1968 btrfs_put_root(root); in record_reloc_root_in_trans()
1971 ret = btrfs_record_root_in_trans(trans, root); in record_reloc_root_in_trans()
1972 btrfs_put_root(root); in record_reloc_root_in_trans()
1984 struct btrfs_root *root; in select_reloc_root() local
1989 root = next->root; in select_reloc_root()
2002 if (unlikely(!root)) { in select_reloc_root()
2008 if (unlikely(!test_bit(BTRFS_ROOT_SHAREABLE, &root->state))) { in select_reloc_root()
2015 if (btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID) { in select_reloc_root()
2016 ret = record_reloc_root_in_trans(trans, root); in select_reloc_root()
2022 ret = btrfs_record_root_in_trans(trans, root); in select_reloc_root()
2025 root = root->reloc_root; in select_reloc_root()
2031 if (!root) in select_reloc_root()
2048 next->new_bytenr = root->node->start; in select_reloc_root()
2049 btrfs_put_root(next->root); in select_reloc_root()
2050 next->root = btrfs_grab_root(root); in select_reloc_root()
2051 ASSERT(next->root); in select_reloc_root()
2062 return root; in select_reloc_root()
2078 struct btrfs_root *root; in select_one_root() local
2087 root = next->root; in select_one_root()
2093 if (!root) in select_one_root()
2097 if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) in select_one_root()
2098 return root; in select_one_root()
2100 if (btrfs_root_id(root) != BTRFS_TREE_RELOC_OBJECTID) in select_one_root()
2101 fs_root = root; in select_one_root()
2211 struct btrfs_root *root; in do_relocation() local
2230 root = select_reloc_root(trans, rc, upper, edges); in do_relocation()
2231 if (IS_ERR(root)) { in do_relocation()
2232 ret = PTR_ERR(root); in do_relocation()
2250 ret = btrfs_search_slot(trans, root, key, path, 0, 1); in do_relocation()
2281 btrfs_err(root->fs_info, in do_relocation()
2293 blocksize = root->fs_info->nodesize; in do_relocation()
2302 ret = btrfs_cow_block(trans, root, eb, upper->eb, in do_relocation()
2330 btrfs_root_id(root), false); in do_relocation()
2333 ret = btrfs_drop_subtree(trans, root, eb, in do_relocation()
2479 struct btrfs_root *root; in relocate_tree_block() local
2494 root = select_one_root(node); in relocate_tree_block()
2495 if (IS_ERR(root)) { in relocate_tree_block()
2496 ret = PTR_ERR(root); in relocate_tree_block()
2507 if (root) { in relocate_tree_block()
2508 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) { in relocate_tree_block()
2523 btrfs_err(root->fs_info, in relocate_tree_block()
2529 ret = btrfs_record_root_in_trans(trans, root); in relocate_tree_block()
2536 if (!root->reloc_root) { in relocate_tree_block()
2540 root = root->reloc_root; in relocate_tree_block()
2541 node->new_bytenr = root->node->start; in relocate_tree_block()
2542 btrfs_put_root(node->root); in relocate_tree_block()
2543 node->root = btrfs_grab_root(root); in relocate_tree_block()
2544 ASSERT(node->root); in relocate_tree_block()
2546 btrfs_err(root->fs_info, in relocate_tree_block()
2568 struct btrfs_root *root; in relocate_cowonly_block() local
2573 root = btrfs_get_fs_root(fs_info, block->owner, true); in relocate_cowonly_block()
2574 if (IS_ERR(root)) in relocate_cowonly_block()
2575 return PTR_ERR(root); in relocate_cowonly_block()
2577 nr_levels = max(btrfs_header_level(root->node) - block->level, 0) + 1; in relocate_cowonly_block()
2582 btrfs_put_root(root); in relocate_cowonly_block()
2586 if (root == root->fs_info->chunk_root) in relocate_cowonly_block()
2589 ret = btrfs_search_slot(trans, root, &block->key, path, 0, 1); in relocate_cowonly_block()
2593 if (root == root->fs_info->chunk_root) in relocate_cowonly_block()
2597 btrfs_put_root(root); in relocate_cowonly_block()
2996 struct btrfs_root *root = BTRFS_I(inode)->root; in relocate_data_extent() local
3016 if (cluster->nr > 0 && cluster->owning_root != root->relocation_src_root) { in relocate_data_extent()
3017 u64 tmp = root->relocation_src_root; in relocate_data_extent()
3024 root->relocation_src_root = cluster->owning_root; in relocate_data_extent()
3030 root->relocation_src_root = tmp; in relocate_data_extent()
3035 cluster->owning_root = root->relocation_src_root; in relocate_data_extent()
3231 struct btrfs_root *root = fs_info->tree_root; in delete_block_group_cache() local
3239 btrfs_inode = btrfs_iget(ino, root); in delete_block_group_cache()
3250 trans = btrfs_join_transaction(root); in delete_block_group_cache()
3571 struct btrfs_root *root = BTRFS_I(rc->data_inode)->root; in relocate_block_group() local
3576 root->relocation_src_root = owning_root_id; in relocate_block_group()
3687 struct btrfs_root *root, u64 objectid) in __insert_orphan_inode() argument
3698 ret = btrfs_insert_empty_inode(trans, root, path, objectid); in __insert_orphan_inode()
3716 struct btrfs_root *root, u64 objectid) in delete_orphan_inode() argument
3731 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); in delete_orphan_inode()
3737 ret = btrfs_del_item(trans, root, path); in delete_orphan_inode()
3754 struct btrfs_root *root; in create_reloc_inode() local
3758 root = btrfs_grab_root(fs_info->data_reloc_root); in create_reloc_inode()
3759 trans = btrfs_start_transaction(root, 6); in create_reloc_inode()
3761 btrfs_put_root(root); in create_reloc_inode()
3765 ret = btrfs_get_free_objectid(root, &objectid); in create_reloc_inode()
3769 ret = __insert_orphan_inode(trans, root, objectid); in create_reloc_inode()
3773 inode = btrfs_iget(objectid, root); in create_reloc_inode()
3775 delete_orphan_inode(trans, root, objectid); in create_reloc_inode()
3784 btrfs_put_root(root); in create_reloc_inode()
4048 static noinline_for_stack int mark_garbage_root(struct btrfs_root *root) in mark_garbage_root() argument
4050 struct btrfs_fs_info *fs_info = root->fs_info; in mark_garbage_root()
4058 memset(&root->root_item.drop_progress, 0, in mark_garbage_root()
4059 sizeof(root->root_item.drop_progress)); in mark_garbage_root()
4060 btrfs_set_root_drop_level(&root->root_item, 0); in mark_garbage_root()
4061 btrfs_set_root_refs(&root->root_item, 0); in mark_garbage_root()
4063 &root->root_key, &root->root_item); in mark_garbage_root()
4253 struct btrfs_fs_info *fs_info = inode->root->fs_info; in btrfs_reloc_clone_csums()
4293 struct btrfs_root *root, in btrfs_reloc_cow_block() argument
4297 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_reloc_cow_block()
4308 BUG_ON(rc->stage == UPDATE_DATA_PTRS && btrfs_is_data_reloc_root(root)); in btrfs_reloc_cow_block()
4312 btrfs_root_last_snapshot(&root->root_item)) in btrfs_reloc_cow_block()
4315 if (btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID && rc->create_reloc_tree) { in btrfs_reloc_cow_block()
4351 ret = replace_file_extents(trans, rc, root, cow); in btrfs_reloc_cow_block()
4362 struct btrfs_root *root = pending->root; in btrfs_reloc_pre_snapshot() local
4363 struct reloc_control *rc = root->fs_info->reloc_ctl; in btrfs_reloc_pre_snapshot()
4365 if (!rc || !have_reloc_root(root)) in btrfs_reloc_pre_snapshot()
4371 root = root->reloc_root; in btrfs_reloc_pre_snapshot()
4372 BUG_ON(btrfs_root_refs(&root->root_item) == 0); in btrfs_reloc_pre_snapshot()
4397 struct btrfs_root *root = pending->root; in btrfs_reloc_post_snapshot() local
4400 struct reloc_control *rc = root->fs_info->reloc_ctl; in btrfs_reloc_post_snapshot()
4403 if (!rc || !have_reloc_root(root)) in btrfs_reloc_post_snapshot()
4406 rc = root->fs_info->reloc_ctl; in btrfs_reloc_post_snapshot()
4418 reloc_root = create_reloc_root(trans, root->reloc_root, btrfs_root_id(new_root)); in btrfs_reloc_post_snapshot()