Commit 865ad1db authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Check for bad write buffer key when moving from journal

parent 5c4acbc8
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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;
	}
+2 −3
Original line number Diff line number Diff line
@@ -267,10 +267,9 @@ static void move_keys_from_inc_to_flushing(struct btree_write_buffer *wb)
	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;
		}

+6 −0
Original line number Diff line number Diff line
@@ -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