Lines Matching refs:path
30 *root, struct btrfs_path *path, int level);
32 const struct btrfs_key *ins_key, struct btrfs_path *path,
862 struct btrfs_path *path, int level) in balance_level() argument
872 int orig_slot = path->slots[level]; in balance_level()
877 mid = path->nodes[level]; in balance_level()
879 WARN_ON(path->locks[level] != BTRFS_WRITE_LOCK); in balance_level()
885 parent = path->nodes[level + 1]; in balance_level()
886 pslot = path->slots[level + 1]; in balance_level()
927 path->locks[level] = 0; in balance_level()
928 path->nodes[level] = NULL; in balance_level()
1002 ret = btrfs_del_ptr(trans, root, path, level + 1, pslot + 1); in balance_level()
1064 ret = btrfs_del_ptr(trans, root, path, level + 1, pslot); in balance_level()
1097 path->nodes[level] = left; in balance_level()
1098 path->slots[level + 1] -= 1; in balance_level()
1099 path->slots[level] = orig_slot; in balance_level()
1106 path->slots[level] = orig_slot; in balance_level()
1111 btrfs_node_blockptr(path->nodes[level], path->slots[level])) in balance_level()
1119 if (path->nodes[level] != left) in balance_level()
1132 struct btrfs_path *path, int level) in push_nodes_for_insert() argument
1142 int orig_slot = path->slots[level]; in push_nodes_for_insert()
1147 mid = path->nodes[level]; in push_nodes_for_insert()
1151 parent = path->nodes[level + 1]; in push_nodes_for_insert()
1152 pslot = path->slots[level + 1]; in push_nodes_for_insert()
1198 path->nodes[level] = left; in push_nodes_for_insert()
1199 path->slots[level + 1] -= 1; in push_nodes_for_insert()
1200 path->slots[level] = orig_slot; in push_nodes_for_insert()
1206 path->slots[level] = orig_slot; in push_nodes_for_insert()
1259 path->nodes[level] = right; in push_nodes_for_insert()
1260 path->slots[level + 1] += 1; in push_nodes_for_insert()
1261 path->slots[level] = orig_slot - in push_nodes_for_insert()
1282 const struct btrfs_path *path, in reada_for_search() argument
1296 if (level != 1 && path->reada != READA_FORWARD_ALWAYS) in reada_for_search()
1299 if (!path->nodes[level]) in reada_for_search()
1302 node = path->nodes[level]; in reada_for_search()
1309 if (path->reada == READA_FORWARD_ALWAYS) { in reada_for_search()
1320 if (path->reada != READA_FORWARD_ALWAYS) { in reada_for_search()
1336 if (path->reada == READA_BACK) { in reada_for_search()
1340 } else if (path->reada == READA_FORWARD || in reada_for_search()
1341 path->reada == READA_FORWARD_ALWAYS) { in reada_for_search()
1346 if (path->reada == READA_BACK && objectid) { in reada_for_search()
1352 if (path->reada == READA_FORWARD_ALWAYS || in reada_for_search()
1364 static noinline void reada_for_balance(const struct btrfs_path *path, int level) in reada_for_balance() argument
1370 parent = path->nodes[level + 1]; in reada_for_balance()
1375 slot = path->slots[level + 1]; in reada_for_balance()
1397 static noinline void unlock_up(struct btrfs_path *path, int level, in unlock_up() argument
1406 if (!path->nodes[i]) in unlock_up()
1408 if (!path->locks[i]) in unlock_up()
1412 if (path->slots[i] == 0) { in unlock_up()
1417 if (path->keep_locks) { in unlock_up()
1420 nritems = btrfs_header_nritems(path->nodes[i]); in unlock_up()
1421 if (nritems < 1 || path->slots[i] >= nritems - 1) { in unlock_up()
1430 btrfs_tree_unlock_rw(path->nodes[i], path->locks[i]); in unlock_up()
1431 path->locks[i] = 0; in unlock_up()
1654 int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *path, in btrfs_find_item() argument
1662 ASSERT(path); in btrfs_find_item()
1669 ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0); in btrfs_find_item()
1673 eb = path->nodes[0]; in btrfs_find_item()
1674 if (ret && path->slots[0] >= btrfs_header_nritems(eb)) { in btrfs_find_item()
1675 ret = btrfs_next_leaf(fs_root, path); in btrfs_find_item()
1678 eb = path->nodes[0]; in btrfs_find_item()
1681 btrfs_item_key_to_cpu(eb, found_key, path->slots[0]); in btrfs_find_item()
1783 static int finish_need_commit_sem_search(struct btrfs_path *path) in finish_need_commit_sem_search() argument
1785 const int i = path->lowest_level; in finish_need_commit_sem_search()
1786 const int slot = path->slots[i]; in finish_need_commit_sem_search()
1787 struct extent_buffer *lowest = path->nodes[i]; in finish_need_commit_sem_search()
1790 ASSERT(path->need_commit_sem); in finish_need_commit_sem_search()
1801 btrfs_release_path(path); in finish_need_commit_sem_search()
1802 path->nodes[i] = clone; in finish_need_commit_sem_search()
1803 path->slots[i] = slot; in finish_need_commit_sem_search()
1832 struct btrfs_path *path, in search_leaf() argument
1836 struct extent_buffer *leaf = path->nodes[0]; in search_leaf()
1860 if (path->locks[1] && leaf_free_space >= ins_len) { in search_leaf()
1887 btrfs_unlock_up_safe(path, 1); in search_leaf()
1905 btrfs_unlock_up_safe(path, 1); in search_leaf()
1912 path->slots[0] = 0; in search_leaf()
1919 prev_cmp, &path->slots[0]); in search_leaf()
1934 if (ret == 0 && !path->search_for_extension) { in search_leaf()
1944 ret2 = split_leaf(trans, root, key, path, ins_len, (ret == 0)); in search_leaf()
2343 static int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) in btrfs_prev_leaf() argument
2350 btrfs_item_key_to_cpu(path->nodes[0], &key, 0); in btrfs_prev_leaf()
2366 btrfs_release_path(path); in btrfs_prev_leaf()
2367 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_prev_leaf()
2382 if (path->slots[0] < btrfs_header_nritems(path->nodes[0])) { in btrfs_prev_leaf()
2383 btrfs_item_key(path->nodes[0], &found_key, path->slots[0]); in btrfs_prev_leaf()
2386 if (path->slots[0] > 0) { in btrfs_prev_leaf()
2387 path->slots[0]--; in btrfs_prev_leaf()
2398 btrfs_item_key(path->nodes[0], &found_key, 0); in btrfs_prev_leaf()
2499 struct btrfs_path *path) in btrfs_search_backwards() argument
2503 ret = btrfs_search_slot(NULL, root, key, path, 0, 0); in btrfs_search_backwards()
2505 ret = btrfs_previous_item(root, path, key->objectid, key->type); in btrfs_search_backwards()
2508 btrfs_item_key_to_cpu(path->nodes[0], key, path->slots[0]); in btrfs_search_backwards()
2525 struct btrfs_path *path) in btrfs_get_next_valid_item() argument
2527 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { in btrfs_get_next_valid_item()
2530 ret = btrfs_next_leaf(root, path); in btrfs_get_next_valid_item()
2535 btrfs_item_key_to_cpu(path->nodes[0], key, path->slots[0]); in btrfs_get_next_valid_item()
2548 const struct btrfs_path *path, in fixup_low_keys() argument
2556 int tslot = path->slots[i]; in fixup_low_keys()
2558 if (!path->nodes[i]) in fixup_low_keys()
2560 t = path->nodes[i]; in fixup_low_keys()
2565 btrfs_mark_buffer_dirty(trans, path->nodes[i]); in fixup_low_keys()
2578 const struct btrfs_path *path, in btrfs_set_item_key_safe() argument
2586 eb = path->nodes[0]; in btrfs_set_item_key_safe()
2587 slot = path->slots[0]; in btrfs_set_item_key_safe()
2621 fixup_low_keys(trans, path, &disk_key, 1); in btrfs_set_item_key_safe()
2843 struct btrfs_path *path, int level) in insert_new_root() argument
2852 BUG_ON(path->nodes[level]); in insert_new_root()
2853 BUG_ON(path->nodes[level-1] != root->node); in insert_new_root()
2855 lower = path->nodes[level-1]; in insert_new_root()
2899 path->nodes[level] = c; in insert_new_root()
2900 path->locks[level] = BTRFS_WRITE_LOCK; in insert_new_root()
2901 path->slots[level] = 0; in insert_new_root()
2913 const struct btrfs_path *path, in insert_ptr() argument
2921 BUG_ON(!path->nodes[level]); in insert_ptr()
2922 btrfs_assert_tree_write_locked(path->nodes[level]); in insert_ptr()
2923 lower = path->nodes[level]; in insert_ptr()
2970 struct btrfs_path *path, int level) in split_node() argument
2980 c = path->nodes[level]; in split_node()
2993 ret = insert_new_root(trans, root, path, level + 1); in split_node()
2997 ret = push_nodes_for_insert(trans, root, path, level); in split_node()
2998 c = path->nodes[level]; in split_node()
3036 ret = insert_ptr(trans, path, &disk_key, split->start, in split_node()
3037 path->slots[level + 1] + 1, level + 1); in split_node()
3044 if (path->slots[level] >= mid) { in split_node()
3045 path->slots[level] -= mid; in split_node()
3048 path->nodes[level] = split; in split_node()
3049 path->slots[level + 1] += 1; in split_node()
3104 struct btrfs_path *path, in __push_leaf_right() argument
3111 struct extent_buffer *left = path->nodes[0]; in __push_leaf_right()
3112 struct extent_buffer *upper = path->nodes[1]; in __push_leaf_right()
3128 if (path->slots[0] >= left_nritems) in __push_leaf_right()
3131 slot = path->slots[1]; in __push_leaf_right()
3135 if (path->slots[0] > i) in __push_leaf_right()
3137 if (path->slots[0] == i) { in __push_leaf_right()
3145 if (path->slots[0] == i) in __push_leaf_right()
3209 if (path->slots[0] >= left_nritems) { in __push_leaf_right()
3210 path->slots[0] -= left_nritems; in __push_leaf_right()
3211 if (btrfs_header_nritems(path->nodes[0]) == 0) in __push_leaf_right()
3212 btrfs_clear_buffer_dirty(trans, path->nodes[0]); in __push_leaf_right()
3213 btrfs_tree_unlock(path->nodes[0]); in __push_leaf_right()
3214 free_extent_buffer(path->nodes[0]); in __push_leaf_right()
3215 path->nodes[0] = right; in __push_leaf_right()
3216 path->slots[1] += 1; in __push_leaf_right()
3240 *root, struct btrfs_path *path, in push_leaf_right() argument
3244 struct extent_buffer *left = path->nodes[0]; in push_leaf_right()
3252 if (!path->nodes[1]) in push_leaf_right()
3255 slot = path->slots[1]; in push_leaf_right()
3256 upper = path->nodes[1]; in push_leaf_right()
3260 btrfs_assert_tree_write_locked(path->nodes[1]); in push_leaf_right()
3288 if (path->slots[0] == left_nritems && !empty) { in push_leaf_right()
3295 path->nodes[0] = right; in push_leaf_right()
3296 path->slots[0] = 0; in push_leaf_right()
3297 path->slots[1]++; in push_leaf_right()
3301 return __push_leaf_right(trans, path, min_data_size, empty, right, in push_leaf_right()
3318 struct btrfs_path *path, int data_size, in __push_leaf_left() argument
3325 struct extent_buffer *right = path->nodes[0]; in __push_leaf_left()
3342 if (path->slots[0] < i) in __push_leaf_left()
3344 if (path->slots[0] == i) { in __push_leaf_left()
3352 if (path->slots[0] == i) in __push_leaf_left()
3422 fixup_low_keys(trans, path, &disk_key, 1); in __push_leaf_left()
3425 if (path->slots[0] < push_items) { in __push_leaf_left()
3426 path->slots[0] += old_left_nritems; in __push_leaf_left()
3427 btrfs_tree_unlock(path->nodes[0]); in __push_leaf_left()
3428 free_extent_buffer(path->nodes[0]); in __push_leaf_left()
3429 path->nodes[0] = left; in __push_leaf_left()
3430 path->slots[1] -= 1; in __push_leaf_left()
3434 path->slots[0] -= push_items; in __push_leaf_left()
3436 BUG_ON(path->slots[0] < 0); in __push_leaf_left()
3453 *root, struct btrfs_path *path, int min_data_size, in push_leaf_left() argument
3456 struct extent_buffer *right = path->nodes[0]; in push_leaf_left()
3463 slot = path->slots[1]; in push_leaf_left()
3466 if (!path->nodes[1]) in push_leaf_left()
3473 btrfs_assert_tree_write_locked(path->nodes[1]); in push_leaf_left()
3475 left = btrfs_read_node_slot(path->nodes[1], slot - 1); in push_leaf_left()
3488 path->nodes[1], slot - 1, &left, in push_leaf_left()
3502 return __push_leaf_left(trans, path, min_data_size, empty, left, in push_leaf_left()
3515 struct btrfs_path *path, in copy_for_split() argument
3547 ret = insert_ptr(trans, path, &disk_key, right->start, path->slots[1] + 1, 1); in copy_for_split()
3553 BUG_ON(path->slots[0] != slot); in copy_for_split()
3556 btrfs_tree_unlock(path->nodes[0]); in copy_for_split()
3557 free_extent_buffer(path->nodes[0]); in copy_for_split()
3558 path->nodes[0] = right; in copy_for_split()
3559 path->slots[0] -= mid; in copy_for_split()
3560 path->slots[1] += 1; in copy_for_split()
3566 BUG_ON(path->slots[0] < 0); in copy_for_split()
3583 struct btrfs_path *path, in push_for_double_split() argument
3592 slot = path->slots[0]; in push_for_double_split()
3593 if (slot < btrfs_header_nritems(path->nodes[0])) in push_for_double_split()
3594 space_needed -= btrfs_leaf_free_space(path->nodes[0]); in push_for_double_split()
3600 ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3607 nritems = btrfs_header_nritems(path->nodes[0]); in push_for_double_split()
3612 if (path->slots[0] == 0 || path->slots[0] == nritems) in push_for_double_split()
3615 if (btrfs_leaf_free_space(path->nodes[0]) >= data_size) in push_for_double_split()
3619 slot = path->slots[0]; in push_for_double_split()
3622 space_needed -= btrfs_leaf_free_space(path->nodes[0]); in push_for_double_split()
3623 ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3644 struct btrfs_path *path, int data_size, in split_leaf() argument
3660 l = path->nodes[0]; in split_leaf()
3661 slot = path->slots[0]; in split_leaf()
3667 if (data_size && path->nodes[1]) { in split_leaf()
3673 wret = push_leaf_right(trans, root, path, space_needed, in split_leaf()
3681 wret = push_leaf_left(trans, root, path, space_needed, in split_leaf()
3686 l = path->nodes[0]; in split_leaf()
3693 if (!path->nodes[1]) { in split_leaf()
3694 ret = insert_new_root(trans, root, path, 1); in split_leaf()
3700 l = path->nodes[0]; in split_leaf()
3701 slot = path->slots[0]; in split_leaf()
3767 ret = insert_ptr(trans, path, &disk_key, in split_leaf()
3768 right->start, path->slots[1] + 1, 1); in split_leaf()
3774 btrfs_tree_unlock(path->nodes[0]); in split_leaf()
3775 free_extent_buffer(path->nodes[0]); in split_leaf()
3776 path->nodes[0] = right; in split_leaf()
3777 path->slots[0] = 0; in split_leaf()
3778 path->slots[1] += 1; in split_leaf()
3781 ret = insert_ptr(trans, path, &disk_key, in split_leaf()
3782 right->start, path->slots[1], 1); in split_leaf()
3788 btrfs_tree_unlock(path->nodes[0]); in split_leaf()
3789 free_extent_buffer(path->nodes[0]); in split_leaf()
3790 path->nodes[0] = right; in split_leaf()
3791 path->slots[0] = 0; in split_leaf()
3792 if (path->slots[1] == 0) in split_leaf()
3793 fixup_low_keys(trans, path, &disk_key, 1); in split_leaf()
3803 ret = copy_for_split(trans, path, l, right, slot, mid, nritems); in split_leaf()
3819 push_for_double_split(trans, root, path, data_size); in split_leaf()
3821 if (btrfs_leaf_free_space(path->nodes[0]) >= data_size) in split_leaf()
3828 struct btrfs_path *path, int ins_len) in setup_leaf_for_split() argument
3837 leaf = path->nodes[0]; in setup_leaf_for_split()
3838 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); in setup_leaf_for_split()
3847 item_size = btrfs_item_size(leaf, path->slots[0]); in setup_leaf_for_split()
3849 fi = btrfs_item_ptr(leaf, path->slots[0], in setup_leaf_for_split()
3853 btrfs_release_path(path); in setup_leaf_for_split()
3855 path->keep_locks = 1; in setup_leaf_for_split()
3856 path->search_for_split = 1; in setup_leaf_for_split()
3857 ret = btrfs_search_slot(trans, root, &key, path, 0, 1); in setup_leaf_for_split()
3858 path->search_for_split = 0; in setup_leaf_for_split()
3865 leaf = path->nodes[0]; in setup_leaf_for_split()
3867 if (item_size != btrfs_item_size(leaf, path->slots[0])) in setup_leaf_for_split()
3871 if (btrfs_leaf_free_space(path->nodes[0]) >= ins_len) in setup_leaf_for_split()
3875 fi = btrfs_item_ptr(leaf, path->slots[0], in setup_leaf_for_split()
3881 ret = split_leaf(trans, root, &key, path, ins_len, 1); in setup_leaf_for_split()
3885 path->keep_locks = 0; in setup_leaf_for_split()
3886 btrfs_unlock_up_safe(path, 1); in setup_leaf_for_split()
3889 path->keep_locks = 0; in setup_leaf_for_split()
3894 struct btrfs_path *path, in split_item() argument
3906 leaf = path->nodes[0]; in split_item()
3914 orig_slot = path->slots[0]; in split_item()
3915 orig_offset = btrfs_item_offset(leaf, path->slots[0]); in split_item()
3916 item_size = btrfs_item_size(leaf, path->slots[0]); in split_item()
3923 path->slots[0]), item_size); in split_item()
3925 slot = path->slots[0] + 1; in split_item()
3946 btrfs_item_ptr_offset(leaf, path->slots[0]), in split_item()
3977 struct btrfs_path *path, in btrfs_split_item() argument
3982 ret = setup_leaf_for_split(trans, root, path, in btrfs_split_item()
3987 ret = split_item(trans, path, new_key, split_offset); in btrfs_split_item()
3998 const struct btrfs_path *path, u32 new_size, int from_end) in btrfs_truncate_item() argument
4009 leaf = path->nodes[0]; in btrfs_truncate_item()
4010 slot = path->slots[0]; in btrfs_truncate_item()
4072 fixup_low_keys(trans, path, &disk_key, 1); in btrfs_truncate_item()
4088 const struct btrfs_path *path, u32 data_size) in btrfs_extend_item() argument
4098 leaf = path->nodes[0]; in btrfs_extend_item()
4107 slot = path->slots[0]; in btrfs_extend_item()
4156 struct btrfs_root *root, struct btrfs_path *path, in setup_items_for_insert() argument
4173 if (path->slots[0] == 0) { in setup_items_for_insert()
4175 fixup_low_keys(trans, path, &disk_key, 1); in setup_items_for_insert()
4177 btrfs_unlock_up_safe(path, 1); in setup_items_for_insert()
4179 leaf = path->nodes[0]; in setup_items_for_insert()
4180 slot = path->slots[0]; in setup_items_for_insert()
4252 struct btrfs_path *path, in btrfs_setup_item_for_insert() argument
4263 setup_items_for_insert(trans, root, path, &batch); in btrfs_setup_item_for_insert()
4276 struct btrfs_path *path, in btrfs_insert_empty_items() argument
4284 ret = btrfs_search_slot(trans, root, &batch->keys[0], path, total_size, 1); in btrfs_insert_empty_items()
4290 slot = path->slots[0]; in btrfs_insert_empty_items()
4293 setup_items_for_insert(trans, root, path, batch); in btrfs_insert_empty_items()
4306 BTRFS_PATH_AUTO_FREE(path); in btrfs_insert_item()
4310 path = btrfs_alloc_path(); in btrfs_insert_item()
4311 if (!path) in btrfs_insert_item()
4313 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size); in btrfs_insert_item()
4315 leaf = path->nodes[0]; in btrfs_insert_item()
4316 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); in btrfs_insert_item()
4333 struct btrfs_path *path, in btrfs_duplicate_item() argument
4340 leaf = path->nodes[0]; in btrfs_duplicate_item()
4341 item_size = btrfs_item_size(leaf, path->slots[0]); in btrfs_duplicate_item()
4342 ret = setup_leaf_for_split(trans, root, path, in btrfs_duplicate_item()
4347 path->slots[0]++; in btrfs_duplicate_item()
4348 btrfs_setup_item_for_insert(trans, root, path, new_key, item_size); in btrfs_duplicate_item()
4349 leaf = path->nodes[0]; in btrfs_duplicate_item()
4351 btrfs_item_ptr_offset(leaf, path->slots[0]), in btrfs_duplicate_item()
4352 btrfs_item_ptr_offset(leaf, path->slots[0] - 1), in btrfs_duplicate_item()
4366 struct btrfs_path *path, int level, int slot) in btrfs_del_ptr() argument
4368 struct extent_buffer *parent = path->nodes[level]; in btrfs_del_ptr()
4406 fixup_low_keys(trans, path, &disk_key, level + 1); in btrfs_del_ptr()
4424 struct btrfs_path *path, in btrfs_del_leaf() argument
4430 ret = btrfs_del_ptr(trans, root, path, 1, path->slots[1]); in btrfs_del_leaf()
4438 btrfs_unlock_up_safe(path, 0); in btrfs_del_leaf()
4455 struct btrfs_path *path, int slot, int nr) in btrfs_del_items() argument
4463 leaf = path->nodes[0]; in btrfs_del_items()
4496 ret = btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4506 fixup_low_keys(trans, path, &disk_key, 1); in btrfs_del_items()
4524 slot = path->slots[1]; in btrfs_del_items()
4532 wret = push_leaf_left(trans, root, path, 0, in btrfs_del_items()
4537 if (path->nodes[0] == leaf && in btrfs_del_items()
4551 wret = push_leaf_right(trans, root, path, 0, in btrfs_del_items()
4558 path->slots[1] = slot; in btrfs_del_items()
4559 ret = btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4570 if (path->nodes[0] == leaf) in btrfs_del_items()
4598 struct btrfs_path *path, in btrfs_search_forward() argument
4607 int keep_locks = path->keep_locks; in btrfs_search_forward()
4609 ASSERT(!path->nowait); in btrfs_search_forward()
4610 ASSERT(path->lowest_level == 0); in btrfs_search_forward()
4611 path->keep_locks = 1; in btrfs_search_forward()
4615 WARN_ON(path->nodes[level]); in btrfs_search_forward()
4616 path->nodes[level] = cur; in btrfs_search_forward()
4617 path->locks[level] = BTRFS_READ_LOCK; in btrfs_search_forward()
4637 path->slots[level] = slot; in btrfs_search_forward()
4663 path->slots[level] = slot; in btrfs_search_forward()
4665 sret = btrfs_find_next_key(root, path, min_key, level, in btrfs_search_forward()
4668 btrfs_release_path(path); in btrfs_search_forward()
4682 path->locks[level - 1] = BTRFS_READ_LOCK; in btrfs_search_forward()
4683 path->nodes[level - 1] = cur; in btrfs_search_forward()
4684 unlock_up(path, level, 1, 0, NULL); in btrfs_search_forward()
4687 path->keep_locks = keep_locks; in btrfs_search_forward()
4689 btrfs_unlock_up_safe(path, 1); in btrfs_search_forward()
4704 int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, in btrfs_find_next_key() argument
4710 WARN_ON(!path->keep_locks && !path->skip_locking); in btrfs_find_next_key()
4712 if (!path->nodes[level]) in btrfs_find_next_key()
4715 slot = path->slots[level] + 1; in btrfs_find_next_key()
4716 c = path->nodes[level]; in btrfs_find_next_key()
4723 !path->nodes[level + 1]) in btrfs_find_next_key()
4726 if (path->locks[level + 1] || path->skip_locking) { in btrfs_find_next_key()
4737 orig_lowest = path->lowest_level; in btrfs_find_next_key()
4738 btrfs_release_path(path); in btrfs_find_next_key()
4739 path->lowest_level = level; in btrfs_find_next_key()
4740 ret = btrfs_search_slot(NULL, root, &cur_key, path, in btrfs_find_next_key()
4742 path->lowest_level = orig_lowest; in btrfs_find_next_key()
4746 c = path->nodes[level]; in btrfs_find_next_key()
4747 slot = path->slots[level]; in btrfs_find_next_key()
4769 int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path, in btrfs_next_old_leaf() argument
4788 ASSERT(!path->nowait); in btrfs_next_old_leaf()
4790 nritems = btrfs_header_nritems(path->nodes[0]); in btrfs_next_old_leaf()
4794 btrfs_item_key_to_cpu(path->nodes[0], &key, nritems - 1); in btrfs_next_old_leaf()
4798 btrfs_release_path(path); in btrfs_next_old_leaf()
4800 path->keep_locks = 1; in btrfs_next_old_leaf()
4803 ret = btrfs_search_old_slot(root, &key, path, time_seq); in btrfs_next_old_leaf()
4805 if (path->need_commit_sem) { in btrfs_next_old_leaf()
4806 path->need_commit_sem = 0; in btrfs_next_old_leaf()
4808 if (path->nowait) { in btrfs_next_old_leaf()
4817 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_next_old_leaf()
4819 path->keep_locks = 0; in btrfs_next_old_leaf()
4824 nritems = btrfs_header_nritems(path->nodes[0]); in btrfs_next_old_leaf()
4831 if (nritems > 0 && path->slots[0] < nritems - 1) { in btrfs_next_old_leaf()
4833 path->slots[0]++; in btrfs_next_old_leaf()
4851 if (nritems > 0 && ret > 0 && path->slots[0] == nritems - 1) { in btrfs_next_old_leaf()
4857 if (!path->nodes[level]) { in btrfs_next_old_leaf()
4862 slot = path->slots[level] + 1; in btrfs_next_old_leaf()
4863 c = path->nodes[level]; in btrfs_next_old_leaf()
4880 if (path->locks[level]) { in btrfs_next_old_leaf()
4881 btrfs_tree_read_unlock(path->nodes[i]); in btrfs_next_old_leaf()
4882 path->locks[i] = 0; in btrfs_next_old_leaf()
4884 free_extent_buffer(path->nodes[i]); in btrfs_next_old_leaf()
4885 path->nodes[i] = NULL; in btrfs_next_old_leaf()
4889 ret = read_block_for_search(root, path, &next, slot, &key); in btrfs_next_old_leaf()
4890 if (ret == -EAGAIN && !path->nowait) in btrfs_next_old_leaf()
4894 btrfs_release_path(path); in btrfs_next_old_leaf()
4898 if (!path->skip_locking) { in btrfs_next_old_leaf()
4900 if (!ret && path->nowait) { in btrfs_next_old_leaf()
4913 btrfs_release_path(path); in btrfs_next_old_leaf()
4922 path->slots[level] = slot; in btrfs_next_old_leaf()
4925 path->nodes[level] = next; in btrfs_next_old_leaf()
4926 path->slots[level] = 0; in btrfs_next_old_leaf()
4927 if (!path->skip_locking) in btrfs_next_old_leaf()
4928 path->locks[level] = BTRFS_READ_LOCK; in btrfs_next_old_leaf()
4932 ret = read_block_for_search(root, path, &next, 0, &key); in btrfs_next_old_leaf()
4933 if (ret == -EAGAIN && !path->nowait) in btrfs_next_old_leaf()
4937 btrfs_release_path(path); in btrfs_next_old_leaf()
4941 if (!path->skip_locking) { in btrfs_next_old_leaf()
4942 if (path->nowait) { in btrfs_next_old_leaf()
4954 unlock_up(path, 0, 1, 0, NULL); in btrfs_next_old_leaf()
4958 path->need_commit_sem = 1; in btrfs_next_old_leaf()
4959 ret2 = finish_need_commit_sem_search(path); in btrfs_next_old_leaf()
4968 int btrfs_next_old_item(struct btrfs_root *root, struct btrfs_path *path, u64 time_seq) in btrfs_next_old_item() argument
4970 path->slots[0]++; in btrfs_next_old_item()
4971 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) in btrfs_next_old_item()
4972 return btrfs_next_old_leaf(root, path, time_seq); in btrfs_next_old_item()
4983 struct btrfs_path *path, u64 min_objectid, in btrfs_previous_item() argument
4992 if (path->slots[0] == 0) { in btrfs_previous_item()
4993 ret = btrfs_prev_leaf(root, path); in btrfs_previous_item()
4997 path->slots[0]--; in btrfs_previous_item()
4999 leaf = path->nodes[0]; in btrfs_previous_item()
5003 if (path->slots[0] == nritems) in btrfs_previous_item()
5004 path->slots[0]--; in btrfs_previous_item()
5006 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); in btrfs_previous_item()
5025 struct btrfs_path *path, u64 min_objectid) in btrfs_previous_extent_item() argument
5033 if (path->slots[0] == 0) { in btrfs_previous_extent_item()
5034 ret = btrfs_prev_leaf(root, path); in btrfs_previous_extent_item()
5038 path->slots[0]--; in btrfs_previous_extent_item()
5040 leaf = path->nodes[0]; in btrfs_previous_extent_item()
5044 if (path->slots[0] == nritems) in btrfs_previous_extent_item()
5045 path->slots[0]--; in btrfs_previous_extent_item()
5047 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); in btrfs_previous_extent_item()