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>
}
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);
* 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);
(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;