bcachefs: Don't ratelimit certain fsck errors
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 21 Jun 2021 20:28:43 +0000 (16:28 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:07 +0000 (17:09 -0400)
It's unhelpful if we see "Halting mark and sweep to start topology
repair" but we don't see the error that triggered it.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/btree_gc.c
fs/bcachefs/error.c
fs/bcachefs/error.h

index 480d4afb9aae30aa82fa4ffdc6095c887a9af5d6..de0d88a64244167495818d486ab5f75cd8777d02 100644 (file)
@@ -86,12 +86,16 @@ static int bch2_gc_check_topology(struct bch_fs *c,
                if (bpos_cmp(expected_start, bp->v.min_key)) {
                        bch2_topology_error(c);
 
-                       if (fsck_err(c, "btree node with incorrect min_key at btree %s level %u:\n"
-                                    "  prev %s\n"
-                                    "  cur %s",
-                                    bch2_btree_ids[b->c.btree_id], b->c.level,
-                                    buf1,
-                                    (bch2_bkey_val_to_text(&PBUF(buf2), c, bkey_i_to_s_c(cur.k)), buf2))) {
+                       if (__fsck_err(c,
+                                 FSCK_CAN_FIX|
+                                 FSCK_CAN_IGNORE|
+                                 FSCK_NO_RATELIMIT,
+                                 "btree node with incorrect min_key at btree %s level %u:\n"
+                                 "  prev %s\n"
+                                 "  cur %s",
+                                 bch2_btree_ids[b->c.btree_id], b->c.level,
+                                 buf1,
+                                 (bch2_bkey_val_to_text(&PBUF(buf2), c, bkey_i_to_s_c(cur.k)), buf2))) {
                                bch_info(c, "Halting mark and sweep to start topology repair pass");
                                return FSCK_ERR_START_TOPOLOGY_REPAIR;
                        } else {
@@ -103,12 +107,16 @@ static int bch2_gc_check_topology(struct bch_fs *c,
        if (is_last && bpos_cmp(cur.k->k.p, node_end)) {
                bch2_topology_error(c);
 
-               if (fsck_err(c, "btree node with incorrect max_key at btree %s level %u:\n"
-                            "  %s\n"
-                            "  expected %s",
-                            bch2_btree_ids[b->c.btree_id], b->c.level,
-                            (bch2_bkey_val_to_text(&PBUF(buf1), c, bkey_i_to_s_c(cur.k)), buf1),
-                            (bch2_bpos_to_text(&PBUF(buf2), node_end), buf2))) {
+               if (__fsck_err(c,
+                         FSCK_CAN_FIX|
+                         FSCK_CAN_IGNORE|
+                         FSCK_NO_RATELIMIT,
+                         "btree node with incorrect max_key at btree %s level %u:\n"
+                         "  %s\n"
+                         "  expected %s",
+                         bch2_btree_ids[b->c.btree_id], b->c.level,
+                         (bch2_bkey_val_to_text(&PBUF(buf1), c, bkey_i_to_s_c(cur.k)), buf1),
+                         (bch2_bpos_to_text(&PBUF(buf2), node_end), buf2))) {
                        bch_info(c, "Halting mark and sweep to start topology repair pass");
                        return FSCK_ERR_START_TOPOLOGY_REPAIR;
                } else {
@@ -884,11 +892,15 @@ static int bch2_gc_btree_init_recurse(struct bch_fs *c, struct btree *b,
                        if (ret == -EIO) {
                                bch2_topology_error(c);
 
-                               if (fsck_err(c, "Unreadable btree node at btree %s level %u:\n"
-                                       "  %s",
-                                       bch2_btree_ids[b->c.btree_id],
-                                       b->c.level - 1,
-                                       (bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(cur.k)), buf))) {
+                               if (__fsck_err(c,
+                                         FSCK_CAN_FIX|
+                                         FSCK_CAN_IGNORE|
+                                         FSCK_NO_RATELIMIT,
+                                         "Unreadable btree node at btree %s level %u:\n"
+                                         "  %s",
+                                         bch2_btree_ids[b->c.btree_id],
+                                         b->c.level - 1,
+                                         (bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(cur.k)), buf))) {
                                        ret = FSCK_ERR_START_TOPOLOGY_REPAIR;
                                        bch_info(c, "Halting mark and sweep to start topology repair pass");
                                        goto fsck_err;
index 90c3b986c264020253a2938941c6c9e6b1ae9bdf..2cea694575e99a4df6c4af282c76cbc77230f06e 100644 (file)
@@ -111,6 +111,7 @@ found:
        list_move(&s->list, &c->fsck_errors);
        s->nr++;
        if (c->opts.ratelimit_errors &&
+           !(flags & FSCK_NO_RATELIMIT) &&
            s->nr >= FSCK_ERR_RATELIMIT_NR) {
                if (s->nr == FSCK_ERR_RATELIMIT_NR)
                        suppressing = true;
index d8cd19b3f63c83c73b675b54ed767607eb638cf9..986938298adc4d4e8e5e35c2a7555e2f338741c6 100644 (file)
@@ -104,6 +104,7 @@ struct fsck_err_state {
 #define FSCK_CAN_FIX           (1 << 0)
 #define FSCK_CAN_IGNORE                (1 << 1)
 #define FSCK_NEED_FSCK         (1 << 2)
+#define FSCK_NO_RATELIMIT      (1 << 3)
 
 __printf(3, 4) __cold
 enum fsck_err_ret bch2_fsck_err(struct bch_fs *,