Lines Matching refs:root
21 *root, struct btrfs_path *path, int level);
22 static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root *root,
31 static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
125 struct extent_buffer *btrfs_root_node(struct btrfs_root *root) in btrfs_root_node() argument
131 eb = rcu_dereference(root->node); in btrfs_root_node()
154 static void add_root_to_dirty_list(struct btrfs_root *root) in add_root_to_dirty_list() argument
156 struct btrfs_fs_info *fs_info = root->fs_info; in add_root_to_dirty_list()
158 if (test_bit(BTRFS_ROOT_DIRTY, &root->state) || in add_root_to_dirty_list()
159 !test_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state)) in add_root_to_dirty_list()
163 if (!test_and_set_bit(BTRFS_ROOT_DIRTY, &root->state)) { in add_root_to_dirty_list()
165 if (root->root_key.objectid == BTRFS_EXTENT_TREE_OBJECTID) in add_root_to_dirty_list()
166 list_move_tail(&root->dirty_list, in add_root_to_dirty_list()
169 list_move(&root->dirty_list, in add_root_to_dirty_list()
181 struct btrfs_root *root, in btrfs_copy_root() argument
185 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_copy_root()
191 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in btrfs_copy_root()
193 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in btrfs_copy_root()
194 trans->transid != root->last_trans); in btrfs_copy_root()
202 cow = btrfs_alloc_tree_block(trans, root, 0, new_root_objectid, in btrfs_copy_root()
223 ret = btrfs_inc_ref(trans, root, cow, 1); in btrfs_copy_root()
225 ret = btrfs_inc_ref(trans, root, cow, 0); in btrfs_copy_root()
241 int btrfs_block_can_be_shared(struct btrfs_root *root, in btrfs_block_can_be_shared() argument
249 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in btrfs_block_can_be_shared()
250 buf != root->node && buf != root->commit_root && in btrfs_block_can_be_shared()
252 btrfs_root_last_snapshot(&root->root_item) || in btrfs_block_can_be_shared()
260 struct btrfs_root *root, in update_ref_for_cow() argument
265 struct btrfs_fs_info *fs_info = root->fs_info; in update_ref_for_cow()
289 if (btrfs_block_can_be_shared(root, buf)) { in update_ref_for_cow()
302 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID || in update_ref_for_cow()
314 if ((owner == root->root_key.objectid || in update_ref_for_cow()
315 root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && in update_ref_for_cow()
317 ret = btrfs_inc_ref(trans, root, buf, 1); in update_ref_for_cow()
321 if (root->root_key.objectid == in update_ref_for_cow()
323 ret = btrfs_dec_ref(trans, root, buf, 0); in update_ref_for_cow()
326 ret = btrfs_inc_ref(trans, root, cow, 1); in update_ref_for_cow()
333 if (root->root_key.objectid == in update_ref_for_cow()
335 ret = btrfs_inc_ref(trans, root, cow, 1); in update_ref_for_cow()
337 ret = btrfs_inc_ref(trans, root, cow, 0); in update_ref_for_cow()
351 if (root->root_key.objectid == in update_ref_for_cow()
353 ret = btrfs_inc_ref(trans, root, cow, 1); in update_ref_for_cow()
355 ret = btrfs_inc_ref(trans, root, cow, 0); in update_ref_for_cow()
358 ret = btrfs_dec_ref(trans, root, buf, 1); in update_ref_for_cow()
381 struct btrfs_root *root, in __btrfs_cow_block() argument
388 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_cow_block()
401 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in __btrfs_cow_block()
403 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in __btrfs_cow_block()
404 trans->transid != root->last_trans); in __btrfs_cow_block()
413 if ((root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && parent) in __btrfs_cow_block()
416 cow = btrfs_alloc_tree_block(trans, root, parent_start, in __btrfs_cow_block()
417 root->root_key.objectid, &disk_key, level, in __btrfs_cow_block()
430 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) in __btrfs_cow_block()
433 btrfs_set_header_owner(cow, root->root_key.objectid); in __btrfs_cow_block()
437 ret = update_ref_for_cow(trans, root, buf, cow, &last_ref); in __btrfs_cow_block()
445 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) { in __btrfs_cow_block()
446 ret = btrfs_reloc_cow_block(trans, root, buf, cow); in __btrfs_cow_block()
455 if (buf == root->node) { in __btrfs_cow_block()
457 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID || in __btrfs_cow_block()
462 ret = btrfs_tree_mod_log_insert_root(root->node, cow, true); in __btrfs_cow_block()
464 rcu_assign_pointer(root->node, cow); in __btrfs_cow_block()
466 btrfs_free_tree_block(trans, btrfs_root_id(root), buf, in __btrfs_cow_block()
469 add_root_to_dirty_list(root); in __btrfs_cow_block()
488 btrfs_free_tree_block(trans, btrfs_root_id(root), buf, in __btrfs_cow_block()
500 struct btrfs_root *root, in should_cow_block() argument
503 if (btrfs_is_testing(root->fs_info)) in should_cow_block()
522 !(root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID && in should_cow_block()
524 !test_bit(BTRFS_ROOT_FORCE_COW, &root->state)) in should_cow_block()
535 struct btrfs_root *root, struct extent_buffer *buf, in btrfs_cow_block() argument
540 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_cow_block()
544 if (test_bit(BTRFS_ROOT_DELETING, &root->state)) in btrfs_cow_block()
557 if (!should_cow_block(trans, root, buf)) { in btrfs_cow_block()
570 btrfs_qgroup_trace_subtree_after_cow(trans, root, buf); in btrfs_cow_block()
571 ret = __btrfs_cow_block(trans, root, buf, parent, in btrfs_cow_block()
574 trace_btrfs_cow_block(root, buf, *cow_ret); in btrfs_cow_block()
649 struct btrfs_root *root, struct extent_buffer *parent, in btrfs_realloc_node() argument
653 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_realloc_node()
709 err = __btrfs_cow_block(trans, root, cur, parent, i, in btrfs_realloc_node()
810 static void root_add_used(struct btrfs_root *root, u32 size) in root_add_used() argument
812 spin_lock(&root->accounting_lock); in root_add_used()
813 btrfs_set_root_used(&root->root_item, in root_add_used()
814 btrfs_root_used(&root->root_item) + size); in root_add_used()
815 spin_unlock(&root->accounting_lock); in root_add_used()
818 static void root_sub_used(struct btrfs_root *root, u32 size) in root_sub_used() argument
820 spin_lock(&root->accounting_lock); in root_sub_used()
821 btrfs_set_root_used(&root->root_item, in root_sub_used()
822 btrfs_root_used(&root->root_item) - size); in root_sub_used()
823 spin_unlock(&root->accounting_lock); in root_sub_used()
860 struct btrfs_root *root, in balance_level() argument
863 struct btrfs_fs_info *fs_info = root->fs_info; in balance_level()
907 ret = btrfs_cow_block(trans, root, child, mid, 0, &child, in balance_level()
915 ret = btrfs_tree_mod_log_insert_root(root->node, child, true); in balance_level()
917 rcu_assign_pointer(root->node, child); in balance_level()
919 add_root_to_dirty_list(root); in balance_level()
929 root_sub_used(root, mid->len); in balance_level()
930 btrfs_free_tree_block(trans, btrfs_root_id(root), mid, 0, 1); in balance_level()
945 wret = btrfs_cow_block(trans, root, left, in balance_level()
960 wret = btrfs_cow_block(trans, root, right, in balance_level()
987 del_ptr(root, path, level + 1, pslot + 1); in balance_level()
988 root_sub_used(root, right->len); in balance_level()
989 btrfs_free_tree_block(trans, btrfs_root_id(root), right, in balance_level()
1033 del_ptr(root, path, level + 1, pslot); in balance_level()
1034 root_sub_used(root, mid->len); in balance_level()
1035 btrfs_free_tree_block(trans, btrfs_root_id(root), mid, 0, 1); in balance_level()
1088 struct btrfs_root *root, in push_nodes_for_insert() argument
1091 struct btrfs_fs_info *fs_info = root->fs_info; in push_nodes_for_insert()
1129 ret = btrfs_cow_block(trans, root, left, parent, in push_nodes_for_insert()
1183 ret = btrfs_cow_block(trans, root, right, in push_nodes_for_insert()
1395 read_block_for_search(struct btrfs_root *root, struct btrfs_path *p, in read_block_for_search() argument
1399 struct btrfs_fs_info *fs_info = root->fs_info; in read_block_for_search()
1457 tmp = read_tree_block(fs_info, blocknr, root->root_key.objectid, in read_block_for_search()
1488 struct btrfs_root *root, struct btrfs_path *p, in setup_nodes_for_search() argument
1492 struct btrfs_fs_info *fs_info = root->fs_info; in setup_nodes_for_search()
1505 ret = split_node(trans, root, p, level); in setup_nodes_for_search()
1518 ret = balance_level(trans, root, p, level); in setup_nodes_for_search()
1567 static struct extent_buffer *btrfs_search_slot_get_root(struct btrfs_root *root, in btrfs_search_slot_get_root() argument
1571 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_search_slot_get_root()
1591 b = btrfs_clone_extent_buffer(root->commit_root); in btrfs_search_slot_get_root()
1597 b = root->commit_root; in btrfs_search_slot_get_root()
1611 b = btrfs_root_node(root); in btrfs_search_slot_get_root()
1625 b = btrfs_read_lock_root_node(root); in btrfs_search_slot_get_root()
1635 b = btrfs_lock_root_node(root); in btrfs_search_slot_get_root()
1683 int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root *root, in btrfs_search_slot() argument
1730 b = btrfs_search_slot_get_root(root, p, write_lock_level); in btrfs_search_slot()
1749 if (!should_cow_block(trans, root, b)) in btrfs_search_slot()
1766 err = btrfs_cow_block(trans, root, b, NULL, 0, in btrfs_search_slot()
1770 err = btrfs_cow_block(trans, root, b, in btrfs_search_slot()
1848 err = split_leaf(trans, root, key, in btrfs_search_slot()
1867 err = setup_nodes_for_search(trans, root, p, b, level, ins_len, in btrfs_search_slot()
1898 err = read_block_for_search(root, p, &b, level, slot, key); in btrfs_search_slot()
1937 int btrfs_search_old_slot(struct btrfs_root *root, const struct btrfs_key *key, in btrfs_search_old_slot() argument
1940 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_search_old_slot()
1954 return btrfs_search_slot(NULL, root, key, p, 0, 0); in btrfs_search_old_slot()
1958 b = btrfs_get_old_root(root, time_seq); in btrfs_search_old_slot()
2003 err = read_block_for_search(root, p, &b, level, slot, key); in btrfs_search_old_slot()
2041 int btrfs_search_slot_for_read(struct btrfs_root *root, in btrfs_search_slot_for_read() argument
2050 ret = btrfs_search_slot(NULL, root, key, p, 0, 0); in btrfs_search_slot_for_read()
2064 ret = btrfs_next_leaf(root, p); in btrfs_search_slot_for_read()
2080 ret = btrfs_prev_leaf(root, p); in btrfs_search_slot_for_read()
2112 int btrfs_search_backwards(struct btrfs_root *root, struct btrfs_key *key, in btrfs_search_backwards() argument
2117 ret = btrfs_search_slot(NULL, root, key, path, 0, 0); in btrfs_search_backwards()
2119 ret = btrfs_previous_item(root, path, key->objectid, key->type); in btrfs_search_backwards()
2421 struct btrfs_root *root, in insert_new_root() argument
2424 struct btrfs_fs_info *fs_info = root->fs_info; in insert_new_root()
2433 BUG_ON(path->nodes[level-1] != root->node); in insert_new_root()
2441 c = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid, in insert_new_root()
2442 &lower_key, level, root->node->start, 0, in insert_new_root()
2447 root_add_used(root, fs_info->nodesize); in insert_new_root()
2459 old = root->node; in insert_new_root()
2460 ret = btrfs_tree_mod_log_insert_root(root->node, c, false); in insert_new_root()
2462 rcu_assign_pointer(root->node, c); in insert_new_root()
2467 add_root_to_dirty_list(root); in insert_new_root()
2531 struct btrfs_root *root, in split_node() argument
2534 struct btrfs_fs_info *fs_info = root->fs_info; in split_node()
2544 if (c == root->node) { in split_node()
2555 ret = insert_new_root(trans, root, path, level + 1); in split_node()
2559 ret = push_nodes_for_insert(trans, root, path, level); in split_node()
2572 split = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid, in split_node()
2578 root_add_used(root, fs_info->nodesize); in split_node()
2812 *root, struct btrfs_path *path, in push_leaf_right()
2849 ret = btrfs_cow_block(trans, root, right, upper, in push_leaf_right()
3050 *root, struct btrfs_path *path, int min_data_size, in push_leaf_left()
3089 ret = btrfs_cow_block(trans, root, left, in push_leaf_left()
3192 struct btrfs_root *root, in push_for_double_split() argument
3210 ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3233 ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3252 struct btrfs_root *root, in split_leaf() argument
3263 struct btrfs_fs_info *fs_info = root->fs_info; in split_leaf()
3283 wret = push_leaf_right(trans, root, path, space_needed, in split_leaf()
3291 wret = push_leaf_left(trans, root, path, space_needed, in split_leaf()
3304 ret = insert_new_root(trans, root, path, 1); in split_leaf()
3365 right = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid, in split_leaf()
3372 root_add_used(root, fs_info->nodesize); in split_leaf()
3414 push_for_double_split(trans, root, path, data_size); in split_leaf()
3422 struct btrfs_root *root, in setup_leaf_for_split() argument
3451 ret = btrfs_search_slot(trans, root, &key, path, 0, 1); in setup_leaf_for_split()
3475 ret = split_leaf(trans, root, &key, path, ins_len, 1); in setup_leaf_for_split()
3570 struct btrfs_root *root, in btrfs_split_item() argument
3576 ret = setup_leaf_for_split(trans, root, path, in btrfs_split_item()
3758 static void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path, in setup_items_for_insert() argument
3761 struct btrfs_fs_info *fs_info = root->fs_info; in setup_items_for_insert()
3860 void btrfs_setup_item_for_insert(struct btrfs_root *root, in btrfs_setup_item_for_insert() argument
3872 setup_items_for_insert(root, path, &batch); in btrfs_setup_item_for_insert()
3880 struct btrfs_root *root, in btrfs_insert_empty_items() argument
3889 ret = btrfs_search_slot(trans, root, &batch->keys[0], path, total_size, 1); in btrfs_insert_empty_items()
3898 setup_items_for_insert(root, path, batch); in btrfs_insert_empty_items()
3906 int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root *root, in btrfs_insert_item() argument
3918 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size); in btrfs_insert_item()
3938 struct btrfs_root *root, in btrfs_duplicate_item() argument
3948 ret = setup_leaf_for_split(trans, root, path, in btrfs_duplicate_item()
3954 btrfs_setup_item_for_insert(root, path, new_key, item_size); in btrfs_duplicate_item()
3969 static void del_ptr(struct btrfs_root *root, struct btrfs_path *path, in del_ptr() argument
3996 if (nritems == 0 && parent == root->node) { in del_ptr()
3997 BUG_ON(btrfs_header_level(root->node) != 1); in del_ptr()
3999 btrfs_set_header_level(root->node, 0); in del_ptr()
4020 struct btrfs_root *root, in btrfs_del_leaf() argument
4025 del_ptr(root, path, 1, path->slots[1]); in btrfs_del_leaf()
4033 root_sub_used(root, leaf->len); in btrfs_del_leaf()
4036 btrfs_free_tree_block(trans, btrfs_root_id(root), leaf, 0, 1); in btrfs_del_leaf()
4043 int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, in btrfs_del_items() argument
4046 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_del_items()
4092 if (leaf == root->node) { in btrfs_del_items()
4096 btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4116 wret = push_leaf_left(trans, root, path, 1, 1, in btrfs_del_items()
4123 wret = push_leaf_right(trans, root, path, 1, in btrfs_del_items()
4131 btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4159 int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) in btrfs_prev_leaf() argument
4181 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_prev_leaf()
4220 int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key, in btrfs_search_forward() argument
4235 cur = btrfs_read_lock_root_node(root); in btrfs_search_forward()
4286 sret = btrfs_find_next_key(root, path, min_key, level, in btrfs_search_forward()
4334 int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, in btrfs_find_next_key() argument
4370 ret = btrfs_search_slot(NULL, root, &cur_key, path, in btrfs_find_next_key()
4399 int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path, in btrfs_next_old_leaf() argument
4424 ret = btrfs_search_old_slot(root, &key, path, time_seq); in btrfs_next_old_leaf()
4426 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_next_old_leaf()
4497 ret = read_block_for_search(root, path, &next, level, in btrfs_next_old_leaf()
4537 ret = read_block_for_search(root, path, &next, level, in btrfs_next_old_leaf()
4563 int btrfs_previous_item(struct btrfs_root *root, in btrfs_previous_item() argument
4574 ret = btrfs_prev_leaf(root, path); in btrfs_previous_item()
4605 int btrfs_previous_extent_item(struct btrfs_root *root, in btrfs_previous_extent_item() argument
4615 ret = btrfs_prev_leaf(root, path); in btrfs_previous_extent_item()