--- /dev/null
+From 63c3b8f616cc95bb1fcc6101c92485d41c535d7c Mon Sep 17 00:00:00 2001
+From: Kent Overstreet <kent.overstreet@linux.dev>
+Date: Sat, 29 Mar 2025 14:22:29 -0400
+Subject: bcachefs: Change btree_insert_node() assertion to error
+
+From: Kent Overstreet <kent.overstreet@linux.dev>
+
+commit 63c3b8f616cc95bb1fcc6101c92485d41c535d7c upstream.
+
+Debug for https://github.com/koverstreet/bcachefs/issues/843
+
+Print useful debug info and go emergency read-only.
+
+Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/bcachefs/btree_update_interior.c | 17 ++++++++++++++++-
+ fs/bcachefs/error.c | 8 ++++++++
+ fs/bcachefs/error.h | 2 ++
+ 3 files changed, 26 insertions(+), 1 deletion(-)
+
+--- a/fs/bcachefs/btree_update_interior.c
++++ b/fs/bcachefs/btree_update_interior.c
+@@ -35,6 +35,8 @@ static const char * const bch2_btree_upd
+ NULL
+ };
+
++static void bch2_btree_update_to_text(struct printbuf *, struct btree_update *);
++
+ static int bch2_btree_insert_node(struct btree_update *, struct btree_trans *,
+ btree_path_idx_t, struct btree *, struct keylist *);
+ static void bch2_btree_update_add_new_node(struct btree_update *, struct btree *);
+@@ -1782,11 +1784,24 @@ static int bch2_btree_insert_node(struct
+ int ret;
+
+ lockdep_assert_held(&c->gc_lock);
+- BUG_ON(!btree_node_intent_locked(path, b->c.level));
+ BUG_ON(!b->c.level);
+ BUG_ON(!as || as->b);
+ bch2_verify_keylist_sorted(keys);
+
++ if (!btree_node_intent_locked(path, b->c.level)) {
++ struct printbuf buf = PRINTBUF;
++ bch2_log_msg_start(c, &buf);
++ prt_printf(&buf, "%s(): node not locked at level %u\n",
++ __func__, b->c.level);
++ bch2_btree_update_to_text(&buf, as);
++ bch2_btree_path_to_text(&buf, trans, path_idx);
++
++ bch2_print_string_as_lines(KERN_ERR, buf.buf);
++ printbuf_exit(&buf);
++ bch2_fs_emergency_read_only(c);
++ return -EIO;
++ }
++
+ ret = bch2_btree_node_lock_write(trans, path, &b->c);
+ if (ret)
+ return ret;
+--- a/fs/bcachefs/error.c
++++ b/fs/bcachefs/error.c
+@@ -11,6 +11,14 @@
+
+ #define FSCK_ERR_RATELIMIT_NR 10
+
++void bch2_log_msg_start(struct bch_fs *c, struct printbuf *out)
++{
++#ifdef BCACHEFS_LOG_PREFIX
++ prt_printf(out, bch2_log_msg(c, ""));
++#endif
++ printbuf_indent_add(out, 2);
++}
++
+ bool bch2_inconsistent_error(struct bch_fs *c)
+ {
+ set_bit(BCH_FS_error, &c->flags);
+--- a/fs/bcachefs/error.h
++++ b/fs/bcachefs/error.h
+@@ -18,6 +18,8 @@ struct work_struct;
+
+ /* Error messages: */
+
++void bch2_log_msg_start(struct bch_fs *, struct printbuf *);
++
+ /*
+ * Inconsistency errors: The on disk data is inconsistent. If these occur during
+ * initial recovery, they don't indicate a bug in the running code - we walk all