From cbdf24cef19be489f6885cecb4887fe407cebdfc Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 21 Aug 2018 17:38:41 -0400 Subject: [PATCH] bcachefs: Fix a btree iter bug when iter pos == POS_MAX Signed-off-by: Kent Overstreet --- fs/bcachefs/btree_iter.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 1ab468a29d21a..1ba59c53c36fb 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -36,7 +36,16 @@ static inline int __btree_iter_pos_cmp(struct btree_iter *iter, return cmp; if (bkey_deleted(k)) return -1; - if (iter->flags & BTREE_ITER_IS_EXTENTS) + + /* + * Normally, for extents we want the first key strictly greater than + * the iterator position - with the exception that for interior nodes, + * we don't want to advance past the last key if the iterator position + * is POS_MAX: + */ + if (iter->flags & BTREE_ITER_IS_EXTENTS && + (!interior_node || + bkey_cmp_left_packed_byval(b, k, POS_MAX))) return -1; return 1; } @@ -691,8 +700,7 @@ static inline bool btree_iter_pos_after_node(struct btree_iter *iter, struct btree *b) { return __btree_iter_pos_cmp(iter, NULL, - bkey_to_packed(&b->key), true) < 0 && - bkey_cmp(b->key.k.p, POS_MAX); + bkey_to_packed(&b->key), true) < 0; } static inline bool btree_iter_pos_in_node(struct btree_iter *iter, -- 2.30.2