aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-12-12 02:26:15 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-12-21 01:36:23 -0500
commit7e320a4063a81508e171012e0f75ec4a111850d4 (patch)
tree2cee6bb47ee5b12bcbd96d3d402f1559858215b3
parentbcachefs: tidy btree_trans_peek_journal() (diff)
downloadwireguard-linux-7e320a4063a81508e171012e0f75ec4a111850d4.tar.xz
wireguard-linux-7e320a4063a81508e171012e0f75ec4a111850d4.zip
bcachefs: Fix btree_trans_peek_key_cache() BTREE_ITER_all_snapshots
In BTREE_ITER_all_snapshots mode, we're required to only return keys where the snapshot field matches the iterator position - BTREE_ITER_filter_snapshots requires pulling keys into the key cache from ancestor snapshots, so we have to check for that. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_iter.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 51ebce9d5b5c..e370fa327769 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -2230,6 +2230,10 @@ struct bkey_s_c btree_trans_peek_key_cache(struct btree_iter *iter, struct bpos
k = bch2_btree_path_peek_slot(trans->paths + iter->key_cache_path, &u);
if (k.k && !bkey_err(k)) {
+ if ((iter->flags & BTREE_ITER_all_snapshots) &&
+ !bpos_eq(pos, k.k->p))
+ return bkey_s_c_null;
+
iter->k = u;
k.k = &iter->k;
}