bcachefs: bch2_print_opts()
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 12 Feb 2024 22:15:29 +0000 (17:15 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:24 +0000 (21:22 -0400)
Make sure early error messages get redirected, for
kernel-fsck-from-userland.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs.h
fs/bcachefs/super-io.c
fs/bcachefs/super.c

index 1391c530d8d2bd8ebc2ac41113ded46a95e4f17d..ca80ecf3b8bce0aeef6f4e83a05e51cf257a1dd9 100644 (file)
@@ -265,6 +265,9 @@ do {                                                                        \
 
 #define bch2_fmt(_c, fmt)              bch2_log_msg(_c, fmt "\n")
 
+__printf(2, 3)
+void bch2_print_opts(struct bch_opts *, const char *, ...);
+
 __printf(2, 3)
 void __bch2_print(struct bch_fs *c, const char *fmt, ...);
 
index 36988add581fb57ceb69fd564e770a059f184c42..a3a9e85ab03c0b3eb288255eda63bceede7af487 100644 (file)
@@ -717,6 +717,7 @@ retry:
 
        if (IS_ERR(sb->bdev_handle)) {
                ret = PTR_ERR(sb->bdev_handle);
+               prt_printf(&err, "error opening %s: %s", path, bch2_err_str(ret));
                goto err;
        }
        sb->bdev = sb->bdev_handle->bdev;
@@ -743,9 +744,9 @@ retry:
        prt_printf(&err2, "bcachefs (%s): error reading default superblock: %s\n",
               path, err.buf);
        if (ret == -BCH_ERR_invalid_sb_magic && ignore_notbchfs_msg)
-               printk(KERN_INFO "%s", err2.buf);
+               bch2_print_opts(opts, KERN_INFO "%s", err2.buf);
        else
-               printk(KERN_ERR "%s", err2.buf);
+               bch2_print_opts(opts, KERN_ERR "%s", err2.buf);
 
        printbuf_exit(&err2);
        printbuf_reset(&err);
@@ -808,16 +809,16 @@ got_super:
 
        ret = bch2_sb_validate(sb, &err, READ);
        if (ret) {
-               printk(KERN_ERR "bcachefs (%s): error validating superblock: %s\n",
-                      path, err.buf);
+               bch2_print_opts(opts, KERN_ERR "bcachefs (%s): error validating superblock: %s\n",
+                               path, err.buf);
                goto err_no_print;
        }
 out:
        printbuf_exit(&err);
        return ret;
 err:
-       printk(KERN_ERR "bcachefs (%s): error reading superblock: %s\n",
-              path, err.buf);
+       bch2_print_opts(opts, KERN_ERR "bcachefs (%s): error reading superblock: %s\n",
+                       path, err.buf);
 err_no_print:
        bch2_free_super(sb);
        goto out;
index 6c0d5dcbc7a3643eb854d2ce82e9fe17464b12e0..961b25860c3bef7239bf101a2bdb09261c63167d 100644 (file)
@@ -87,6 +87,23 @@ const char * const bch2_fs_flag_strs[] = {
        NULL
 };
 
+void bch2_print_opts(struct bch_opts *opts, const char *fmt, ...)
+{
+       struct stdio_redirect *stdio = (void *)(unsigned long)opts->stdio;
+
+       va_list args;
+       va_start(args, fmt);
+       if (likely(!stdio)) {
+               vprintk(fmt, args);
+       } else {
+               if (fmt[0] == KERN_SOH[0])
+                       fmt += 2;
+
+               bch2_stdio_redirect_vprintf(stdio, true, fmt, args);
+       }
+       va_end(args);
+}
+
 void __bch2_print(struct bch_fs *c, const char *fmt, ...)
 {
        struct stdio_redirect *stdio = bch2_fs_stdio_redirect(c);