bcachefs: kill __bch2_btree_iter_flags()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 15 Dec 2024 07:24:30 +0000 (02:24 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 10 Jan 2025 04:38:41 +0000 (23:38 -0500)
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>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h

index a1c5fcced24e4ff11d96c5fc39d74b9f5d5aee76..291eb5eb0203cb0a4f846474dc94840fa2eb5ba9 100644 (file)
@@ -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;
index 3477fc8c039618d45b2ad741ce95bda32e9d0e41..e23608d2a26dd5856d08efa2bdffa29b7ade702e 100644 (file)
@@ -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);