bch2_prt_u64_base2_nbits(out, v, fls64(v) ?: 1);
 }
 
-void bch2_print_string_as_lines(const char *prefix, const char *lines)
+static void __bch2_print_string_as_lines(const char *prefix, const char *lines,
+                                        bool nonblocking)
 {
+       bool locked = false;
        const char *p;
 
        if (!lines) {
                return;
        }
 
-       console_lock();
+       if (!nonblocking) {
+               console_lock();
+               locked = true;
+       } else {
+               locked = console_trylock();
+       }
+
        while (1) {
                p = strchrnul(lines, '\n');
                printk("%s%.*s\n", prefix, (int) (p - lines), lines);
                        break;
                lines = p + 1;
        }
-       console_unlock();
+       if (locked)
+               console_unlock();
+}
+
+void bch2_print_string_as_lines(const char *prefix, const char *lines)
+{
+       return __bch2_print_string_as_lines(prefix, lines, false);
+}
+
+void bch2_print_string_as_lines_nonblocking(const char *prefix, const char *lines)
+{
+       return __bch2_print_string_as_lines(prefix, lines, true);
 }
 
 int bch2_save_backtrace(bch_stacktrace *stack, struct task_struct *task, unsigned skipnr,
 
 void bch2_prt_u64_base2(struct printbuf *, u64);
 
 void bch2_print_string_as_lines(const char *prefix, const char *lines);
+void bch2_print_string_as_lines_nonblocking(const char *prefix, const char *lines);
 
 typedef DARRAY(unsigned long) bch_stacktrace;
 int bch2_save_backtrace(bch_stacktrace *stack, struct task_struct *, unsigned, gfp_t);