Lines Matching refs:root
20 *root, struct btrfs_path *path, int level);
21 static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root *root,
30 static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
124 struct extent_buffer *btrfs_root_node(struct btrfs_root *root) in btrfs_root_node() argument
130 eb = rcu_dereference(root->node); in btrfs_root_node()
153 static void add_root_to_dirty_list(struct btrfs_root *root) in add_root_to_dirty_list() argument
155 struct btrfs_fs_info *fs_info = root->fs_info; in add_root_to_dirty_list()
157 if (test_bit(BTRFS_ROOT_DIRTY, &root->state) || in add_root_to_dirty_list()
158 !test_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state)) in add_root_to_dirty_list()
162 if (!test_and_set_bit(BTRFS_ROOT_DIRTY, &root->state)) { in add_root_to_dirty_list()
164 if (root->root_key.objectid == BTRFS_EXTENT_TREE_OBJECTID) in add_root_to_dirty_list()
165 list_move_tail(&root->dirty_list, in add_root_to_dirty_list()
168 list_move(&root->dirty_list, in add_root_to_dirty_list()
180 struct btrfs_root *root, in btrfs_copy_root() argument
184 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_copy_root()
190 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in btrfs_copy_root()
192 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in btrfs_copy_root()
193 trans->transid != root->last_trans); in btrfs_copy_root()
201 cow = btrfs_alloc_tree_block(trans, root, 0, new_root_objectid, in btrfs_copy_root()
222 ret = btrfs_inc_ref(trans, root, cow, 1); in btrfs_copy_root()
224 ret = btrfs_inc_ref(trans, root, cow, 0); in btrfs_copy_root()
240 int btrfs_block_can_be_shared(struct btrfs_root *root, in btrfs_block_can_be_shared() argument
248 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in btrfs_block_can_be_shared()
249 buf != root->node && buf != root->commit_root && in btrfs_block_can_be_shared()
251 btrfs_root_last_snapshot(&root->root_item) || in btrfs_block_can_be_shared()
259 struct btrfs_root *root, in update_ref_for_cow() argument
264 struct btrfs_fs_info *fs_info = root->fs_info; in update_ref_for_cow()
288 if (btrfs_block_can_be_shared(root, buf)) { in update_ref_for_cow()
301 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID || in update_ref_for_cow()
313 if ((owner == root->root_key.objectid || in update_ref_for_cow()
314 root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && in update_ref_for_cow()
316 ret = btrfs_inc_ref(trans, root, buf, 1); in update_ref_for_cow()
320 if (root->root_key.objectid == in update_ref_for_cow()
322 ret = btrfs_dec_ref(trans, root, buf, 0); in update_ref_for_cow()
325 ret = btrfs_inc_ref(trans, root, cow, 1); in update_ref_for_cow()
332 if (root->root_key.objectid == in update_ref_for_cow()
334 ret = btrfs_inc_ref(trans, root, cow, 1); in update_ref_for_cow()
336 ret = btrfs_inc_ref(trans, root, cow, 0); in update_ref_for_cow()
350 if (root->root_key.objectid == in update_ref_for_cow()
352 ret = btrfs_inc_ref(trans, root, cow, 1); in update_ref_for_cow()
354 ret = btrfs_inc_ref(trans, root, cow, 0); in update_ref_for_cow()
357 ret = btrfs_dec_ref(trans, root, buf, 1); in update_ref_for_cow()
380 struct btrfs_root *root, in __btrfs_cow_block() argument
387 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_cow_block()
400 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in __btrfs_cow_block()
402 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) && in __btrfs_cow_block()
403 trans->transid != root->last_trans); in __btrfs_cow_block()
412 if ((root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && parent) in __btrfs_cow_block()
415 cow = btrfs_alloc_tree_block(trans, root, parent_start, in __btrfs_cow_block()
416 root->root_key.objectid, &disk_key, level, in __btrfs_cow_block()
429 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) in __btrfs_cow_block()
432 btrfs_set_header_owner(cow, root->root_key.objectid); in __btrfs_cow_block()
436 ret = update_ref_for_cow(trans, root, buf, cow, &last_ref); in __btrfs_cow_block()
444 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) { in __btrfs_cow_block()
445 ret = btrfs_reloc_cow_block(trans, root, buf, cow); in __btrfs_cow_block()
454 if (buf == root->node) { in __btrfs_cow_block()
456 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID || in __btrfs_cow_block()
460 ret = btrfs_tree_mod_log_insert_root(root->node, cow, true); in __btrfs_cow_block()
468 rcu_assign_pointer(root->node, cow); in __btrfs_cow_block()
470 btrfs_free_tree_block(trans, btrfs_root_id(root), buf, in __btrfs_cow_block()
473 add_root_to_dirty_list(root); in __btrfs_cow_block()
492 btrfs_free_tree_block(trans, btrfs_root_id(root), buf, in __btrfs_cow_block()
504 struct btrfs_root *root, in should_cow_block() argument
507 if (btrfs_is_testing(root->fs_info)) in should_cow_block()
526 !(root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID && in should_cow_block()
528 !test_bit(BTRFS_ROOT_FORCE_COW, &root->state)) in should_cow_block()
539 struct btrfs_root *root, struct extent_buffer *buf, in btrfs_cow_block() argument
544 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_cow_block()
548 if (unlikely(test_bit(BTRFS_ROOT_DELETING, &root->state))) { in btrfs_cow_block()
552 buf->start, btrfs_root_id(root)); in btrfs_cow_block()
567 buf->start, btrfs_root_id(root), trans->transid, in btrfs_cow_block()
573 if (!should_cow_block(trans, root, buf)) { in btrfs_cow_block()
586 btrfs_qgroup_trace_subtree_after_cow(trans, root, buf); in btrfs_cow_block()
587 ret = __btrfs_cow_block(trans, root, buf, parent, in btrfs_cow_block()
590 trace_btrfs_cow_block(root, buf, *cow_ret); in btrfs_cow_block()
665 struct btrfs_root *root, struct extent_buffer *parent, in btrfs_realloc_node() argument
669 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_realloc_node()
694 parent->start, btrfs_root_id(root), trans->transid, in btrfs_realloc_node()
739 err = __btrfs_cow_block(trans, root, cur, parent, i, in btrfs_realloc_node()
840 static void root_add_used(struct btrfs_root *root, u32 size) in root_add_used() argument
842 spin_lock(&root->accounting_lock); in root_add_used()
843 btrfs_set_root_used(&root->root_item, in root_add_used()
844 btrfs_root_used(&root->root_item) + size); in root_add_used()
845 spin_unlock(&root->accounting_lock); in root_add_used()
848 static void root_sub_used(struct btrfs_root *root, u32 size) in root_sub_used() argument
850 spin_lock(&root->accounting_lock); in root_sub_used()
851 btrfs_set_root_used(&root->root_item, in root_sub_used()
852 btrfs_root_used(&root->root_item) - size); in root_sub_used()
853 spin_unlock(&root->accounting_lock); in root_sub_used()
890 struct btrfs_root *root, in balance_level() argument
893 struct btrfs_fs_info *fs_info = root->fs_info; in balance_level()
937 ret = btrfs_cow_block(trans, root, child, mid, 0, &child, in balance_level()
945 ret = btrfs_tree_mod_log_insert_root(root->node, child, true); in balance_level()
952 rcu_assign_pointer(root->node, child); in balance_level()
954 add_root_to_dirty_list(root); in balance_level()
964 root_sub_used(root, mid->len); in balance_level()
965 btrfs_free_tree_block(trans, btrfs_root_id(root), mid, 0, 1); in balance_level()
980 wret = btrfs_cow_block(trans, root, left, in balance_level()
995 wret = btrfs_cow_block(trans, root, right, in balance_level()
1022 del_ptr(root, path, level + 1, pslot + 1); in balance_level()
1023 root_sub_used(root, right->len); in balance_level()
1024 btrfs_free_tree_block(trans, btrfs_root_id(root), right, in balance_level()
1071 del_ptr(root, path, level + 1, pslot); in balance_level()
1072 root_sub_used(root, mid->len); in balance_level()
1073 btrfs_free_tree_block(trans, btrfs_root_id(root), mid, 0, 1); in balance_level()
1129 struct btrfs_root *root, in push_nodes_for_insert() argument
1132 struct btrfs_fs_info *fs_info = root->fs_info; in push_nodes_for_insert()
1170 ret = btrfs_cow_block(trans, root, left, parent, in push_nodes_for_insert()
1224 ret = btrfs_cow_block(trans, root, right, in push_nodes_for_insert()
1436 read_block_for_search(struct btrfs_root *root, struct btrfs_path *p, in read_block_for_search() argument
1440 struct btrfs_fs_info *fs_info = root->fs_info; in read_block_for_search()
1498 tmp = read_tree_block(fs_info, blocknr, root->root_key.objectid, in read_block_for_search()
1529 struct btrfs_root *root, struct btrfs_path *p, in setup_nodes_for_search() argument
1533 struct btrfs_fs_info *fs_info = root->fs_info; in setup_nodes_for_search()
1546 ret = split_node(trans, root, p, level); in setup_nodes_for_search()
1559 ret = balance_level(trans, root, p, level); in setup_nodes_for_search()
1608 static struct extent_buffer *btrfs_search_slot_get_root(struct btrfs_root *root, in btrfs_search_slot_get_root() argument
1617 b = root->commit_root; in btrfs_search_slot_get_root()
1630 b = btrfs_root_node(root); in btrfs_search_slot_get_root()
1647 b = btrfs_read_lock_root_node(root); in btrfs_search_slot_get_root()
1657 b = btrfs_lock_root_node(root); in btrfs_search_slot_get_root()
1752 int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root *root, in btrfs_search_slot() argument
1756 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_search_slot()
1805 b = btrfs_search_slot_get_root(root, p, write_lock_level); in btrfs_search_slot()
1824 if (!should_cow_block(trans, root, b)) in btrfs_search_slot()
1841 err = btrfs_cow_block(trans, root, b, NULL, 0, in btrfs_search_slot()
1845 err = btrfs_cow_block(trans, root, b, in btrfs_search_slot()
1923 err = split_leaf(trans, root, key, in btrfs_search_slot()
1942 err = setup_nodes_for_search(trans, root, p, b, level, ins_len, in btrfs_search_slot()
1973 err = read_block_for_search(root, p, &b, level, slot, key); in btrfs_search_slot()
1984 btrfs_maybe_reset_lockdep_class(root, b); in btrfs_search_slot()
2025 int btrfs_search_old_slot(struct btrfs_root *root, const struct btrfs_key *key, in btrfs_search_old_slot() argument
2028 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_search_old_slot()
2042 return btrfs_search_slot(NULL, root, key, p, 0, 0); in btrfs_search_old_slot()
2046 b = btrfs_get_old_root(root, time_seq); in btrfs_search_old_slot()
2091 err = read_block_for_search(root, p, &b, level, slot, key); in btrfs_search_old_slot()
2129 int btrfs_search_slot_for_read(struct btrfs_root *root, in btrfs_search_slot_for_read() argument
2138 ret = btrfs_search_slot(NULL, root, key, p, 0, 0); in btrfs_search_slot_for_read()
2152 ret = btrfs_next_leaf(root, p); in btrfs_search_slot_for_read()
2168 ret = btrfs_prev_leaf(root, p); in btrfs_search_slot_for_read()
2200 int btrfs_search_backwards(struct btrfs_root *root, struct btrfs_key *key, in btrfs_search_backwards() argument
2205 ret = btrfs_search_slot(NULL, root, key, path, 0, 0); in btrfs_search_backwards()
2207 ret = btrfs_previous_item(root, path, key->objectid, key->type); in btrfs_search_backwards()
2509 struct btrfs_root *root, in insert_new_root() argument
2512 struct btrfs_fs_info *fs_info = root->fs_info; in insert_new_root()
2521 BUG_ON(path->nodes[level-1] != root->node); in insert_new_root()
2529 c = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid, in insert_new_root()
2530 &lower_key, level, root->node->start, 0, in insert_new_root()
2535 root_add_used(root, fs_info->nodesize); in insert_new_root()
2547 old = root->node; in insert_new_root()
2548 ret = btrfs_tree_mod_log_insert_root(root->node, c, false); in insert_new_root()
2550 rcu_assign_pointer(root->node, c); in insert_new_root()
2555 add_root_to_dirty_list(root); in insert_new_root()
2619 struct btrfs_root *root, in split_node() argument
2622 struct btrfs_fs_info *fs_info = root->fs_info; in split_node()
2632 if (c == root->node) { in split_node()
2643 ret = insert_new_root(trans, root, path, level + 1); in split_node()
2647 ret = push_nodes_for_insert(trans, root, path, level); in split_node()
2660 split = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid, in split_node()
2666 root_add_used(root, fs_info->nodesize); in split_node()
2902 *root, struct btrfs_path *path, in push_leaf_right()
2939 ret = btrfs_cow_block(trans, root, right, upper, in push_leaf_right()
3141 *root, struct btrfs_path *path, int min_data_size, in push_leaf_left()
3180 ret = btrfs_cow_block(trans, root, left, in push_leaf_left()
3284 struct btrfs_root *root, in push_for_double_split() argument
3302 ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3325 ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3344 struct btrfs_root *root, in split_leaf() argument
3355 struct btrfs_fs_info *fs_info = root->fs_info; in split_leaf()
3375 wret = push_leaf_right(trans, root, path, space_needed, in split_leaf()
3383 wret = push_leaf_left(trans, root, path, space_needed, in split_leaf()
3396 ret = insert_new_root(trans, root, path, 1); in split_leaf()
3457 right = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid, in split_leaf()
3464 root_add_used(root, fs_info->nodesize); in split_leaf()
3506 push_for_double_split(trans, root, path, data_size); in split_leaf()
3514 struct btrfs_root *root, in setup_leaf_for_split() argument
3543 ret = btrfs_search_slot(trans, root, &key, path, 0, 1); in setup_leaf_for_split()
3567 ret = split_leaf(trans, root, &key, path, ins_len, 1); in setup_leaf_for_split()
3662 struct btrfs_root *root, in btrfs_split_item() argument
3668 ret = setup_leaf_for_split(trans, root, path, in btrfs_split_item()
3686 struct btrfs_root *root, in btrfs_duplicate_item() argument
3696 ret = setup_leaf_for_split(trans, root, path, in btrfs_duplicate_item()
3702 setup_items_for_insert(root, path, new_key, &item_size, 1); in btrfs_duplicate_item()
3886 void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path, in setup_items_for_insert() argument
3890 struct btrfs_fs_info *fs_info = root->fs_info; in setup_items_for_insert()
3984 struct btrfs_root *root, in btrfs_insert_empty_items() argument
3999 ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1); in btrfs_insert_empty_items()
4008 setup_items_for_insert(root, path, cpu_key, data_size, nr); in btrfs_insert_empty_items()
4016 int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root *root, in btrfs_insert_item() argument
4028 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size); in btrfs_insert_item()
4045 static void del_ptr(struct btrfs_root *root, struct btrfs_path *path, in del_ptr() argument
4072 if (nritems == 0 && parent == root->node) { in del_ptr()
4073 BUG_ON(btrfs_header_level(root->node) != 1); in del_ptr()
4075 btrfs_set_header_level(root->node, 0); in del_ptr()
4096 struct btrfs_root *root, in btrfs_del_leaf() argument
4101 del_ptr(root, path, 1, path->slots[1]); in btrfs_del_leaf()
4109 root_sub_used(root, leaf->len); in btrfs_del_leaf()
4112 btrfs_free_tree_block(trans, btrfs_root_id(root), leaf, 0, 1); in btrfs_del_leaf()
4119 int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, in btrfs_del_items() argument
4122 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_del_items()
4168 if (leaf == root->node) { in btrfs_del_items()
4172 btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4192 wret = push_leaf_left(trans, root, path, 1, 1, in btrfs_del_items()
4199 wret = push_leaf_right(trans, root, path, 1, in btrfs_del_items()
4207 btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4235 int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) in btrfs_prev_leaf() argument
4259 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_prev_leaf()
4326 int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key, in btrfs_search_forward() argument
4341 cur = btrfs_read_lock_root_node(root); in btrfs_search_forward()
4392 sret = btrfs_find_next_key(root, path, min_key, level, in btrfs_search_forward()
4440 int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, in btrfs_find_next_key() argument
4476 ret = btrfs_search_slot(NULL, root, &cur_key, path, in btrfs_find_next_key()
4505 int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path, in btrfs_next_old_leaf() argument
4512 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_next_old_leaf()
4532 ret = btrfs_search_old_slot(root, &key, path, time_seq); in btrfs_next_old_leaf()
4539 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_next_old_leaf()
4611 ret = read_block_for_search(root, path, &next, level, in btrfs_next_old_leaf()
4651 ret = read_block_for_search(root, path, &next, level, in btrfs_next_old_leaf()
4686 int btrfs_previous_item(struct btrfs_root *root, in btrfs_previous_item() argument
4697 ret = btrfs_prev_leaf(root, path); in btrfs_previous_item()
4728 int btrfs_previous_extent_item(struct btrfs_root *root, in btrfs_previous_extent_item() argument
4738 ret = btrfs_prev_leaf(root, path); in btrfs_previous_extent_item()