]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
bcachefs: Check for bad write buffer key when moving from journal
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 23 Jun 2025 22:42:42 +0000 (18:42 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Tue, 24 Jun 2025 19:48:00 +0000 (15:48 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update.h
fs/bcachefs/btree_write_buffer.c
fs/bcachefs/btree_write_buffer.h

index 9feef1dc4de594f9d5b40d3524ed6ef099f6f303..0b98ab959719ac8f35669ceff3dbb0ee38316e3b 100644 (file)
@@ -170,8 +170,7 @@ bch2_trans_jset_entry_alloc(struct btree_trans *trans, unsigned u64s)
 
 int bch2_btree_insert_clone_trans(struct btree_trans *, enum btree_id, struct bkey_i *);
 
-int bch2_btree_write_buffer_insert_err(struct btree_trans *,
-                                      enum btree_id, struct bkey_i *);
+int bch2_btree_write_buffer_insert_err(struct bch_fs *, enum btree_id, struct bkey_i *);
 
 static inline int __must_check bch2_trans_update_buffered(struct btree_trans *trans,
                                            enum btree_id btree,
@@ -182,7 +181,7 @@ static inline int __must_check bch2_trans_update_buffered(struct btree_trans *tr
        EBUG_ON(k->k.u64s > BTREE_WRITE_BUFERED_U64s_MAX);
 
        if (unlikely(!btree_type_uses_write_buffer(btree))) {
-               int ret = bch2_btree_write_buffer_insert_err(trans, btree, k);
+               int ret = bch2_btree_write_buffer_insert_err(trans->c, btree, k);
                dump_stack();
                return ret;
        }
index 21b5c03d1822b8d6b36ddbd9a98867eefa23023f..4b095235a0d2210935fc555c552b2ff3b6d0556c 100644 (file)
@@ -267,10 +267,9 @@ out:
        BUG_ON(wb->sorted.size < wb->flushing.keys.nr);
 }
 
-int bch2_btree_write_buffer_insert_err(struct btree_trans *trans,
+int bch2_btree_write_buffer_insert_err(struct bch_fs *c,
                                       enum btree_id btree, struct bkey_i *k)
 {
-       struct bch_fs *c = trans->c;
        struct printbuf buf = PRINTBUF;
 
        prt_printf(&buf, "attempting to do write buffer update on non wb btree=");
@@ -332,7 +331,7 @@ static int bch2_btree_write_buffer_flush_locked(struct btree_trans *trans)
                struct btree_write_buffered_key *k = &wb->flushing.keys.data[i->idx];
 
                if (unlikely(!btree_type_uses_write_buffer(k->btree))) {
-                       ret = bch2_btree_write_buffer_insert_err(trans, k->btree, &k->k);
+                       ret = bch2_btree_write_buffer_insert_err(trans->c, k->btree, &k->k);
                        goto err;
                }
 
index 05f56fd1eed0365aa9502920bc0e0c686a9117f8..c351d21aca0b8888143b56c589c5c1526cbff469 100644 (file)
@@ -89,6 +89,12 @@ static inline int bch2_journal_key_to_wb(struct bch_fs *c,
                             struct journal_keys_to_wb *dst,
                             enum btree_id btree, struct bkey_i *k)
 {
+       if (unlikely(!btree_type_uses_write_buffer(btree))) {
+               int ret = bch2_btree_write_buffer_insert_err(c, btree, k);
+               dump_stack();
+               return ret;
+       }
+
        EBUG_ON(!dst->seq);
 
        return k->k.type == KEY_TYPE_accounting