Lines Matching refs:path

29 		      *root, struct btrfs_path *path, int level);
32 struct btrfs_path *path, int data_size, int extend);
40 static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
47 struct btrfs_path *path; in btrfs_alloc_path() local
48 path = kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS); in btrfs_alloc_path()
49 return path; in btrfs_alloc_path()
1354 tree_mod_log_rewind(struct btrfs_fs_info *fs_info, struct btrfs_path *path, in tree_mod_log_rewind() argument
1370 btrfs_set_path_blocking(path); in tree_mod_log_rewind()
1395 btrfs_clear_path_blocking(path, NULL, BTRFS_READ_LOCK); in tree_mod_log_rewind()
1888 struct btrfs_path *path, int level) in balance_level() argument
1897 int orig_slot = path->slots[level]; in balance_level()
1903 mid = path->nodes[level]; in balance_level()
1905 WARN_ON(path->locks[level] != BTRFS_WRITE_LOCK && in balance_level()
1906 path->locks[level] != BTRFS_WRITE_LOCK_BLOCKING); in balance_level()
1912 parent = path->nodes[level + 1]; in balance_level()
1913 pslot = path->slots[level + 1]; in balance_level()
1949 path->locks[level] = 0; in balance_level()
1950 path->nodes[level] = NULL; in balance_level()
2007 del_ptr(root, path, level + 1, pslot + 1); in balance_level()
2051 del_ptr(root, path, level + 1, pslot); in balance_level()
2071 path->nodes[level] = left; in balance_level()
2072 path->slots[level + 1] -= 1; in balance_level()
2073 path->slots[level] = orig_slot; in balance_level()
2080 path->slots[level] = orig_slot; in balance_level()
2085 btrfs_node_blockptr(path->nodes[level], path->slots[level])) in balance_level()
2093 if (path->nodes[level] != left) in balance_level()
2106 struct btrfs_path *path, int level) in push_nodes_for_insert() argument
2115 int orig_slot = path->slots[level]; in push_nodes_for_insert()
2120 mid = path->nodes[level]; in push_nodes_for_insert()
2124 parent = path->nodes[level + 1]; in push_nodes_for_insert()
2125 pslot = path->slots[level + 1]; in push_nodes_for_insert()
2164 path->nodes[level] = left; in push_nodes_for_insert()
2165 path->slots[level + 1] -= 1; in push_nodes_for_insert()
2166 path->slots[level] = orig_slot; in push_nodes_for_insert()
2172 path->slots[level] = orig_slot; in push_nodes_for_insert()
2218 path->nodes[level] = right; in push_nodes_for_insert()
2219 path->slots[level + 1] += 1; in push_nodes_for_insert()
2220 path->slots[level] = orig_slot - in push_nodes_for_insert()
2241 struct btrfs_path *path, in reada_for_search() argument
2251 int direction = path->reada; in reada_for_search()
2260 if (!path->nodes[level]) in reada_for_search()
2263 node = path->nodes[level]; in reada_for_search()
2288 if (path->reada < 0 && objectid) { in reada_for_search()
2307 struct btrfs_path *path, int level) in reada_for_balance() argument
2317 parent = path->nodes[level + 1]; in reada_for_balance()
2322 slot = path->slots[level + 1]; in reada_for_balance()
2366 static noinline void unlock_up(struct btrfs_path *path, int level, in unlock_up() argument
2376 if (!path->nodes[i]) in unlock_up()
2378 if (!path->locks[i]) in unlock_up()
2380 if (!no_skips && path->slots[i] == 0) { in unlock_up()
2384 if (!no_skips && path->keep_locks) { in unlock_up()
2386 t = path->nodes[i]; in unlock_up()
2388 if (nritems < 1 || path->slots[i] >= nritems - 1) { in unlock_up()
2396 t = path->nodes[i]; in unlock_up()
2397 if (i >= lowest_unlock && i > skip_level && path->locks[i]) { in unlock_up()
2398 btrfs_tree_unlock_rw(t, path->locks[i]); in unlock_up()
2399 path->locks[i] = 0; in unlock_up()
2418 noinline void btrfs_unlock_up_safe(struct btrfs_path *path, int level) in btrfs_unlock_up_safe() argument
2422 if (path->keep_locks) in btrfs_unlock_up_safe()
2426 if (!path->nodes[i]) in btrfs_unlock_up_safe()
2428 if (!path->locks[i]) in btrfs_unlock_up_safe()
2430 btrfs_tree_unlock_rw(path->nodes[i], path->locks[i]); in btrfs_unlock_up_safe()
2431 path->locks[i] = 0; in btrfs_unlock_up_safe()
2622 int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *path, in btrfs_find_item() argument
2630 ASSERT(path); in btrfs_find_item()
2637 ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0); in btrfs_find_item()
2641 eb = path->nodes[0]; in btrfs_find_item()
2642 if (ret && path->slots[0] >= btrfs_header_nritems(eb)) { in btrfs_find_item()
2643 ret = btrfs_next_leaf(fs_root, path); in btrfs_find_item()
2646 eb = path->nodes[0]; in btrfs_find_item()
2649 btrfs_item_key_to_cpu(eb, found_key, path->slots[0]); in btrfs_find_item()
3135 struct btrfs_path *path, in fixup_low_keys() argument
3142 int tslot = path->slots[i]; in fixup_low_keys()
3143 if (!path->nodes[i]) in fixup_low_keys()
3145 t = path->nodes[i]; in fixup_low_keys()
3148 btrfs_mark_buffer_dirty(path->nodes[i]); in fixup_low_keys()
3161 struct btrfs_path *path, in btrfs_set_item_key_safe() argument
3168 eb = path->nodes[0]; in btrfs_set_item_key_safe()
3169 slot = path->slots[0]; in btrfs_set_item_key_safe()
3183 fixup_low_keys(fs_info, path, &disk_key, 1); in btrfs_set_item_key_safe()
3333 struct btrfs_path *path, int level) in insert_new_root() argument
3341 BUG_ON(path->nodes[level]); in insert_new_root()
3342 BUG_ON(path->nodes[level-1] != root->node); in insert_new_root()
3344 lower = path->nodes[level-1]; in insert_new_root()
3389 path->nodes[level] = c; in insert_new_root()
3390 path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING; in insert_new_root()
3391 path->slots[level] = 0; in insert_new_root()
3403 struct btrfs_root *root, struct btrfs_path *path, in insert_ptr() argument
3411 BUG_ON(!path->nodes[level]); in insert_ptr()
3412 btrfs_assert_tree_locked(path->nodes[level]); in insert_ptr()
3413 lower = path->nodes[level]; in insert_ptr()
3450 struct btrfs_path *path, int level) in split_node() argument
3459 c = path->nodes[level]; in split_node()
3472 ret = insert_new_root(trans, root, path, level + 1); in split_node()
3476 ret = push_nodes_for_insert(trans, root, path, level); in split_node()
3477 c = path->nodes[level]; in split_node()
3525 insert_ptr(trans, root, path, &disk_key, split->start, in split_node()
3526 path->slots[level + 1] + 1, level + 1); in split_node()
3528 if (path->slots[level] >= mid) { in split_node()
3529 path->slots[level] -= mid; in split_node()
3532 path->nodes[level] = split; in split_node()
3533 path->slots[level + 1] += 1; in split_node()
3594 struct btrfs_path *path, in __push_leaf_right() argument
3600 struct extent_buffer *left = path->nodes[0]; in __push_leaf_right()
3601 struct extent_buffer *upper = path->nodes[1]; in __push_leaf_right()
3621 if (path->slots[0] >= left_nritems) in __push_leaf_right()
3624 slot = path->slots[1]; in __push_leaf_right()
3630 if (path->slots[0] > i) in __push_leaf_right()
3632 if (path->slots[0] == i) { in __push_leaf_right()
3639 if (path->slots[0] == i) in __push_leaf_right()
3711 if (path->slots[0] >= left_nritems) { in __push_leaf_right()
3712 path->slots[0] -= left_nritems; in __push_leaf_right()
3713 if (btrfs_header_nritems(path->nodes[0]) == 0) in __push_leaf_right()
3714 clean_tree_block(trans, root->fs_info, path->nodes[0]); in __push_leaf_right()
3715 btrfs_tree_unlock(path->nodes[0]); in __push_leaf_right()
3716 free_extent_buffer(path->nodes[0]); in __push_leaf_right()
3717 path->nodes[0] = right; in __push_leaf_right()
3718 path->slots[1] += 1; in __push_leaf_right()
3742 *root, struct btrfs_path *path, in push_leaf_right() argument
3746 struct extent_buffer *left = path->nodes[0]; in push_leaf_right()
3754 if (!path->nodes[1]) in push_leaf_right()
3757 slot = path->slots[1]; in push_leaf_right()
3758 upper = path->nodes[1]; in push_leaf_right()
3762 btrfs_assert_tree_locked(path->nodes[1]); in push_leaf_right()
3789 if (path->slots[0] == left_nritems && !empty) { in push_leaf_right()
3796 path->nodes[0] = right; in push_leaf_right()
3797 path->slots[0] = 0; in push_leaf_right()
3798 path->slots[1]++; in push_leaf_right()
3802 return __push_leaf_right(trans, root, path, min_data_size, empty, in push_leaf_right()
3820 struct btrfs_path *path, int data_size, in __push_leaf_left() argument
3826 struct extent_buffer *right = path->nodes[0]; in __push_leaf_left()
3849 if (path->slots[0] < i) in __push_leaf_left()
3851 if (path->slots[0] == i) { in __push_leaf_left()
3858 if (path->slots[0] == i) in __push_leaf_left()
3941 fixup_low_keys(root->fs_info, path, &disk_key, 1); in __push_leaf_left()
3944 if (path->slots[0] < push_items) { in __push_leaf_left()
3945 path->slots[0] += old_left_nritems; in __push_leaf_left()
3946 btrfs_tree_unlock(path->nodes[0]); in __push_leaf_left()
3947 free_extent_buffer(path->nodes[0]); in __push_leaf_left()
3948 path->nodes[0] = left; in __push_leaf_left()
3949 path->slots[1] -= 1; in __push_leaf_left()
3953 path->slots[0] -= push_items; in __push_leaf_left()
3955 BUG_ON(path->slots[0] < 0); in __push_leaf_left()
3972 *root, struct btrfs_path *path, int min_data_size, in push_leaf_left() argument
3975 struct extent_buffer *right = path->nodes[0]; in push_leaf_left()
3982 slot = path->slots[1]; in push_leaf_left()
3985 if (!path->nodes[1]) in push_leaf_left()
3992 btrfs_assert_tree_locked(path->nodes[1]); in push_leaf_left()
3994 left = read_node_slot(root, path->nodes[1], slot - 1); in push_leaf_left()
4009 path->nodes[1], slot - 1, &left); in push_leaf_left()
4023 return __push_leaf_left(trans, root, path, min_data_size, in push_leaf_left()
4038 struct btrfs_path *path, in copy_for_split() argument
4078 insert_ptr(trans, root, path, &disk_key, right->start, in copy_for_split()
4079 path->slots[1] + 1, 1); in copy_for_split()
4083 BUG_ON(path->slots[0] != slot); in copy_for_split()
4086 btrfs_tree_unlock(path->nodes[0]); in copy_for_split()
4087 free_extent_buffer(path->nodes[0]); in copy_for_split()
4088 path->nodes[0] = right; in copy_for_split()
4089 path->slots[0] -= mid; in copy_for_split()
4090 path->slots[1] += 1; in copy_for_split()
4096 BUG_ON(path->slots[0] < 0); in copy_for_split()
4111 struct btrfs_path *path, in push_for_double_split() argument
4120 slot = path->slots[0]; in push_for_double_split()
4121 if (slot < btrfs_header_nritems(path->nodes[0])) in push_for_double_split()
4122 space_needed -= btrfs_leaf_free_space(root, path->nodes[0]); in push_for_double_split()
4128 ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
4135 nritems = btrfs_header_nritems(path->nodes[0]); in push_for_double_split()
4140 if (path->slots[0] == 0 || path->slots[0] == nritems) in push_for_double_split()
4143 if (btrfs_leaf_free_space(root, path->nodes[0]) >= data_size) in push_for_double_split()
4147 slot = path->slots[0]; in push_for_double_split()
4148 ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
4169 struct btrfs_path *path, int data_size, in split_leaf() argument
4185 l = path->nodes[0]; in split_leaf()
4186 slot = path->slots[0]; in split_leaf()
4192 if (data_size && path->nodes[1]) { in split_leaf()
4198 wret = push_leaf_right(trans, root, path, space_needed, in split_leaf()
4203 wret = push_leaf_left(trans, root, path, space_needed, in split_leaf()
4208 l = path->nodes[0]; in split_leaf()
4215 if (!path->nodes[1]) { in split_leaf()
4216 ret = insert_new_root(trans, root, path, 1); in split_leaf()
4222 l = path->nodes[0]; in split_leaf()
4223 slot = path->slots[0]; in split_leaf()
4292 insert_ptr(trans, root, path, &disk_key, right->start, in split_leaf()
4293 path->slots[1] + 1, 1); in split_leaf()
4294 btrfs_tree_unlock(path->nodes[0]); in split_leaf()
4295 free_extent_buffer(path->nodes[0]); in split_leaf()
4296 path->nodes[0] = right; in split_leaf()
4297 path->slots[0] = 0; in split_leaf()
4298 path->slots[1] += 1; in split_leaf()
4301 insert_ptr(trans, root, path, &disk_key, right->start, in split_leaf()
4302 path->slots[1], 1); in split_leaf()
4303 btrfs_tree_unlock(path->nodes[0]); in split_leaf()
4304 free_extent_buffer(path->nodes[0]); in split_leaf()
4305 path->nodes[0] = right; in split_leaf()
4306 path->slots[0] = 0; in split_leaf()
4307 if (path->slots[1] == 0) in split_leaf()
4308 fixup_low_keys(fs_info, path, &disk_key, 1); in split_leaf()
4314 copy_for_split(trans, root, path, l, right, slot, mid, nritems); in split_leaf()
4325 push_for_double_split(trans, root, path, data_size); in split_leaf()
4327 if (btrfs_leaf_free_space(root, path->nodes[0]) >= data_size) in split_leaf()
4334 struct btrfs_path *path, int ins_len) in setup_leaf_for_split() argument
4343 leaf = path->nodes[0]; in setup_leaf_for_split()
4344 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); in setup_leaf_for_split()
4352 item_size = btrfs_item_size_nr(leaf, path->slots[0]); in setup_leaf_for_split()
4354 fi = btrfs_item_ptr(leaf, path->slots[0], in setup_leaf_for_split()
4358 btrfs_release_path(path); in setup_leaf_for_split()
4360 path->keep_locks = 1; in setup_leaf_for_split()
4361 path->search_for_split = 1; in setup_leaf_for_split()
4362 ret = btrfs_search_slot(trans, root, &key, path, 0, 1); in setup_leaf_for_split()
4363 path->search_for_split = 0; in setup_leaf_for_split()
4370 leaf = path->nodes[0]; in setup_leaf_for_split()
4372 if (item_size != btrfs_item_size_nr(leaf, path->slots[0])) in setup_leaf_for_split()
4376 if (btrfs_leaf_free_space(root, path->nodes[0]) >= ins_len) in setup_leaf_for_split()
4380 fi = btrfs_item_ptr(leaf, path->slots[0], in setup_leaf_for_split()
4386 btrfs_set_path_blocking(path); in setup_leaf_for_split()
4387 ret = split_leaf(trans, root, &key, path, ins_len, 1); in setup_leaf_for_split()
4391 path->keep_locks = 0; in setup_leaf_for_split()
4392 btrfs_unlock_up_safe(path, 1); in setup_leaf_for_split()
4395 path->keep_locks = 0; in setup_leaf_for_split()
4401 struct btrfs_path *path, in split_item() argument
4415 leaf = path->nodes[0]; in split_item()
4418 btrfs_set_path_blocking(path); in split_item()
4420 item = btrfs_item_nr(path->slots[0]); in split_item()
4429 path->slots[0]), item_size); in split_item()
4431 slot = path->slots[0] + 1; in split_item()
4456 btrfs_item_ptr_offset(leaf, path->slots[0]), in split_item()
4487 struct btrfs_path *path, in btrfs_split_item() argument
4492 ret = setup_leaf_for_split(trans, root, path, in btrfs_split_item()
4497 ret = split_item(trans, root, path, new_key, split_offset); in btrfs_split_item()
4511 struct btrfs_path *path, in btrfs_duplicate_item() argument
4518 leaf = path->nodes[0]; in btrfs_duplicate_item()
4519 item_size = btrfs_item_size_nr(leaf, path->slots[0]); in btrfs_duplicate_item()
4520 ret = setup_leaf_for_split(trans, root, path, in btrfs_duplicate_item()
4525 path->slots[0]++; in btrfs_duplicate_item()
4526 setup_items_for_insert(root, path, new_key, &item_size, in btrfs_duplicate_item()
4529 leaf = path->nodes[0]; in btrfs_duplicate_item()
4531 btrfs_item_ptr_offset(leaf, path->slots[0]), in btrfs_duplicate_item()
4532 btrfs_item_ptr_offset(leaf, path->slots[0] - 1), in btrfs_duplicate_item()
4543 void btrfs_truncate_item(struct btrfs_root *root, struct btrfs_path *path, in btrfs_truncate_item() argument
4559 leaf = path->nodes[0]; in btrfs_truncate_item()
4560 slot = path->slots[0]; in btrfs_truncate_item()
4626 fixup_low_keys(root->fs_info, path, &disk_key, 1); in btrfs_truncate_item()
4642 void btrfs_extend_item(struct btrfs_root *root, struct btrfs_path *path, in btrfs_extend_item() argument
4657 leaf = path->nodes[0]; in btrfs_extend_item()
4666 slot = path->slots[0]; in btrfs_extend_item()
4712 void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path, in setup_items_for_insert() argument
4725 if (path->slots[0] == 0) { in setup_items_for_insert()
4727 fixup_low_keys(root->fs_info, path, &disk_key, 1); in setup_items_for_insert()
4729 btrfs_unlock_up_safe(path, 1); in setup_items_for_insert()
4733 leaf = path->nodes[0]; in setup_items_for_insert()
4734 slot = path->slots[0]; in setup_items_for_insert()
4805 struct btrfs_path *path, in btrfs_insert_empty_items() argument
4819 ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1); in btrfs_insert_empty_items()
4825 slot = path->slots[0]; in btrfs_insert_empty_items()
4828 setup_items_for_insert(root, path, cpu_key, data_size, in btrfs_insert_empty_items()
4842 struct btrfs_path *path; in btrfs_insert_item() local
4846 path = btrfs_alloc_path(); in btrfs_insert_item()
4847 if (!path) in btrfs_insert_item()
4849 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size); in btrfs_insert_item()
4851 leaf = path->nodes[0]; in btrfs_insert_item()
4852 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); in btrfs_insert_item()
4856 btrfs_free_path(path); in btrfs_insert_item()
4866 static void del_ptr(struct btrfs_root *root, struct btrfs_path *path, in del_ptr() argument
4869 struct extent_buffer *parent = path->nodes[level]; in del_ptr()
4899 fixup_low_keys(root->fs_info, path, &disk_key, level + 1); in del_ptr()
4916 struct btrfs_path *path, in btrfs_del_leaf() argument
4920 del_ptr(root, path, 1, path->slots[1]); in btrfs_del_leaf()
4926 btrfs_unlock_up_safe(path, 0); in btrfs_del_leaf()
4939 struct btrfs_path *path, int slot, int nr) in btrfs_del_items() argument
4953 leaf = path->nodes[0]; in btrfs_del_items()
4991 btrfs_set_path_blocking(path); in btrfs_del_items()
4993 btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
5001 fixup_low_keys(root->fs_info, path, &disk_key, 1); in btrfs_del_items()
5010 slot = path->slots[1]; in btrfs_del_items()
5013 btrfs_set_path_blocking(path); in btrfs_del_items()
5014 wret = push_leaf_left(trans, root, path, 1, 1, in btrfs_del_items()
5019 if (path->nodes[0] == leaf && in btrfs_del_items()
5021 wret = push_leaf_right(trans, root, path, 1, in btrfs_del_items()
5028 path->slots[1] = slot; in btrfs_del_items()
5029 btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
5038 if (path->nodes[0] == leaf) in btrfs_del_items()
5057 int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) in btrfs_prev_leaf() argument
5063 btrfs_item_key_to_cpu(path->nodes[0], &key, 0); in btrfs_prev_leaf()
5078 btrfs_release_path(path); in btrfs_prev_leaf()
5079 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_prev_leaf()
5082 btrfs_item_key(path->nodes[0], &found_key, 0); in btrfs_prev_leaf()
5122 struct btrfs_path *path, in btrfs_search_forward() argument
5132 int keep_locks = path->keep_locks; in btrfs_search_forward()
5134 path->keep_locks = 1; in btrfs_search_forward()
5138 WARN_ON(path->nodes[level]); in btrfs_search_forward()
5139 path->nodes[level] = cur; in btrfs_search_forward()
5140 path->locks[level] = BTRFS_READ_LOCK; in btrfs_search_forward()
5152 if (level == path->lowest_level) { in btrfs_search_forward()
5156 path->slots[level] = slot; in btrfs_search_forward()
5182 path->slots[level] = slot; in btrfs_search_forward()
5183 btrfs_set_path_blocking(path); in btrfs_search_forward()
5184 sret = btrfs_find_next_key(root, path, min_key, level, in btrfs_search_forward()
5187 btrfs_release_path(path); in btrfs_search_forward()
5195 path->slots[level] = slot; in btrfs_search_forward()
5196 if (level == path->lowest_level) { in btrfs_search_forward()
5200 btrfs_set_path_blocking(path); in btrfs_search_forward()
5206 path->locks[level - 1] = BTRFS_READ_LOCK; in btrfs_search_forward()
5207 path->nodes[level - 1] = cur; in btrfs_search_forward()
5208 unlock_up(path, level, 1, 0, NULL); in btrfs_search_forward()
5209 btrfs_clear_path_blocking(path, NULL, 0); in btrfs_search_forward()
5212 path->keep_locks = keep_locks; in btrfs_search_forward()
5214 btrfs_unlock_up_safe(path, path->lowest_level + 1); in btrfs_search_forward()
5215 btrfs_set_path_blocking(path); in btrfs_search_forward()
5222 struct btrfs_path *path, in tree_move_down() argument
5226 path->nodes[*level - 1] = read_node_slot(root, path->nodes[*level], in tree_move_down()
5227 path->slots[*level]); in tree_move_down()
5228 path->slots[*level - 1] = 0; in tree_move_down()
5233 struct btrfs_path *path, in tree_move_next_or_upnext() argument
5238 nritems = btrfs_header_nritems(path->nodes[*level]); in tree_move_next_or_upnext()
5240 path->slots[*level]++; in tree_move_next_or_upnext()
5242 while (path->slots[*level] >= nritems) { in tree_move_next_or_upnext()
5247 path->slots[*level] = 0; in tree_move_next_or_upnext()
5248 free_extent_buffer(path->nodes[*level]); in tree_move_next_or_upnext()
5249 path->nodes[*level] = NULL; in tree_move_next_or_upnext()
5251 path->slots[*level]++; in tree_move_next_or_upnext()
5253 nritems = btrfs_header_nritems(path->nodes[*level]); in tree_move_next_or_upnext()
5264 struct btrfs_path *path, in tree_advance() argument
5272 ret = tree_move_next_or_upnext(root, path, level, root_level); in tree_advance()
5274 tree_move_down(root, path, level, root_level); in tree_advance()
5279 btrfs_item_key_to_cpu(path->nodes[*level], key, in tree_advance()
5280 path->slots[*level]); in tree_advance()
5282 btrfs_node_key_to_cpu(path->nodes[*level], key, in tree_advance()
5283 path->slots[*level]); in tree_advance()
5584 int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, in btrfs_find_next_key() argument
5590 WARN_ON(!path->keep_locks); in btrfs_find_next_key()
5592 if (!path->nodes[level]) in btrfs_find_next_key()
5595 slot = path->slots[level] + 1; in btrfs_find_next_key()
5596 c = path->nodes[level]; in btrfs_find_next_key()
5603 !path->nodes[level + 1]) in btrfs_find_next_key()
5606 if (path->locks[level + 1]) { in btrfs_find_next_key()
5617 orig_lowest = path->lowest_level; in btrfs_find_next_key()
5618 btrfs_release_path(path); in btrfs_find_next_key()
5619 path->lowest_level = level; in btrfs_find_next_key()
5620 ret = btrfs_search_slot(NULL, root, &cur_key, path, in btrfs_find_next_key()
5622 path->lowest_level = orig_lowest; in btrfs_find_next_key()
5626 c = path->nodes[level]; in btrfs_find_next_key()
5627 slot = path->slots[level]; in btrfs_find_next_key()
5654 int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path) in btrfs_next_leaf() argument
5656 return btrfs_next_old_leaf(root, path, 0); in btrfs_next_leaf()
5659 int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path, in btrfs_next_old_leaf() argument
5669 int old_spinning = path->leave_spinning; in btrfs_next_old_leaf()
5672 nritems = btrfs_header_nritems(path->nodes[0]); in btrfs_next_old_leaf()
5676 btrfs_item_key_to_cpu(path->nodes[0], &key, nritems - 1); in btrfs_next_old_leaf()
5681 btrfs_release_path(path); in btrfs_next_old_leaf()
5683 path->keep_locks = 1; in btrfs_next_old_leaf()
5684 path->leave_spinning = 1; in btrfs_next_old_leaf()
5687 ret = btrfs_search_old_slot(root, &key, path, time_seq); in btrfs_next_old_leaf()
5689 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_next_old_leaf()
5690 path->keep_locks = 0; in btrfs_next_old_leaf()
5695 nritems = btrfs_header_nritems(path->nodes[0]); in btrfs_next_old_leaf()
5702 if (nritems > 0 && path->slots[0] < nritems - 1) { in btrfs_next_old_leaf()
5704 path->slots[0]++; in btrfs_next_old_leaf()
5722 if (nritems > 0 && ret > 0 && path->slots[0] == nritems - 1) { in btrfs_next_old_leaf()
5728 if (!path->nodes[level]) { in btrfs_next_old_leaf()
5733 slot = path->slots[level] + 1; in btrfs_next_old_leaf()
5734 c = path->nodes[level]; in btrfs_next_old_leaf()
5750 next_rw_lock = path->locks[level]; in btrfs_next_old_leaf()
5751 ret = read_block_for_search(NULL, root, path, &next, level, in btrfs_next_old_leaf()
5757 btrfs_release_path(path); in btrfs_next_old_leaf()
5761 if (!path->skip_locking) { in btrfs_next_old_leaf()
5772 btrfs_release_path(path); in btrfs_next_old_leaf()
5777 btrfs_set_path_blocking(path); in btrfs_next_old_leaf()
5779 btrfs_clear_path_blocking(path, next, in btrfs_next_old_leaf()
5786 path->slots[level] = slot; in btrfs_next_old_leaf()
5789 c = path->nodes[level]; in btrfs_next_old_leaf()
5790 if (path->locks[level]) in btrfs_next_old_leaf()
5791 btrfs_tree_unlock_rw(c, path->locks[level]); in btrfs_next_old_leaf()
5794 path->nodes[level] = next; in btrfs_next_old_leaf()
5795 path->slots[level] = 0; in btrfs_next_old_leaf()
5796 if (!path->skip_locking) in btrfs_next_old_leaf()
5797 path->locks[level] = next_rw_lock; in btrfs_next_old_leaf()
5801 ret = read_block_for_search(NULL, root, path, &next, level, in btrfs_next_old_leaf()
5807 btrfs_release_path(path); in btrfs_next_old_leaf()
5811 if (!path->skip_locking) { in btrfs_next_old_leaf()
5814 btrfs_set_path_blocking(path); in btrfs_next_old_leaf()
5816 btrfs_clear_path_blocking(path, next, in btrfs_next_old_leaf()
5824 unlock_up(path, 0, 1, 0, NULL); in btrfs_next_old_leaf()
5825 path->leave_spinning = old_spinning; in btrfs_next_old_leaf()
5827 btrfs_set_path_blocking(path); in btrfs_next_old_leaf()
5839 struct btrfs_path *path, u64 min_objectid, in btrfs_previous_item() argument
5848 if (path->slots[0] == 0) { in btrfs_previous_item()
5849 btrfs_set_path_blocking(path); in btrfs_previous_item()
5850 ret = btrfs_prev_leaf(root, path); in btrfs_previous_item()
5854 path->slots[0]--; in btrfs_previous_item()
5856 leaf = path->nodes[0]; in btrfs_previous_item()
5860 if (path->slots[0] == nritems) in btrfs_previous_item()
5861 path->slots[0]--; in btrfs_previous_item()
5863 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); in btrfs_previous_item()
5882 struct btrfs_path *path, u64 min_objectid) in btrfs_previous_extent_item() argument
5890 if (path->slots[0] == 0) { in btrfs_previous_extent_item()
5891 btrfs_set_path_blocking(path); in btrfs_previous_extent_item()
5892 ret = btrfs_prev_leaf(root, path); in btrfs_previous_extent_item()
5896 path->slots[0]--; in btrfs_previous_extent_item()
5898 leaf = path->nodes[0]; in btrfs_previous_extent_item()
5902 if (path->slots[0] == nritems) in btrfs_previous_extent_item()
5903 path->slots[0]--; in btrfs_previous_extent_item()
5905 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); in btrfs_previous_extent_item()