summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_iter.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/btree_iter.c')
-rw-r--r--fs/bcachefs/btree_iter.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 06379f3e40a6..a856f5e90727 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -1739,36 +1739,35 @@ struct btree_path *bch2_path_get(struct btree_trans *trans, bool cached,
unsigned locks_want, unsigned level,
bool intent)
{
- struct btree_path *path, *best = NULL;
+ struct btree_path *path, *path_pos = NULL;
struct bpos pos_min = POS_MIN;
int i;
BUG_ON(trans->restarted);
- trans_for_each_path(trans, path) {
- if (path->cached != cached ||
- path->btree_id != btree_id ||
- path->level != level)
- continue;
-
- if (best) {
- int cmp = bkey_cmp(bpos_diff(best->pos, pos),
- bpos_diff(path->pos, pos));
+ btree_trans_sort_paths(trans);
- if (cmp < 0 ||
- ((cmp == 0 && (path->ref || path->preserve))))
- continue;
- }
+ trans_for_each_path_inorder(trans, path, i) {
+ if (__btree_path_cmp(path,
+ btree_id,
+ cached,
+ pos,
+ level) > 0)
+ break;
- best = path;
+ path_pos = path;
}
- if (best) {
- __btree_path_get(best, intent);
- path = btree_path_set_pos(trans, best, pos, intent);
+ if (path_pos &&
+ path_pos->cached == cached &&
+ path_pos->btree_id == btree_id &&
+ path_pos->level == level) {
+ __btree_path_get(path_pos, intent);
+ path = btree_path_set_pos(trans, path_pos, pos, intent);
path->preserve = true;
} else {
- path = btree_path_alloc(trans, NULL);
+ path = btree_path_alloc(trans, path_pos);
+ path_pos = NULL;
__btree_path_get(path, intent);
path->pos = pos;
@@ -1808,9 +1807,9 @@ struct btree_path *bch2_path_get(struct btree_trans *trans, bool cached,
trace_trans_get_path(_RET_IP_, trans->ip, btree_id,
&pos, locks_want, path->uptodate,
- best ? &best->pos : &pos_min,
- best ? best->locks_want : U8_MAX,
- best ? best->uptodate : U8_MAX);
+ path_pos ? &path_pos->pos : &pos_min,
+ path_pos ? path_pos->locks_want : U8_MAX,
+ path_pos ? path_pos->uptodate : U8_MAX);
return path;
}