struct bkey_s_c k, bool insert, enum bch_sb_error_id id)
 {
        struct bch_fs *c = trans->c;
-       bool repeat = false, print = true, suppress = false;
 
        prt_printf(buf, "\nwhile marking ");
        bch2_bkey_val_to_text(buf, c, k);
        prt_newline(buf);
 
-       __bch2_count_fsck_err(c, id, buf->buf, &repeat, &print, &suppress);
+       bool print = __bch2_count_fsck_err(c, id, buf);
 
        int ret = bch2_run_explicit_recovery_pass_printbuf(c, buf,
                                        BCH_RECOVERY_PASS_check_allocations);
 
        if (insert) {
-               print = true;
-               suppress = false;
-
                bch2_trans_updates_to_text(buf, trans);
                __bch2_inconsistent_error(c, buf);
                ret = -BCH_ERR_bucket_ref_update;
        }
 
-       if (suppress)
-               prt_printf(buf, "Ratelimiting new instances of previous error\n");
-       if (print)
+       if (print || insert)
                bch2_print_string_as_lines(KERN_ERR, buf->buf);
        return ret;
 }
                           bch2_data_type_str(type),
                           bch2_data_type_str(type));
 
-               bool repeat = false, print = true, suppress = false;
-               bch2_count_fsck_err(c, bucket_metadata_type_mismatch, buf.buf,
-                                   &repeat, &print, &suppress);
+               bool print = bch2_count_fsck_err(c, bucket_metadata_type_mismatch, &buf);
 
                bch2_run_explicit_recovery_pass_printbuf(c, &buf,
                                        BCH_RECOVERY_PASS_check_allocations);
 
-               if (suppress)
-                       prt_printf(&buf, "Ratelimiting new instances of previous error\n");
                if (print)
                        bch2_print_string_as_lines(KERN_ERR, buf.buf);
                printbuf_exit(&buf);
 
        return s;
 }
 
-void __bch2_count_fsck_err(struct bch_fs *c,
-                          enum bch_sb_error_id id, const char *msg,
-                          bool *repeat, bool *print, bool *suppress)
+bool __bch2_count_fsck_err(struct bch_fs *c,
+                          enum bch_sb_error_id id, struct printbuf *msg)
 {
        bch2_sb_error_count(c, id);
 
        mutex_lock(&c->fsck_error_msgs_lock);
-       count_fsck_err_locked(c, id, msg, repeat, print, suppress);
+       bool print = true, repeat = false, suppress = false;
+
+       count_fsck_err_locked(c, id, msg->buf, &repeat, &print, &suppress);
        mutex_unlock(&c->fsck_error_msgs_lock);
+
+       if (suppress)
+               prt_printf(msg, "Ratelimiting new instances of previous error\n");
+
+       return print && !repeat;
 }
 
 int __bch2_fsck_err(struct bch_fs *c,
 
 
 #define fsck_err_count(_c, _err)       bch2_sb_err_count(_c, BCH_FSCK_ERR_##_err)
 
-void __bch2_count_fsck_err(struct bch_fs *,
-                          enum bch_sb_error_id, const char *,
-                          bool *, bool *, bool *);
+bool __bch2_count_fsck_err(struct bch_fs *, enum bch_sb_error_id, struct printbuf *);
 #define bch2_count_fsck_err(_c, _err, ...)                             \
        __bch2_count_fsck_err(_c, BCH_FSCK_ERR_##_err, __VA_ARGS__)
 
 
                           inode->v.i_ino, (u64) inode->v.i_blocks, sectors,
                           inode->ei_inode.bi_sectors);
 
-               bool repeat = false, print = false, suppress = false;
-               bch2_count_fsck_err(c, vfs_inode_i_blocks_underflow, buf.buf, &repeat, &print, &suppress);
+               bool print = bch2_count_fsck_err(c, vfs_inode_i_blocks_underflow, &buf);
                if (print)
                        bch2_print_str(c, buf.buf);
                printbuf_exit(&buf);
                           inode->v.i_ino, (u64) inode->v.i_blocks,
                           inode->ei_inode.bi_sectors);
 
-               bool repeat = false, print = false, suppress = false;
-               bch2_count_fsck_err(c, vfs_inode_i_blocks_not_zero_at_truncate, buf.buf,
-                                   &repeat, &print, &suppress);
+               bool print = bch2_count_fsck_err(c, vfs_inode_i_blocks_not_zero_at_truncate, &buf);
                if (print)
                        bch2_print_str(c, buf.buf);
                printbuf_exit(&buf);
 
                        prt_printf(&buf, "inode %llu i_sectors underflow: %lli + %lli < 0",
                                   extent_iter->pos.inode, bi_sectors, i_sectors_delta);
 
-                       bool repeat = false, print = false, suppress = false;
-                       bch2_count_fsck_err(c, inode_i_sectors_underflow, buf.buf,
-                                           &repeat, &print, &suppress);
+                       bool print = bch2_count_fsck_err(c, inode_i_sectors_underflow, &buf);
                        if (print)
                                bch2_print_str(c, buf.buf);
                        printbuf_exit(&buf);