bcachefs: Don't error out when logging fsck error
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 28 Nov 2024 21:14:06 +0000 (16:14 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:20 +0000 (01:36 -0500)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/error.c
fs/bcachefs/error.h

index 79af226ca609a0f5fa8c9362460dfab2c557cdeb..6de0387ede999f884a33cbc70ba32930b4369c0b 100644 (file)
@@ -676,6 +676,10 @@ static int __need_discard_or_freespace_err(struct btree_trans *trans,
                                  set ? "" : "un",
                                  bch2_btree_id_str(btree),
                                  buf.buf);
+       if (ret == -BCH_ERR_fsck_ignore ||
+           ret == -BCH_ERR_fsck_errors_not_fixed)
+               ret = 0;
+
        printbuf_exit(&buf);
        return ret;
 }
@@ -1901,10 +1905,8 @@ static int bch2_do_discards_fast_one(struct btree_trans *trans,
        if (log_fsck_err_on(discard_k.k->type != KEY_TYPE_set,
                            trans, discarding_bucket_not_in_need_discard_btree,
                            "attempting to discard bucket %u:%llu not in need_discard btree",
-                           ca->dev_idx, bucket)) {
-               /* log it in the superblock and continue: */
+                           ca->dev_idx, bucket))
                goto out;
-       }
 
        ret = bch2_discard_one_bucket(trans, ca, &need_discard_iter, discard_pos_done, s, true);
 out:
index 5b67361b0cf196a03cef153af0674a0986f9f0ea..23b9ecbcf3cf78938e5a3250205b2b43ff940895 100644 (file)
@@ -227,7 +227,7 @@ int __bch2_fsck_err(struct bch_fs *c,
 {
        struct fsck_err_state *s = NULL;
        va_list args;
-       bool print = true, suppressing = false, inconsistent = false;
+       bool print = true, suppressing = false, inconsistent = false, exiting = false;
        struct printbuf buf = PRINTBUF, *out = &buf;
        int ret = -BCH_ERR_fsck_ignore;
        const char *action_orig = "fix?", *action = action_orig;
@@ -320,13 +320,19 @@ int __bch2_fsck_err(struct bch_fs *c,
                prt_printf(out, bch2_log_msg(c, ""));
 #endif
 
-       if ((flags & FSCK_CAN_FIX) &&
-           (flags & FSCK_AUTOFIX) &&
+       if ((flags & FSCK_AUTOFIX) &&
            (c->opts.errors == BCH_ON_ERROR_continue ||
             c->opts.errors == BCH_ON_ERROR_fix_safe)) {
                prt_str(out, ", ");
-               prt_actioning(out, action);
-               ret = -BCH_ERR_fsck_fix;
+               if (flags & FSCK_CAN_FIX) {
+                       prt_actioning(out, action);
+                       ret = -BCH_ERR_fsck_fix;
+               } else {
+                       prt_str(out, ", continuing");
+                       ret = -BCH_ERR_fsck_ignore;
+               }
+
+               goto print;
        } else if (!test_bit(BCH_FS_fsck_running, &c->flags)) {
                if (c->opts.errors != BCH_ON_ERROR_continue ||
                    !(flags & (FSCK_CAN_FIX|FSCK_CAN_IGNORE))) {
@@ -396,14 +402,13 @@ int __bch2_fsck_err(struct bch_fs *c,
             !(flags & FSCK_CAN_IGNORE)))
                ret = -BCH_ERR_fsck_errors_not_fixed;
 
-       bool exiting =
-               test_bit(BCH_FS_fsck_running, &c->flags) &&
-               (ret != -BCH_ERR_fsck_fix &&
-                ret != -BCH_ERR_fsck_ignore);
-
-       if (exiting)
+       if (test_bit(BCH_FS_fsck_running, &c->flags) &&
+           (ret != -BCH_ERR_fsck_fix &&
+            ret != -BCH_ERR_fsck_ignore)) {
+               exiting = true;
                print = true;
-
+       }
+print:
        if (print) {
                if (bch2_fs_stdio_redirect(c))
                        bch2_print(c, "%s\n", out->buf);
index 3b278f28e56b61e7dd7670a818c79fb815a2e9a1..12ca5287e20a0cc6dc1cfd06a71ee36f52304e5c 100644 (file)
@@ -45,12 +45,11 @@ int bch2_topology_error(struct bch_fs *);
        bch2_inconsistent_error(c);                                     \
 })
 
-#define bch2_fs_inconsistent_on(cond, c, ...)                          \
+#define bch2_fs_inconsistent_on(cond, ...)                             \
 ({                                                                     \
        bool _ret = unlikely(!!(cond));                                 \
-                                                                       \
        if (_ret)                                                       \
-               bch2_fs_inconsistent(c, __VA_ARGS__);                   \
+               bch2_fs_inconsistent(__VA_ARGS__);                      \
        _ret;                                                           \
 })
 
@@ -146,8 +145,13 @@ void bch2_flush_fsck_errs(struct bch_fs *);
 #define log_fsck_err(c, _err_type, ...)                                        \
        __fsck_err(c, FSCK_CAN_IGNORE, _err_type, __VA_ARGS__)
 
-#define log_fsck_err_on(cond, c, _err_type, ...)                               \
-       __fsck_err_on(cond, c, FSCK_CAN_IGNORE, _err_type, __VA_ARGS__)
+#define log_fsck_err_on(cond, ...)                                     \
+({                                                                     \
+       bool _ret = unlikely(!!(cond));                                 \
+       if (_ret)                                                       \
+               log_fsck_err(__VA_ARGS__);                              \
+       _ret;                                                           \
+})
 
 enum bch_validate_flags;
 __printf(5, 6)