Lines Matching refs:path
30 *root, struct btrfs_path *path, int level);
32 const struct btrfs_key *ins_key, struct btrfs_path *path,
1043 struct btrfs_path *path, int level) in balance_level() argument
1053 int orig_slot = path->slots[level]; in balance_level()
1058 mid = path->nodes[level]; in balance_level()
1060 WARN_ON(path->locks[level] != BTRFS_WRITE_LOCK); in balance_level()
1066 parent = path->nodes[level + 1]; in balance_level()
1067 pslot = path->slots[level + 1]; in balance_level()
1108 path->locks[level] = 0; in balance_level()
1109 path->nodes[level] = NULL; in balance_level()
1179 ret = btrfs_del_ptr(trans, root, path, level + 1, pslot + 1); in balance_level()
1237 ret = btrfs_del_ptr(trans, root, path, level + 1, pslot); in balance_level()
1266 path->nodes[level] = left; in balance_level()
1267 path->slots[level + 1] -= 1; in balance_level()
1268 path->slots[level] = orig_slot; in balance_level()
1275 path->slots[level] = orig_slot; in balance_level()
1280 btrfs_node_blockptr(path->nodes[level], path->slots[level])) in balance_level()
1288 if (path->nodes[level] != left) in balance_level()
1301 struct btrfs_path *path, int level) in push_nodes_for_insert() argument
1311 int orig_slot = path->slots[level]; in push_nodes_for_insert()
1316 mid = path->nodes[level]; in push_nodes_for_insert()
1320 parent = path->nodes[level + 1]; in push_nodes_for_insert()
1321 pslot = path->slots[level + 1]; in push_nodes_for_insert()
1367 path->nodes[level] = left; in push_nodes_for_insert()
1368 path->slots[level + 1] -= 1; in push_nodes_for_insert()
1369 path->slots[level] = orig_slot; in push_nodes_for_insert()
1375 path->slots[level] = orig_slot; in push_nodes_for_insert()
1428 path->nodes[level] = right; in push_nodes_for_insert()
1429 path->slots[level + 1] += 1; in push_nodes_for_insert()
1430 path->slots[level] = orig_slot - in push_nodes_for_insert()
1451 struct btrfs_path *path, in reada_for_search() argument
1465 if (level != 1 && path->reada != READA_FORWARD_ALWAYS) in reada_for_search()
1468 if (!path->nodes[level]) in reada_for_search()
1471 node = path->nodes[level]; in reada_for_search()
1478 if (path->reada == READA_FORWARD_ALWAYS) { in reada_for_search()
1489 if (path->reada != READA_FORWARD_ALWAYS) { in reada_for_search()
1505 if (path->reada == READA_BACK) { in reada_for_search()
1509 } else if (path->reada == READA_FORWARD || in reada_for_search()
1510 path->reada == READA_FORWARD_ALWAYS) { in reada_for_search()
1515 if (path->reada == READA_BACK && objectid) { in reada_for_search()
1521 if (path->reada == READA_FORWARD_ALWAYS || in reada_for_search()
1533 static noinline void reada_for_balance(struct btrfs_path *path, int level) in reada_for_balance() argument
1539 parent = path->nodes[level + 1]; in reada_for_balance()
1544 slot = path->slots[level + 1]; in reada_for_balance()
1566 static noinline void unlock_up(struct btrfs_path *path, int level, in unlock_up() argument
1575 if (!path->nodes[i]) in unlock_up()
1577 if (!path->locks[i]) in unlock_up()
1581 if (path->slots[i] == 0) { in unlock_up()
1586 if (path->keep_locks) { in unlock_up()
1589 nritems = btrfs_header_nritems(path->nodes[i]); in unlock_up()
1590 if (nritems < 1 || path->slots[i] >= nritems - 1) { in unlock_up()
1599 btrfs_tree_unlock_rw(path->nodes[i], path->locks[i]); in unlock_up()
1600 path->locks[i] = 0; in unlock_up()
1790 int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *path, in btrfs_find_item() argument
1798 ASSERT(path); in btrfs_find_item()
1805 ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0); in btrfs_find_item()
1809 eb = path->nodes[0]; in btrfs_find_item()
1810 if (ret && path->slots[0] >= btrfs_header_nritems(eb)) { in btrfs_find_item()
1811 ret = btrfs_next_leaf(fs_root, path); in btrfs_find_item()
1814 eb = path->nodes[0]; in btrfs_find_item()
1817 btrfs_item_key_to_cpu(eb, found_key, path->slots[0]); in btrfs_find_item()
1919 static int finish_need_commit_sem_search(struct btrfs_path *path) in finish_need_commit_sem_search() argument
1921 const int i = path->lowest_level; in finish_need_commit_sem_search()
1922 const int slot = path->slots[i]; in finish_need_commit_sem_search()
1923 struct extent_buffer *lowest = path->nodes[i]; in finish_need_commit_sem_search()
1926 ASSERT(path->need_commit_sem); in finish_need_commit_sem_search()
1937 btrfs_release_path(path); in finish_need_commit_sem_search()
1938 path->nodes[i] = clone; in finish_need_commit_sem_search()
1939 path->slots[i] = slot; in finish_need_commit_sem_search()
1968 struct btrfs_path *path, in search_leaf() argument
1972 struct extent_buffer *leaf = path->nodes[0]; in search_leaf()
1996 if (path->locks[1] && leaf_free_space >= ins_len) { in search_leaf()
2023 btrfs_unlock_up_safe(path, 1); in search_leaf()
2041 btrfs_unlock_up_safe(path, 1); in search_leaf()
2048 path->slots[0] = 0; in search_leaf()
2055 prev_cmp, &path->slots[0]); in search_leaf()
2070 if (ret == 0 && !path->search_for_extension) { in search_leaf()
2080 err = split_leaf(trans, root, key, path, ins_len, in search_leaf()
2477 static int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path) in btrfs_prev_leaf() argument
2484 btrfs_item_key_to_cpu(path->nodes[0], &key, 0); in btrfs_prev_leaf()
2500 btrfs_release_path(path); in btrfs_prev_leaf()
2501 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_prev_leaf()
2516 if (path->slots[0] < btrfs_header_nritems(path->nodes[0])) { in btrfs_prev_leaf()
2517 btrfs_item_key(path->nodes[0], &found_key, path->slots[0]); in btrfs_prev_leaf()
2520 if (path->slots[0] > 0) { in btrfs_prev_leaf()
2521 path->slots[0]--; in btrfs_prev_leaf()
2532 btrfs_item_key(path->nodes[0], &found_key, 0); in btrfs_prev_leaf()
2633 struct btrfs_path *path) in btrfs_search_backwards() argument
2637 ret = btrfs_search_slot(NULL, root, key, path, 0, 0); in btrfs_search_backwards()
2639 ret = btrfs_previous_item(root, path, key->objectid, key->type); in btrfs_search_backwards()
2642 btrfs_item_key_to_cpu(path->nodes[0], key, path->slots[0]); in btrfs_search_backwards()
2659 struct btrfs_path *path) in btrfs_get_next_valid_item() argument
2661 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) { in btrfs_get_next_valid_item()
2664 ret = btrfs_next_leaf(root, path); in btrfs_get_next_valid_item()
2669 btrfs_item_key_to_cpu(path->nodes[0], key, path->slots[0]); in btrfs_get_next_valid_item()
2681 static void fixup_low_keys(struct btrfs_path *path, in fixup_low_keys() argument
2689 int tslot = path->slots[i]; in fixup_low_keys()
2691 if (!path->nodes[i]) in fixup_low_keys()
2693 t = path->nodes[i]; in fixup_low_keys()
2698 btrfs_mark_buffer_dirty(path->nodes[i]); in fixup_low_keys()
2711 struct btrfs_path *path, in btrfs_set_item_key_safe() argument
2718 eb = path->nodes[0]; in btrfs_set_item_key_safe()
2719 slot = path->slots[0]; in btrfs_set_item_key_safe()
2753 fixup_low_keys(path, &disk_key, 1); in btrfs_set_item_key_safe()
2975 struct btrfs_path *path, int level) in insert_new_root() argument
2985 BUG_ON(path->nodes[level]); in insert_new_root()
2986 BUG_ON(path->nodes[level-1] != root->node); in insert_new_root()
2988 lower = path->nodes[level-1]; in insert_new_root()
3027 path->nodes[level] = c; in insert_new_root()
3028 path->locks[level] = BTRFS_WRITE_LOCK; in insert_new_root()
3029 path->slots[level] = 0; in insert_new_root()
3041 struct btrfs_path *path, in insert_ptr() argument
3049 BUG_ON(!path->nodes[level]); in insert_ptr()
3050 btrfs_assert_tree_write_locked(path->nodes[level]); in insert_ptr()
3051 lower = path->nodes[level]; in insert_ptr()
3098 struct btrfs_path *path, int level) in split_node() argument
3108 c = path->nodes[level]; in split_node()
3121 ret = insert_new_root(trans, root, path, level + 1); in split_node()
3125 ret = push_nodes_for_insert(trans, root, path, level); in split_node()
3126 c = path->nodes[level]; in split_node()
3164 ret = insert_ptr(trans, path, &disk_key, split->start, in split_node()
3165 path->slots[level + 1] + 1, level + 1); in split_node()
3172 if (path->slots[level] >= mid) { in split_node()
3173 path->slots[level] -= mid; in split_node()
3176 path->nodes[level] = split; in split_node()
3177 path->slots[level + 1] += 1; in split_node()
3232 struct btrfs_path *path, in __push_leaf_right() argument
3239 struct extent_buffer *left = path->nodes[0]; in __push_leaf_right()
3240 struct extent_buffer *upper = path->nodes[1]; in __push_leaf_right()
3257 if (path->slots[0] >= left_nritems) in __push_leaf_right()
3260 slot = path->slots[1]; in __push_leaf_right()
3264 if (path->slots[0] > i) in __push_leaf_right()
3266 if (path->slots[0] == i) { in __push_leaf_right()
3274 if (path->slots[0] == i) in __push_leaf_right()
3339 if (path->slots[0] >= left_nritems) { in __push_leaf_right()
3340 path->slots[0] -= left_nritems; in __push_leaf_right()
3341 if (btrfs_header_nritems(path->nodes[0]) == 0) in __push_leaf_right()
3342 btrfs_clear_buffer_dirty(trans, path->nodes[0]); in __push_leaf_right()
3343 btrfs_tree_unlock(path->nodes[0]); in __push_leaf_right()
3344 free_extent_buffer(path->nodes[0]); in __push_leaf_right()
3345 path->nodes[0] = right; in __push_leaf_right()
3346 path->slots[1] += 1; in __push_leaf_right()
3370 *root, struct btrfs_path *path, in push_leaf_right() argument
3374 struct extent_buffer *left = path->nodes[0]; in push_leaf_right()
3382 if (!path->nodes[1]) in push_leaf_right()
3385 slot = path->slots[1]; in push_leaf_right()
3386 upper = path->nodes[1]; in push_leaf_right()
3390 btrfs_assert_tree_write_locked(path->nodes[1]); in push_leaf_right()
3418 if (path->slots[0] == left_nritems && !empty) { in push_leaf_right()
3425 path->nodes[0] = right; in push_leaf_right()
3426 path->slots[0] = 0; in push_leaf_right()
3427 path->slots[1]++; in push_leaf_right()
3431 return __push_leaf_right(trans, path, min_data_size, empty, right, in push_leaf_right()
3448 struct btrfs_path *path, int data_size, in __push_leaf_left() argument
3455 struct extent_buffer *right = path->nodes[0]; in __push_leaf_left()
3473 if (path->slots[0] < i) in __push_leaf_left()
3475 if (path->slots[0] == i) { in __push_leaf_left()
3483 if (path->slots[0] == i) in __push_leaf_left()
3555 fixup_low_keys(path, &disk_key, 1); in __push_leaf_left()
3558 if (path->slots[0] < push_items) { in __push_leaf_left()
3559 path->slots[0] += old_left_nritems; in __push_leaf_left()
3560 btrfs_tree_unlock(path->nodes[0]); in __push_leaf_left()
3561 free_extent_buffer(path->nodes[0]); in __push_leaf_left()
3562 path->nodes[0] = left; in __push_leaf_left()
3563 path->slots[1] -= 1; in __push_leaf_left()
3567 path->slots[0] -= push_items; in __push_leaf_left()
3569 BUG_ON(path->slots[0] < 0); in __push_leaf_left()
3586 *root, struct btrfs_path *path, int min_data_size, in push_leaf_left() argument
3589 struct extent_buffer *right = path->nodes[0]; in push_leaf_left()
3596 slot = path->slots[1]; in push_leaf_left()
3599 if (!path->nodes[1]) in push_leaf_left()
3606 btrfs_assert_tree_write_locked(path->nodes[1]); in push_leaf_left()
3608 left = btrfs_read_node_slot(path->nodes[1], slot - 1); in push_leaf_left()
3621 path->nodes[1], slot - 1, &left, in push_leaf_left()
3635 return __push_leaf_left(trans, path, min_data_size, empty, left, in push_leaf_left()
3648 struct btrfs_path *path, in copy_for_split() argument
3682 ret = insert_ptr(trans, path, &disk_key, right->start, path->slots[1] + 1, 1); in copy_for_split()
3688 BUG_ON(path->slots[0] != slot); in copy_for_split()
3691 btrfs_tree_unlock(path->nodes[0]); in copy_for_split()
3692 free_extent_buffer(path->nodes[0]); in copy_for_split()
3693 path->nodes[0] = right; in copy_for_split()
3694 path->slots[0] -= mid; in copy_for_split()
3695 path->slots[1] += 1; in copy_for_split()
3701 BUG_ON(path->slots[0] < 0); in copy_for_split()
3718 struct btrfs_path *path, in push_for_double_split() argument
3727 slot = path->slots[0]; in push_for_double_split()
3728 if (slot < btrfs_header_nritems(path->nodes[0])) in push_for_double_split()
3729 space_needed -= btrfs_leaf_free_space(path->nodes[0]); in push_for_double_split()
3735 ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3742 nritems = btrfs_header_nritems(path->nodes[0]); in push_for_double_split()
3747 if (path->slots[0] == 0 || path->slots[0] == nritems) in push_for_double_split()
3750 if (btrfs_leaf_free_space(path->nodes[0]) >= data_size) in push_for_double_split()
3754 slot = path->slots[0]; in push_for_double_split()
3757 space_needed -= btrfs_leaf_free_space(path->nodes[0]); in push_for_double_split()
3758 ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot); in push_for_double_split()
3779 struct btrfs_path *path, int data_size, in split_leaf() argument
3795 l = path->nodes[0]; in split_leaf()
3796 slot = path->slots[0]; in split_leaf()
3802 if (data_size && path->nodes[1]) { in split_leaf()
3808 wret = push_leaf_right(trans, root, path, space_needed, in split_leaf()
3816 wret = push_leaf_left(trans, root, path, space_needed, in split_leaf()
3821 l = path->nodes[0]; in split_leaf()
3828 if (!path->nodes[1]) { in split_leaf()
3829 ret = insert_new_root(trans, root, path, 1); in split_leaf()
3835 l = path->nodes[0]; in split_leaf()
3836 slot = path->slots[0]; in split_leaf()
3902 ret = insert_ptr(trans, path, &disk_key, in split_leaf()
3903 right->start, path->slots[1] + 1, 1); in split_leaf()
3909 btrfs_tree_unlock(path->nodes[0]); in split_leaf()
3910 free_extent_buffer(path->nodes[0]); in split_leaf()
3911 path->nodes[0] = right; in split_leaf()
3912 path->slots[0] = 0; in split_leaf()
3913 path->slots[1] += 1; in split_leaf()
3916 ret = insert_ptr(trans, path, &disk_key, in split_leaf()
3917 right->start, path->slots[1], 1); in split_leaf()
3923 btrfs_tree_unlock(path->nodes[0]); in split_leaf()
3924 free_extent_buffer(path->nodes[0]); in split_leaf()
3925 path->nodes[0] = right; in split_leaf()
3926 path->slots[0] = 0; in split_leaf()
3927 if (path->slots[1] == 0) in split_leaf()
3928 fixup_low_keys(path, &disk_key, 1); in split_leaf()
3938 ret = copy_for_split(trans, path, l, right, slot, mid, nritems); in split_leaf()
3954 push_for_double_split(trans, root, path, data_size); in split_leaf()
3956 if (btrfs_leaf_free_space(path->nodes[0]) >= data_size) in split_leaf()
3963 struct btrfs_path *path, int ins_len) in setup_leaf_for_split() argument
3972 leaf = path->nodes[0]; in setup_leaf_for_split()
3973 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); in setup_leaf_for_split()
3981 item_size = btrfs_item_size(leaf, path->slots[0]); in setup_leaf_for_split()
3983 fi = btrfs_item_ptr(leaf, path->slots[0], in setup_leaf_for_split()
3987 btrfs_release_path(path); in setup_leaf_for_split()
3989 path->keep_locks = 1; in setup_leaf_for_split()
3990 path->search_for_split = 1; in setup_leaf_for_split()
3991 ret = btrfs_search_slot(trans, root, &key, path, 0, 1); in setup_leaf_for_split()
3992 path->search_for_split = 0; in setup_leaf_for_split()
3999 leaf = path->nodes[0]; in setup_leaf_for_split()
4001 if (item_size != btrfs_item_size(leaf, path->slots[0])) in setup_leaf_for_split()
4005 if (btrfs_leaf_free_space(path->nodes[0]) >= ins_len) in setup_leaf_for_split()
4009 fi = btrfs_item_ptr(leaf, path->slots[0], in setup_leaf_for_split()
4015 ret = split_leaf(trans, root, &key, path, ins_len, 1); in setup_leaf_for_split()
4019 path->keep_locks = 0; in setup_leaf_for_split()
4020 btrfs_unlock_up_safe(path, 1); in setup_leaf_for_split()
4023 path->keep_locks = 0; in setup_leaf_for_split()
4027 static noinline int split_item(struct btrfs_path *path, in split_item() argument
4039 leaf = path->nodes[0]; in split_item()
4047 orig_slot = path->slots[0]; in split_item()
4048 orig_offset = btrfs_item_offset(leaf, path->slots[0]); in split_item()
4049 item_size = btrfs_item_size(leaf, path->slots[0]); in split_item()
4056 path->slots[0]), item_size); in split_item()
4058 slot = path->slots[0] + 1; in split_item()
4079 btrfs_item_ptr_offset(leaf, path->slots[0]), in split_item()
4110 struct btrfs_path *path, in btrfs_split_item() argument
4115 ret = setup_leaf_for_split(trans, root, path, in btrfs_split_item()
4120 ret = split_item(path, new_key, split_offset); in btrfs_split_item()
4130 void btrfs_truncate_item(struct btrfs_path *path, u32 new_size, int from_end) in btrfs_truncate_item() argument
4142 leaf = path->nodes[0]; in btrfs_truncate_item()
4143 slot = path->slots[0]; in btrfs_truncate_item()
4206 fixup_low_keys(path, &disk_key, 1); in btrfs_truncate_item()
4221 void btrfs_extend_item(struct btrfs_path *path, u32 data_size) in btrfs_extend_item() argument
4232 leaf = path->nodes[0]; in btrfs_extend_item()
4241 slot = path->slots[0]; in btrfs_extend_item()
4289 static void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path, in setup_items_for_insert() argument
4307 if (path->slots[0] == 0) { in setup_items_for_insert()
4309 fixup_low_keys(path, &disk_key, 1); in setup_items_for_insert()
4311 btrfs_unlock_up_safe(path, 1); in setup_items_for_insert()
4313 leaf = path->nodes[0]; in setup_items_for_insert()
4314 slot = path->slots[0]; in setup_items_for_insert()
4385 struct btrfs_path *path, in btrfs_setup_item_for_insert() argument
4396 setup_items_for_insert(root, path, &batch); in btrfs_setup_item_for_insert()
4405 struct btrfs_path *path, in btrfs_insert_empty_items() argument
4413 ret = btrfs_search_slot(trans, root, &batch->keys[0], path, total_size, 1); in btrfs_insert_empty_items()
4419 slot = path->slots[0]; in btrfs_insert_empty_items()
4422 setup_items_for_insert(root, path, batch); in btrfs_insert_empty_items()
4435 struct btrfs_path *path; in btrfs_insert_item() local
4439 path = btrfs_alloc_path(); in btrfs_insert_item()
4440 if (!path) in btrfs_insert_item()
4442 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size); in btrfs_insert_item()
4444 leaf = path->nodes[0]; in btrfs_insert_item()
4445 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]); in btrfs_insert_item()
4449 btrfs_free_path(path); in btrfs_insert_item()
4463 struct btrfs_path *path, in btrfs_duplicate_item() argument
4470 leaf = path->nodes[0]; in btrfs_duplicate_item()
4471 item_size = btrfs_item_size(leaf, path->slots[0]); in btrfs_duplicate_item()
4472 ret = setup_leaf_for_split(trans, root, path, in btrfs_duplicate_item()
4477 path->slots[0]++; in btrfs_duplicate_item()
4478 btrfs_setup_item_for_insert(root, path, new_key, item_size); in btrfs_duplicate_item()
4479 leaf = path->nodes[0]; in btrfs_duplicate_item()
4481 btrfs_item_ptr_offset(leaf, path->slots[0]), in btrfs_duplicate_item()
4482 btrfs_item_ptr_offset(leaf, path->slots[0] - 1), in btrfs_duplicate_item()
4496 struct btrfs_path *path, int level, int slot) in btrfs_del_ptr() argument
4498 struct extent_buffer *parent = path->nodes[level]; in btrfs_del_ptr()
4536 fixup_low_keys(path, &disk_key, level + 1); in btrfs_del_ptr()
4554 struct btrfs_path *path, in btrfs_del_leaf() argument
4560 ret = btrfs_del_ptr(trans, root, path, 1, path->slots[1]); in btrfs_del_leaf()
4568 btrfs_unlock_up_safe(path, 0); in btrfs_del_leaf()
4582 struct btrfs_path *path, int slot, int nr) in btrfs_del_items() argument
4590 leaf = path->nodes[0]; in btrfs_del_items()
4625 ret = btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4635 fixup_low_keys(path, &disk_key, 1); in btrfs_del_items()
4653 slot = path->slots[1]; in btrfs_del_items()
4661 wret = push_leaf_left(trans, root, path, 0, in btrfs_del_items()
4666 if (path->nodes[0] == leaf && in btrfs_del_items()
4680 wret = push_leaf_right(trans, root, path, 0, in btrfs_del_items()
4687 path->slots[1] = slot; in btrfs_del_items()
4688 ret = btrfs_del_leaf(trans, root, path, leaf); in btrfs_del_items()
4699 if (path->nodes[0] == leaf) in btrfs_del_items()
4730 struct btrfs_path *path, in btrfs_search_forward() argument
4740 int keep_locks = path->keep_locks; in btrfs_search_forward()
4742 ASSERT(!path->nowait); in btrfs_search_forward()
4743 path->keep_locks = 1; in btrfs_search_forward()
4747 WARN_ON(path->nodes[level]); in btrfs_search_forward()
4748 path->nodes[level] = cur; in btrfs_search_forward()
4749 path->locks[level] = BTRFS_READ_LOCK; in btrfs_search_forward()
4765 if (level == path->lowest_level) { in btrfs_search_forward()
4769 path->slots[level] = slot; in btrfs_search_forward()
4795 path->slots[level] = slot; in btrfs_search_forward()
4796 sret = btrfs_find_next_key(root, path, min_key, level, in btrfs_search_forward()
4799 btrfs_release_path(path); in btrfs_search_forward()
4807 path->slots[level] = slot; in btrfs_search_forward()
4808 if (level == path->lowest_level) { in btrfs_search_forward()
4820 path->locks[level - 1] = BTRFS_READ_LOCK; in btrfs_search_forward()
4821 path->nodes[level - 1] = cur; in btrfs_search_forward()
4822 unlock_up(path, level, 1, 0, NULL); in btrfs_search_forward()
4825 path->keep_locks = keep_locks; in btrfs_search_forward()
4827 btrfs_unlock_up_safe(path, path->lowest_level + 1); in btrfs_search_forward()
4844 int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, in btrfs_find_next_key() argument
4850 WARN_ON(!path->keep_locks && !path->skip_locking); in btrfs_find_next_key()
4852 if (!path->nodes[level]) in btrfs_find_next_key()
4855 slot = path->slots[level] + 1; in btrfs_find_next_key()
4856 c = path->nodes[level]; in btrfs_find_next_key()
4863 !path->nodes[level + 1]) in btrfs_find_next_key()
4866 if (path->locks[level + 1] || path->skip_locking) { in btrfs_find_next_key()
4877 orig_lowest = path->lowest_level; in btrfs_find_next_key()
4878 btrfs_release_path(path); in btrfs_find_next_key()
4879 path->lowest_level = level; in btrfs_find_next_key()
4880 ret = btrfs_search_slot(NULL, root, &cur_key, path, in btrfs_find_next_key()
4882 path->lowest_level = orig_lowest; in btrfs_find_next_key()
4886 c = path->nodes[level]; in btrfs_find_next_key()
4887 slot = path->slots[level]; in btrfs_find_next_key()
4909 int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path, in btrfs_next_old_leaf() argument
4928 ASSERT(!path->nowait); in btrfs_next_old_leaf()
4930 nritems = btrfs_header_nritems(path->nodes[0]); in btrfs_next_old_leaf()
4934 btrfs_item_key_to_cpu(path->nodes[0], &key, nritems - 1); in btrfs_next_old_leaf()
4938 btrfs_release_path(path); in btrfs_next_old_leaf()
4940 path->keep_locks = 1; in btrfs_next_old_leaf()
4943 ret = btrfs_search_old_slot(root, &key, path, time_seq); in btrfs_next_old_leaf()
4945 if (path->need_commit_sem) { in btrfs_next_old_leaf()
4946 path->need_commit_sem = 0; in btrfs_next_old_leaf()
4948 if (path->nowait) { in btrfs_next_old_leaf()
4957 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); in btrfs_next_old_leaf()
4959 path->keep_locks = 0; in btrfs_next_old_leaf()
4964 nritems = btrfs_header_nritems(path->nodes[0]); in btrfs_next_old_leaf()
4971 if (nritems > 0 && path->slots[0] < nritems - 1) { in btrfs_next_old_leaf()
4973 path->slots[0]++; in btrfs_next_old_leaf()
4991 if (nritems > 0 && ret > 0 && path->slots[0] == nritems - 1) { in btrfs_next_old_leaf()
4997 if (!path->nodes[level]) { in btrfs_next_old_leaf()
5002 slot = path->slots[level] + 1; in btrfs_next_old_leaf()
5003 c = path->nodes[level]; in btrfs_next_old_leaf()
5020 if (path->locks[level]) { in btrfs_next_old_leaf()
5021 btrfs_tree_read_unlock(path->nodes[i]); in btrfs_next_old_leaf()
5022 path->locks[i] = 0; in btrfs_next_old_leaf()
5024 free_extent_buffer(path->nodes[i]); in btrfs_next_old_leaf()
5025 path->nodes[i] = NULL; in btrfs_next_old_leaf()
5029 ret = read_block_for_search(root, path, &next, level, in btrfs_next_old_leaf()
5031 if (ret == -EAGAIN && !path->nowait) in btrfs_next_old_leaf()
5035 btrfs_release_path(path); in btrfs_next_old_leaf()
5039 if (!path->skip_locking) { in btrfs_next_old_leaf()
5041 if (!ret && path->nowait) { in btrfs_next_old_leaf()
5054 btrfs_release_path(path); in btrfs_next_old_leaf()
5063 path->slots[level] = slot; in btrfs_next_old_leaf()
5066 path->nodes[level] = next; in btrfs_next_old_leaf()
5067 path->slots[level] = 0; in btrfs_next_old_leaf()
5068 if (!path->skip_locking) in btrfs_next_old_leaf()
5069 path->locks[level] = BTRFS_READ_LOCK; in btrfs_next_old_leaf()
5073 ret = read_block_for_search(root, path, &next, level, in btrfs_next_old_leaf()
5075 if (ret == -EAGAIN && !path->nowait) in btrfs_next_old_leaf()
5079 btrfs_release_path(path); in btrfs_next_old_leaf()
5083 if (!path->skip_locking) { in btrfs_next_old_leaf()
5084 if (path->nowait) { in btrfs_next_old_leaf()
5096 unlock_up(path, 0, 1, 0, NULL); in btrfs_next_old_leaf()
5100 path->need_commit_sem = 1; in btrfs_next_old_leaf()
5101 ret2 = finish_need_commit_sem_search(path); in btrfs_next_old_leaf()
5110 int btrfs_next_old_item(struct btrfs_root *root, struct btrfs_path *path, u64 time_seq) in btrfs_next_old_item() argument
5112 path->slots[0]++; in btrfs_next_old_item()
5113 if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) in btrfs_next_old_item()
5114 return btrfs_next_old_leaf(root, path, time_seq); in btrfs_next_old_item()
5125 struct btrfs_path *path, u64 min_objectid, in btrfs_previous_item() argument
5134 if (path->slots[0] == 0) { in btrfs_previous_item()
5135 ret = btrfs_prev_leaf(root, path); in btrfs_previous_item()
5139 path->slots[0]--; in btrfs_previous_item()
5141 leaf = path->nodes[0]; in btrfs_previous_item()
5145 if (path->slots[0] == nritems) in btrfs_previous_item()
5146 path->slots[0]--; in btrfs_previous_item()
5148 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); in btrfs_previous_item()
5167 struct btrfs_path *path, u64 min_objectid) in btrfs_previous_extent_item() argument
5175 if (path->slots[0] == 0) { in btrfs_previous_extent_item()
5176 ret = btrfs_prev_leaf(root, path); in btrfs_previous_extent_item()
5180 path->slots[0]--; in btrfs_previous_extent_item()
5182 leaf = path->nodes[0]; in btrfs_previous_extent_item()
5186 if (path->slots[0] == nritems) in btrfs_previous_extent_item()
5187 path->slots[0]--; in btrfs_previous_extent_item()
5189 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); in btrfs_previous_extent_item()