Commit 32a01cd4 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Don't log fsck err in the journal if doing repair elsewhere



This fixes exceeding the bump allocator limit when the allocator finds
many buckets that need repair - they're repaired asynchronously, which
means that every error logged a message in the bump allocator, without
committing.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent b2348fe6
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -1406,6 +1406,9 @@ int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_ite
		: BCH_DATA_free;
	struct printbuf buf = PRINTBUF;

	unsigned fsck_flags = (async_repair ? FSCK_ERR_NO_LOG : 0)|
		FSCK_CAN_FIX|FSCK_CAN_IGNORE;

	struct bpos bucket = iter->pos;
	bucket.offset &= ~(~0ULL << 56);
	u64 genbits = iter->pos.offset & (~0ULL << 56);
@@ -1419,7 +1422,8 @@ int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_ite
		return ret;

	if (!bch2_dev_bucket_exists(c, bucket)) {
		if (fsck_err(trans, need_discard_freespace_key_to_invalid_dev_bucket,
		if (__fsck_err(trans, fsck_flags,
			       need_discard_freespace_key_to_invalid_dev_bucket,
			       "entry in %s btree for nonexistant dev:bucket %llu:%llu",
			       bch2_btree_id_str(iter->btree_id), bucket.inode, bucket.offset))
			goto delete;
@@ -1433,7 +1437,8 @@ int bch2_check_discard_freespace_key(struct btree_trans *trans, struct btree_ite
	if (a->data_type != state ||
	    (state == BCH_DATA_free &&
	     genbits != alloc_freespace_genbits(*a))) {
		if (fsck_err(trans, need_discard_freespace_key_bad,
		if (__fsck_err(trans, fsck_flags,
			       need_discard_freespace_key_bad,
			     "%s\nincorrectly set at %s:%llu:%llu:0 (free %u, genbits %llu should be %llu)",
			     (bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf),
			     bch2_btree_id_str(iter->btree_id),
+4 −0
Original line number Diff line number Diff line
@@ -3194,6 +3194,10 @@ void *__bch2_trans_kmalloc(struct btree_trans *trans, size_t size, unsigned long
	if (WARN_ON_ONCE(new_bytes > BTREE_TRANS_MEM_MAX)) {
#ifdef CONFIG_BCACHEFS_TRANS_KMALLOC_TRACE
		struct printbuf buf = PRINTBUF;
		bch2_log_msg_start(c, &buf);
		prt_printf(&buf, "bump allocator exceeded BTREE_TRANS_MEM_MAX (%u)\n",
			   BTREE_TRANS_MEM_MAX);

		bch2_trans_kmalloc_trace_to_text(&buf, &trans->trans_kmalloc_trace);
		bch2_print_str(c, KERN_ERR, buf.buf);
		printbuf_exit(&buf);
+3 −1
Original line number Diff line number Diff line
@@ -621,7 +621,9 @@ int __bch2_fsck_err(struct bch_fs *c,
	if (s)
		s->ret = ret;

	if (trans)
	if (trans &&
	    !(flags & FSCK_ERR_NO_LOG) &&
	    ret == -BCH_ERR_fsck_fix)
		ret = bch2_trans_log_str(trans, bch2_sb_error_strs[err]) ?: ret;
err_unlock:
	mutex_unlock(&c->fsck_error_msgs_lock);
+4 −3
Original line number Diff line number Diff line
@@ -3,9 +3,10 @@
#define _BCACHEFS_SB_ERRORS_FORMAT_H

enum bch_fsck_flags {
	FSCK_CAN_FIX		= 1 << 0,
	FSCK_CAN_IGNORE		= 1 << 1,
	FSCK_AUTOFIX		= 1 << 2,
	FSCK_CAN_FIX		= BIT(0),
	FSCK_CAN_IGNORE		= BIT(1),
	FSCK_AUTOFIX		= BIT(2),
	FSCK_ERR_NO_LOG		= BIT(3),
};

#define BCH_SB_ERRS()									\