bcachefs: Handle fsck errors at runtime better
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 28 Mar 2019 07:28:59 +0000 (03:28 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:19 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/error.c

index 08e79166dae4c7908bec08f1557bcee5b79d450b..f0a44101b7e7aa45587a0ce8cd94eb2e31a125b0 100644 (file)
@@ -67,10 +67,20 @@ enum fsck_err_ret bch2_fsck_err(struct bch_fs *c, unsigned flags,
        bool fix = false, print = true, suppressing = false;
        char _buf[sizeof(s->buf)], *buf = _buf;
 
-       mutex_lock(&c->fsck_error_lock);
+       if (test_bit(BCH_FS_FSCK_DONE, &c->flags)) {
+               va_start(args, fmt);
+               vprintk(fmt, args);
+               va_end(args);
 
-       if (test_bit(BCH_FS_FSCK_DONE, &c->flags))
-               goto print;
+               if (c->opts.errors == BCH_ON_ERROR_CONTINUE &&
+                   flags & FSCK_CAN_FIX)
+                       return FSCK_ERR_FIX;
+
+               bch2_inconsistent_error(c);
+               return FSCK_ERR_EXIT;
+       }
+
+       mutex_lock(&c->fsck_error_lock);
 
        list_for_each_entry(s, &c->fsck_errors, list)
                if (s->fmt == fmt)