bcachefs: Fix BTREE_ITER_NOT_EXTENTS
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 9 Apr 2021 20:52:30 +0000 (16:52 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:59 +0000 (17:08 -0400)
bch2_btree_iter_peek() wasn't properly checking for
BTREE_ITER_IS_EXTENTS when updating iter->pos.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_types.h

index f810ad410cd1b292abc7e59582d1627404acd13f..bf40efcaa19273987d68bb00fb413e2e238283cb 100644 (file)
@@ -1243,7 +1243,7 @@ int bch2_gc_gens(struct bch_fs *c)
        }
 
        for (i = 0; i < BTREE_ID_NR; i++)
-               if (btree_node_type_needs_gc(i)) {
+               if ((1 << i) & BTREE_ID_HAS_PTRS) {
                        ret = bch2_gc_btree_gens(c, i);
                        if (ret) {
                                bch_err(c, "error recalculating oldest_gen: %i", ret);
index 8f5318a38d9bd4cbad8876b1ea07ead641d135e0..ae2e907adc73e12a60df6672f9f6c537b9b0411b 100644 (file)
@@ -1641,7 +1641,9 @@ static inline struct bkey_s_c __btree_iter_peek(struct btree_iter *iter, bool wi
         * iter->pos should be mononotically increasing, and always be equal to
         * the key we just returned - except extents can straddle iter->pos:
         */
-       if (bkey_cmp(bkey_start_pos(k.k), iter->pos) > 0)
+       if (!(iter->flags & BTREE_ITER_IS_EXTENTS))
+               iter->pos = k.k->p;
+       else if (bkey_cmp(bkey_start_pos(k.k), iter->pos) > 0)
                iter->pos = bkey_start_pos(k.k);
 
        bch2_btree_iter_verify_entry_exit(iter);
index 9db22b35b7804dd54d80219674a8a9b13dac4bdc..493d65882222fc5151995a03c1c7073c5b96b7f8 100644 (file)
@@ -616,6 +616,10 @@ static inline bool btree_iter_is_extents(struct btree_iter *iter)
         (1U << BTREE_ID_dirents)|                      \
         (1U << BTREE_ID_xattrs))
 
+#define BTREE_ID_HAS_PTRS                              \
+       ((1U << BTREE_ID_extents)|                      \
+        (1U << BTREE_ID_reflink))
+
 static inline bool btree_type_has_snapshots(enum btree_id id)
 {
        return (1 << id) & BTREE_ID_HAS_SNAPSHOTS;