bcachefs: Add an option for fsck error ratelimiting
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 6 Nov 2019 20:32:11 +0000 (15:32 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:31 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/error.c
fs/bcachefs/error.h
fs/bcachefs/opts.h

index 304ff92500be917022bad5e70e6e4c2a1458d8d4..5a5cfee623e2d34f1cbfc682e1feed4b2d23a78c 100644 (file)
@@ -64,7 +64,7 @@ void bch2_io_error(struct bch_dev *ca)
 enum fsck_err_ret bch2_fsck_err(struct bch_fs *c, unsigned flags,
                                const char *fmt, ...)
 {
-       struct fsck_err_state *s;
+       struct fsck_err_state *s = NULL;
        va_list args;
        bool fix = false, print = true, suppressing = false;
        char _buf[sizeof(s->buf)], *buf = _buf;
@@ -99,8 +99,13 @@ enum fsck_err_ret bch2_fsck_err(struct bch_fs *c, unsigned flags,
 found:
        list_move(&s->list, &c->fsck_errors);
        s->nr++;
-       suppressing     = s->nr == FSCK_ERR_RATELIMIT_NR;
-       print           = s->nr <= FSCK_ERR_RATELIMIT_NR;
+       if (c->opts.ratelimit_errors &&
+           s->nr >= FSCK_ERR_RATELIMIT_NR) {
+               if (s->nr == FSCK_ERR_RATELIMIT_NR)
+                       suppressing = true;
+               else
+                       print = false;
+       }
        buf             = s->buf;
 print:
        va_start(args, fmt);
@@ -156,7 +161,7 @@ void bch2_flush_fsck_errs(struct bch_fs *c)
        mutex_lock(&c->fsck_error_lock);
 
        list_for_each_entry_safe(s, n, &c->fsck_errors, list) {
-               if (s->nr > FSCK_ERR_RATELIMIT_NR)
+               if (s->ratelimited)
                        bch_err(c, "Saw %llu errors like:\n    %s", s->nr, s->buf);
 
                list_del(&s->list);
index 2591e12305b710df1ec0e5e1ab8b7e0039e098b0..7dcb0f6552fcc9f5090d233324d33c0e429f327f 100644 (file)
@@ -114,6 +114,7 @@ struct fsck_err_state {
        struct list_head        list;
        const char              *fmt;
        u64                     nr;
+       bool                    ratelimited;
        char                    buf[512];
 };
 
index a6f1d3ec7b9012a5d483e20f5fb0fc682a7d2aa9..2bd8bce432695d768efded6d75d22433ba35f5e0 100644 (file)
@@ -68,6 +68,12 @@ enum opt_type {
  *  - helptext
  */
 
+#ifdef __KERNEL__
+#define RATELIMIT_ERRORS true
+#else
+#define RATELIMIT_ERRORS false
+#endif
+
 #define BCH_OPTS()                                                     \
        x(block_size,                   u16,                            \
          OPT_FORMAT,                                                   \
@@ -227,6 +233,11 @@ enum opt_type {
          OPT_BOOL(),                                                   \
          NO_SB_OPT,                    false,                          \
          NULL,         "Fix errors during fsck without asking")        \
+       x(ratelimit_errors,             u8,                             \
+         OPT_MOUNT,                                                    \
+         OPT_BOOL(),                                                   \
+         NO_SB_OPT,                    RATELIMIT_ERRORS,               \
+         NULL,         "Ratelimit error messages during fsck")         \
        x(nochanges,                    u8,                             \
          OPT_MOUNT,                                                    \
          OPT_BOOL(),                                                   \