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.c68
1 files changed, 24 insertions, 44 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 45ddfb54188a..dd716b35a11d 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -2448,27 +2448,10 @@ struct bkey_s_c bch2_btree_iter_peek_max(struct btree_trans *trans, struct btree
continue;
}
- if (!(iter->flags & BTREE_ITER_nofilter_whiteouts)) {
- /*
- * KEY_TYPE_extent_whiteout indicates that there
- * are no extents that overlap with this
- * whiteout - meaning bkey_start_pos() is
- * monotonically increasing when including
- * KEY_TYPE_extent_whiteout (not
- * KEY_TYPE_whiteout).
- *
- * Without this @end wouldn't be able to
- * terminate searches and we'd have to scan
- * through tons of whiteouts:
- */
- if (k.k->type == KEY_TYPE_extent_whiteout &&
- bkey_ge(k.k->p, end))
- goto end;
-
- if (bkey_extent_whiteout(k.k)) {
- search_key = bkey_successor(iter, k.k->p);
- continue;
- }
+ if (bkey_whiteout(k.k) &&
+ !(iter->flags & BTREE_ITER_key_cache_fill)) {
+ search_key = bkey_successor(iter, k.k->p);
+ continue;
}
}
@@ -2728,7 +2711,7 @@ struct bkey_s_c bch2_btree_iter_peek_prev_min(struct btree_trans *trans, struct
saved_path = 0;
}
- if (!bkey_extent_whiteout(k.k)) {
+ if (!bkey_whiteout(k.k)) {
saved_path = btree_path_clone(trans, iter->path,
iter->flags & BTREE_ITER_intent,
_THIS_IP_);
@@ -2741,7 +2724,7 @@ struct bkey_s_c bch2_btree_iter_peek_prev_min(struct btree_trans *trans, struct
continue;
}
- if (bkey_extent_whiteout(k.k)) {
+ if (bkey_whiteout(k.k)) {
search_key = bkey_predecessor(iter, k.k->p);
search_key.snapshot = U32_MAX;
continue;
@@ -2882,9 +2865,9 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre
iter->k = *k.k;
}
- if (unlikely(bkey_extent_whiteout(k.k) &&
+ if (unlikely(k.k->type == KEY_TYPE_whiteout &&
(iter->flags & BTREE_ITER_filter_snapshots) &&
- !(iter->flags & BTREE_ITER_nofilter_whiteouts)))
+ !(iter->flags & BTREE_ITER_key_cache_fill)))
iter->k.type = KEY_TYPE_deleted;
} else {
struct bpos next;
@@ -2895,30 +2878,27 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre
EBUG_ON(btree_iter_path(trans, iter)->level);
- struct btree_iter iter2;
-
- bch2_trans_copy_iter(trans, &iter2, iter);
- iter2.flags |= BTREE_ITER_nofilter_whiteouts;
+ if (iter->flags & BTREE_ITER_intent) {
+ struct btree_iter iter2;
- while (1) {
+ bch2_trans_copy_iter(trans, &iter2, iter);
k = bch2_btree_iter_peek_max(trans, &iter2, end);
- if ((iter2.flags & BTREE_ITER_is_extents) &&
- k.k &&
- !bkey_err(k) &&
- k.k->type == KEY_TYPE_whiteout) {
- bch2_btree_iter_set_pos(trans, &iter2, k.k->p);
- continue;
- }
- break;
- }
+ if (k.k && !bkey_err(k)) {
+ swap(iter->key_cache_path, iter2.key_cache_path);
+ iter->k = iter2.k;
+ k.k = &iter->k;
+ }
+ bch2_trans_iter_exit(trans, &iter2);
+ } else {
+ struct bpos pos = iter->pos;
- if (k.k && !bkey_err(k)) {
- swap(iter->key_cache_path, iter2.key_cache_path);
- iter->k = iter2.k;
- k.k = &iter->k;
+ k = bch2_btree_iter_peek_max(trans, iter, end);
+ if (unlikely(bkey_err(k)))
+ bch2_btree_iter_set_pos(trans, iter, pos);
+ else
+ iter->pos = pos;
}
- bch2_trans_iter_exit(trans, &iter2);
if (unlikely(bkey_err(k)))
goto out;