bcachefs: Don't log fsck err in the journal if doing repair elsewhere
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 19 Jun 2025 16:50:06 +0000 (12:50 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 19 Jun 2025 17:08:07 +0000 (13:08 -0400)
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>
fs/bcachefs/alloc_background.c
fs/bcachefs/btree_iter.c
fs/bcachefs/error.c
fs/bcachefs/sb-errors_format.h

index b228a5a64479c954a62124d2989568bc597f954e..66de463186209cd01971beb3f2d534adc3839698 100644 (file)
@@ -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),
index 061603999ae57b1ca87efb0d50a4f777438b7a45..352f9cd2634ffb42385c8188a2c69038bb419713 100644 (file)
@@ -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);
index a8ec6aae57383fd875d95b131b8124e588c3b762..b2a6c041e165dfdd84cfb9f8e4ae5b6987ea6990 100644 (file)
@@ -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);
index f1aa40542a0e6e7eb7c1861589166e8575892bd6..041887aad63a4911ae8133d3fcd17e5f66ad7a14 100644 (file)
@@ -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()                                                                  \