From 537c49d6afadb4be54be03c9a8cb1f1ade07b104 Mon Sep 17 00:00:00 2001
From: Kent Overstreet <kent.overstreet@gmail.com>
Date: Fri, 11 Dec 2020 12:02:48 -0500
Subject: [PATCH] bcachefs: Fix btree node merge -> split operations

If a btree node merger is followed by a split or compact of the parent
node, we could end up with the parent btree node iterator pointing to
the whiteout inserted by the btree node merge operation - the fix is to
ensure that interior btree node iterators always point to the first non
whiteout.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
---
 fs/bcachefs/btree_iter.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 239d7c5deddc5..c0333ee94463f 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -902,6 +902,13 @@ static inline void __btree_iter_init(struct btree_iter *iter,
 
 	bch2_btree_node_iter_init(&l->iter, l->b, &pos);
 
+	/*
+	 * Iterators to interior nodes should always be pointed at the first non
+	 * whiteout:
+	 */
+	if (level)
+		bch2_btree_node_iter_peek(&l->iter, l->b);
+
 	btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
 }
 
-- 
2.30.2