65 lines
2.3 KiB
Diff
65 lines
2.3 KiB
Diff
From 3140d0052a47723243dbd8f5a1f49ebb5eda2e9e Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Fri, 25 Oct 2024 20:41:06 -0400
|
|
Subject: [PATCH 090/233] bcachefs: peek_prev_min(): Search forwards for
|
|
extents, snapshots
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
With extents and snapshots, for slightly different reasons, we may have
|
|
to search forwards to find a key that compares equal to iter->pos (i.e.
|
|
a key that peek_prev() should return, as it returns keys <= iter->pos).
|
|
|
|
peek_slot() does this, and is an easy way to fix this case.
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/btree_iter.c | 23 ++++++++++++++++++++---
|
|
1 file changed, 20 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
|
|
index d66d773a37b4..ed74f0655d98 100644
|
|
--- a/fs/bcachefs/btree_iter.c
|
|
+++ b/fs/bcachefs/btree_iter.c
|
|
@@ -2575,6 +2575,26 @@ static struct bkey_s_c __bch2_btree_iter_peek_prev(struct btree_iter *iter, stru
|
|
*/
|
|
struct bkey_s_c bch2_btree_iter_peek_prev_min(struct btree_iter *iter, struct bpos end)
|
|
{
|
|
+ if ((iter->flags & (BTREE_ITER_is_extents|BTREE_ITER_filter_snapshots)) &&
|
|
+ !bkey_eq(iter->pos, POS_MAX)) {
|
|
+ /*
|
|
+ * bkey_start_pos(), for extents, is not monotonically
|
|
+ * increasing until after filtering for snapshots:
|
|
+ *
|
|
+ * Thus, for extents we need to search forward until we find a
|
|
+ * real visible extents - easiest to just use peek_slot() (which
|
|
+ * internally uses peek() for extents)
|
|
+ */
|
|
+ struct bkey_s_c k = bch2_btree_iter_peek_slot(iter);
|
|
+ if (bkey_err(k))
|
|
+ return k;
|
|
+
|
|
+ if (!bkey_deleted(k.k) &&
|
|
+ (!(iter->flags & BTREE_ITER_is_extents) ||
|
|
+ bkey_lt(bkey_start_pos(k.k), iter->pos)))
|
|
+ return k;
|
|
+ }
|
|
+
|
|
struct btree_trans *trans = iter->trans;
|
|
struct bpos search_key = iter->pos;
|
|
struct bkey_s_c k;
|
|
@@ -2584,9 +2604,6 @@ struct bkey_s_c bch2_btree_iter_peek_prev_min(struct btree_iter *iter, struct bp
|
|
bch2_btree_iter_verify_entry_exit(iter);
|
|
EBUG_ON((iter->flags & BTREE_ITER_filter_snapshots) && bpos_eq(end, POS_MIN));
|
|
|
|
- if (iter->flags & BTREE_ITER_filter_snapshots)
|
|
- search_key.snapshot = U32_MAX;
|
|
-
|
|
while (1) {
|
|
k = __bch2_btree_iter_peek_prev(iter, search_key);
|
|
if (unlikely(!k.k))
|
|
--
|
|
2.45.2
|
|
|