102 lines
3.8 KiB
Diff
102 lines
3.8 KiB
Diff
From 989229db3f0720a5f16f5753356a4ce51124c072 Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Sun, 15 Dec 2024 02:24:30 -0500
|
|
Subject: [PATCH 230/233] bcachefs: kill __bch2_btree_iter_flags()
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
bch2_btree_iter_flags() now takes a level parameter; this fixes a bug
|
|
where using a node iterator on a leaf wouldn't set
|
|
BTREE_ITER_with_key_cache, leading to fun cache coherency bugs.
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/btree_iter.c | 7 +++++--
|
|
fs/bcachefs/btree_iter.h | 28 +++++++++++-----------------
|
|
2 files changed, 16 insertions(+), 19 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
|
|
index a1c5fcced24e..291eb5eb0203 100644
|
|
--- a/fs/bcachefs/btree_iter.c
|
|
+++ b/fs/bcachefs/btree_iter.c
|
|
@@ -3032,7 +3032,7 @@ void bch2_trans_iter_init_outlined(struct btree_trans *trans,
|
|
unsigned flags)
|
|
{
|
|
bch2_trans_iter_init_common(trans, iter, btree_id, pos, 0, 0,
|
|
- bch2_btree_iter_flags(trans, btree_id, flags),
|
|
+ bch2_btree_iter_flags(trans, btree_id, 0, flags),
|
|
_RET_IP_);
|
|
}
|
|
|
|
@@ -3048,8 +3048,11 @@ void bch2_trans_node_iter_init(struct btree_trans *trans,
|
|
flags |= BTREE_ITER_snapshot_field;
|
|
flags |= BTREE_ITER_all_snapshots;
|
|
|
|
+ if (!depth && btree_id_cached(trans->c, btree_id))
|
|
+ flags |= BTREE_ITER_with_key_cache;
|
|
+
|
|
bch2_trans_iter_init_common(trans, iter, btree_id, pos, locks_want, depth,
|
|
- __bch2_btree_iter_flags(trans, btree_id, flags),
|
|
+ bch2_btree_iter_flags(trans, btree_id, depth, flags),
|
|
_RET_IP_);
|
|
|
|
iter->min_depth = depth;
|
|
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h
|
|
index 3477fc8c0396..e23608d2a26d 100644
|
|
--- a/fs/bcachefs/btree_iter.h
|
|
+++ b/fs/bcachefs/btree_iter.h
|
|
@@ -446,10 +446,17 @@ static inline void bch2_btree_iter_set_snapshot(struct btree_iter *iter, u32 sna
|
|
|
|
void bch2_trans_iter_exit(struct btree_trans *, struct btree_iter *);
|
|
|
|
-static inline unsigned __bch2_btree_iter_flags(struct btree_trans *trans,
|
|
- unsigned btree_id,
|
|
- unsigned flags)
|
|
+static inline unsigned bch2_btree_iter_flags(struct btree_trans *trans,
|
|
+ unsigned btree_id,
|
|
+ unsigned level,
|
|
+ unsigned flags)
|
|
{
|
|
+ if (level || !btree_id_cached(trans->c, btree_id)) {
|
|
+ flags &= ~BTREE_ITER_cached;
|
|
+ flags &= ~BTREE_ITER_with_key_cache;
|
|
+ } else if (!(flags & BTREE_ITER_cached))
|
|
+ flags |= BTREE_ITER_with_key_cache;
|
|
+
|
|
if (!(flags & (BTREE_ITER_all_snapshots|BTREE_ITER_not_extents)) &&
|
|
btree_id_is_extents(btree_id))
|
|
flags |= BTREE_ITER_is_extents;
|
|
@@ -468,19 +475,6 @@ static inline unsigned __bch2_btree_iter_flags(struct btree_trans *trans,
|
|
return flags;
|
|
}
|
|
|
|
-static inline unsigned bch2_btree_iter_flags(struct btree_trans *trans,
|
|
- unsigned btree_id,
|
|
- unsigned flags)
|
|
-{
|
|
- if (!btree_id_cached(trans->c, btree_id)) {
|
|
- flags &= ~BTREE_ITER_cached;
|
|
- flags &= ~BTREE_ITER_with_key_cache;
|
|
- } else if (!(flags & BTREE_ITER_cached))
|
|
- flags |= BTREE_ITER_with_key_cache;
|
|
-
|
|
- return __bch2_btree_iter_flags(trans, btree_id, flags);
|
|
-}
|
|
-
|
|
static inline void bch2_trans_iter_init_common(struct btree_trans *trans,
|
|
struct btree_iter *iter,
|
|
unsigned btree_id, struct bpos pos,
|
|
@@ -517,7 +511,7 @@ static inline void bch2_trans_iter_init(struct btree_trans *trans,
|
|
if (__builtin_constant_p(btree_id) &&
|
|
__builtin_constant_p(flags))
|
|
bch2_trans_iter_init_common(trans, iter, btree_id, pos, 0, 0,
|
|
- bch2_btree_iter_flags(trans, btree_id, flags),
|
|
+ bch2_btree_iter_flags(trans, btree_id, 0, flags),
|
|
_THIS_IP_);
|
|
else
|
|
bch2_trans_iter_init_outlined(trans, iter, btree_id, pos, flags);
|
|
--
|
|
2.45.2
|
|
|