From d7f35163e61d962132539e38be89330834a8455b Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 9 Apr 2021 16:52:30 -0400 Subject: [PATCH] bcachefs: Fix BTREE_ITER_NOT_EXTENTS bch2_btree_iter_peek() wasn't properly checking for BTREE_ITER_IS_EXTENTS when updating iter->pos. Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- fs/bcachefs/btree_gc.c | 2 +- fs/bcachefs/btree_iter.c | 4 +++- fs/bcachefs/btree_types.h | 4 ++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c index f810ad410cd1b..bf40efcaa1927 100644 --- a/fs/bcachefs/btree_gc.c +++ b/fs/bcachefs/btree_gc.c @@ -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); diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 8f5318a38d9bd..ae2e907adc73e 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -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); diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 9db22b35b7804..493d65882222f 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -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; -- 2.30.2