mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
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: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
@@ -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,9 +1422,10 @@ 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,
|
||||
"entry in %s btree for nonexistant dev:bucket %llu:%llu",
|
||||
bch2_btree_id_str(iter->btree_id), bucket.inode, bucket.offset))
|
||||
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;
|
||||
ret = 1;
|
||||
goto out;
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -621,7 +621,9 @@ print:
|
||||
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);
|
||||
|
||||
@@ -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() \
|
||||
|
||||
Reference in New Issue
Block a user