mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-08 12:52:40 -04:00
bcachefs: print_str_as_lines() -> print_str()
bch2_print_string_as_lines() is a low level helper that allows messages longer than 1k to be printed without truncation. But we should always be printing with the helpers that take a filesystem object, if we're in fsck they direct output to the userspace process controlling fsck instead of the dmesg log. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
@@ -1664,7 +1664,7 @@ static noinline void bch2_print_allocator_stuck(struct bch_fs *c)
|
||||
bch2_journal_debug_to_text(&buf, &c->journal);
|
||||
printbuf_indent_sub(&buf, 2);
|
||||
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -269,7 +269,8 @@ do { \
|
||||
|
||||
#define bch2_fmt(_c, fmt) bch2_log_msg(_c, fmt "\n")
|
||||
|
||||
void bch2_print_str(struct bch_fs *, const char *);
|
||||
void bch2_print_str(struct bch_fs *, const char *, const char *);
|
||||
void bch2_print_str_nonblocking(struct bch_fs *, const char *, const char *);
|
||||
|
||||
__printf(2, 3)
|
||||
void bch2_print_opts(struct bch_opts *, const char *, ...);
|
||||
|
||||
@@ -605,7 +605,7 @@ static int __btree_err(int ret,
|
||||
}
|
||||
|
||||
if (!silent)
|
||||
bch2_print_string_as_lines(KERN_ERR, out.buf);
|
||||
bch2_print_str(c, KERN_ERR, out.buf);
|
||||
out:
|
||||
fsck_err:
|
||||
printbuf_exit(&out);
|
||||
|
||||
@@ -1591,7 +1591,7 @@ void __bch2_dump_trans_paths_updates(struct btree_trans *trans, bool nosort)
|
||||
__bch2_trans_paths_to_text(&buf, trans, nosort);
|
||||
bch2_trans_updates_to_text(&buf, trans);
|
||||
|
||||
bch2_print_str(trans->c, buf.buf);
|
||||
bch2_print_str(trans->c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
}
|
||||
|
||||
@@ -3121,7 +3121,7 @@ void *__bch2_trans_kmalloc(struct btree_trans *trans, size_t size, unsigned long
|
||||
#ifdef CONFIG_BCACHEFS_TRANS_KMALLOC_TRACE
|
||||
struct printbuf buf = PRINTBUF;
|
||||
bch2_trans_kmalloc_trace_to_text(&buf, &trans->trans_kmalloc_trace);
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -236,7 +236,7 @@ static noinline int break_cycle(struct lock_graph *g, struct printbuf *cycle,
|
||||
prt_newline(&buf);
|
||||
}
|
||||
|
||||
bch2_print_string_as_lines_nonblocking(KERN_ERR, buf.buf);
|
||||
bch2_print_str_nonblocking(g->g->trans->c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
BUG();
|
||||
}
|
||||
|
||||
@@ -395,7 +395,7 @@ int bch2_scan_for_btree_nodes(struct bch_fs *c)
|
||||
printbuf_reset(&buf);
|
||||
prt_printf(&buf, "%s: nodes found:\n", __func__);
|
||||
found_btree_nodes_to_text(&buf, c, f->nodes);
|
||||
bch2_print_string_as_lines(KERN_INFO, buf.buf);
|
||||
bch2_print_str(c, KERN_INFO, buf.buf);
|
||||
}
|
||||
|
||||
sort_nonatomic(f->nodes.data, f->nodes.nr, sizeof(f->nodes.data[0]), found_btree_node_cmp_cookie, NULL);
|
||||
@@ -424,7 +424,7 @@ int bch2_scan_for_btree_nodes(struct bch_fs *c)
|
||||
printbuf_reset(&buf);
|
||||
prt_printf(&buf, "%s: nodes after merging replicas:\n", __func__);
|
||||
found_btree_nodes_to_text(&buf, c, f->nodes);
|
||||
bch2_print_string_as_lines(KERN_INFO, buf.buf);
|
||||
bch2_print_str(c, KERN_INFO, buf.buf);
|
||||
}
|
||||
|
||||
swap(nodes_heap, f->nodes);
|
||||
@@ -470,7 +470,7 @@ int bch2_scan_for_btree_nodes(struct bch_fs *c)
|
||||
printbuf_reset(&buf);
|
||||
prt_printf(&buf, "%s: nodes found after overwrites:\n", __func__);
|
||||
found_btree_nodes_to_text(&buf, c, f->nodes);
|
||||
bch2_print_string_as_lines(KERN_INFO, buf.buf);
|
||||
bch2_print_str(c, KERN_INFO, buf.buf);
|
||||
} else {
|
||||
bch_info(c, "btree node scan found %zu nodes after overwrites", f->nodes.nr);
|
||||
}
|
||||
|
||||
@@ -1807,7 +1807,7 @@ static int bch2_btree_insert_node(struct btree_update *as, struct btree_trans *t
|
||||
bch2_btree_update_to_text(&buf, as);
|
||||
bch2_btree_path_to_text(&buf, trans, path_idx);
|
||||
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
bch2_fs_emergency_read_only(c);
|
||||
return -EIO;
|
||||
|
||||
@@ -409,7 +409,7 @@ static int bucket_ref_update_err(struct btree_trans *trans, struct printbuf *buf
|
||||
}
|
||||
|
||||
if (print || insert)
|
||||
bch2_print_string_as_lines(KERN_ERR, buf->buf);
|
||||
bch2_print_str(c, KERN_ERR, buf->buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -706,7 +706,7 @@ static int bch2_trigger_stripe_ptr(struct btree_trans *trans,
|
||||
(u64) p.ec.idx);
|
||||
bch2_bkey_val_to_text(&buf, c, k);
|
||||
__bch2_inconsistent_error(c, &buf);
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
return -BCH_ERR_trigger_stripe_pointer;
|
||||
}
|
||||
@@ -976,7 +976,7 @@ static int __bch2_trans_mark_metadata_bucket(struct btree_trans *trans,
|
||||
BCH_RECOVERY_PASS_check_allocations);
|
||||
|
||||
if (print)
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
ret = -BCH_ERR_metadata_bucket_inconsistency;
|
||||
goto err;
|
||||
|
||||
@@ -358,7 +358,7 @@ static int __bch2_data_update_index_update(struct btree_trans *trans,
|
||||
prt_str(&buf, "\nnew: ");
|
||||
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(insert));
|
||||
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
|
||||
bch2_fatal_error(c);
|
||||
|
||||
@@ -34,7 +34,7 @@ bool __bch2_inconsistent_error(struct bch_fs *c, struct printbuf *out)
|
||||
journal_cur_seq(&c->journal));
|
||||
return true;
|
||||
case BCH_ON_ERROR_panic:
|
||||
bch2_print_string_as_lines_nonblocking(KERN_ERR, out->buf);
|
||||
bch2_print_str(c, KERN_ERR, out->buf);
|
||||
panic(bch2_fmt(c, "panic after error"));
|
||||
return true;
|
||||
default:
|
||||
@@ -71,7 +71,7 @@ static bool bch2_fs_trans_inconsistent(struct bch_fs *c, struct btree_trans *tra
|
||||
if (trans)
|
||||
bch2_trans_updates_to_text(&buf, trans);
|
||||
bool ret = __bch2_inconsistent_error(c, &buf);
|
||||
bch2_print_string_as_lines_nonblocking(KERN_ERR, buf.buf);
|
||||
bch2_print_str_nonblocking(c, KERN_ERR, buf.buf);
|
||||
|
||||
printbuf_exit(&buf);
|
||||
return ret;
|
||||
@@ -121,7 +121,7 @@ int bch2_fs_topology_error(struct bch_fs *c, const char *fmt, ...)
|
||||
va_end(args);
|
||||
|
||||
int ret = __bch2_topology_error(c, &buf);
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
|
||||
printbuf_exit(&buf);
|
||||
return ret;
|
||||
@@ -328,7 +328,7 @@ static int do_fsck_ask_yn(struct bch_fs *c,
|
||||
if (bch2_fs_stdio_redirect(c))
|
||||
bch2_print(c, "%s", question->buf);
|
||||
else
|
||||
bch2_print_string_as_lines(KERN_ERR, question->buf);
|
||||
bch2_print_str(c, KERN_ERR, question->buf);
|
||||
|
||||
int ask = bch2_fsck_ask_yn(c, trans);
|
||||
|
||||
@@ -565,7 +565,7 @@ int __bch2_fsck_err(struct bch_fs *c,
|
||||
if (bch2_fs_stdio_redirect(c))
|
||||
bch2_print(c, "%s", out->buf);
|
||||
else
|
||||
bch2_print_string_as_lines(KERN_ERR, out->buf);
|
||||
bch2_print_str(c, KERN_ERR, out->buf);
|
||||
}
|
||||
|
||||
if (s)
|
||||
|
||||
@@ -153,7 +153,7 @@ void __bch2_i_sectors_acct(struct bch_fs *c, struct bch_inode_info *inode,
|
||||
|
||||
bool print = bch2_count_fsck_err(c, vfs_inode_i_blocks_underflow, &buf);
|
||||
if (print)
|
||||
bch2_print_str(c, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
|
||||
if (sectors < 0)
|
||||
@@ -527,7 +527,7 @@ int bchfs_truncate(struct mnt_idmap *idmap,
|
||||
|
||||
bool print = bch2_count_fsck_err(c, vfs_inode_i_blocks_not_zero_at_truncate, &buf);
|
||||
if (print)
|
||||
bch2_print_str(c, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -265,7 +265,7 @@ static inline int bch2_extent_update_i_size_sectors(struct btree_trans *trans,
|
||||
|
||||
bool print = bch2_count_fsck_err(c, inode_i_sectors_underflow, &buf);
|
||||
if (print)
|
||||
bch2_print_str(c, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
|
||||
if (i_sectors_delta < 0)
|
||||
|
||||
@@ -173,7 +173,7 @@ journal_error_check_stuck(struct journal *j, int error, unsigned flags)
|
||||
spin_unlock(&j->lock);
|
||||
prt_printf(&buf, bch2_fmt(c, "Journal stuck! Hava a pre-reservation but journal full (error %s)"),
|
||||
bch2_err_str(error));
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
|
||||
printbuf_reset(&buf);
|
||||
bch2_journal_pins_to_text(&buf, j);
|
||||
@@ -743,7 +743,7 @@ int bch2_journal_res_get_slowpath(struct journal *j, struct journal_res *res,
|
||||
|
||||
struct printbuf buf = PRINTBUF;
|
||||
bch2_journal_debug_to_text(&buf, j);
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
prt_printf(&buf, bch2_fmt(c, "Journal stuck? Waited for 10 seconds, err %s"), bch2_err_str(ret));
|
||||
printbuf_exit(&buf);
|
||||
|
||||
|
||||
@@ -2107,7 +2107,7 @@ CLOSURE_CALLBACK(bch2_journal_write)
|
||||
le64_to_cpu(w->data->seq),
|
||||
vstruct_sectors(w->data, c->block_bits),
|
||||
bch2_err_str(ret));
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
}
|
||||
if (ret)
|
||||
|
||||
@@ -163,7 +163,7 @@ int bch2_run_explicit_recovery_pass(struct bch_fs *c,
|
||||
int ret = bch2_run_explicit_recovery_pass_printbuf(c, &buf, pass);
|
||||
|
||||
if (len != buf.pos)
|
||||
bch2_print_string_as_lines(KERN_NOTICE, buf.buf);
|
||||
bch2_print_str(c, KERN_NOTICE, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ int bch2_dev_missing_bkey(struct bch_fs *c, struct bkey_s_c k, unsigned dev)
|
||||
BCH_RECOVERY_PASS_check_allocations);
|
||||
|
||||
if (print)
|
||||
bch2_print_string_as_lines(KERN_ERR, buf.buf);
|
||||
bch2_print_str(c, KERN_ERR, buf.buf);
|
||||
printbuf_exit(&buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -84,7 +84,8 @@ const char * const bch2_fs_flag_strs[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
void bch2_print_str(struct bch_fs *c, const char *str)
|
||||
static void __bch2_print_str(struct bch_fs *c, const char *prefix,
|
||||
const char *str, bool nonblocking)
|
||||
{
|
||||
#ifdef __KERNEL__
|
||||
struct stdio_redirect *stdio = bch2_fs_stdio_redirect(c);
|
||||
@@ -94,7 +95,17 @@ void bch2_print_str(struct bch_fs *c, const char *str)
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
bch2_print_string_as_lines(KERN_ERR, str);
|
||||
bch2_print_string_as_lines(KERN_ERR, str, nonblocking);
|
||||
}
|
||||
|
||||
void bch2_print_str(struct bch_fs *c, const char *prefix, const char *str)
|
||||
{
|
||||
__bch2_print_str(c, prefix, str, false);
|
||||
}
|
||||
|
||||
void bch2_print_str_nonblocking(struct bch_fs *c, const char *prefix, const char *str)
|
||||
{
|
||||
__bch2_print_str(c, prefix, str, true);
|
||||
}
|
||||
|
||||
__printf(2, 0)
|
||||
|
||||
@@ -252,8 +252,8 @@ void bch2_prt_u64_base2(struct printbuf *out, u64 v)
|
||||
bch2_prt_u64_base2_nbits(out, v, fls64(v) ?: 1);
|
||||
}
|
||||
|
||||
static void __bch2_print_string_as_lines(const char *prefix, const char *lines,
|
||||
bool nonblocking)
|
||||
void bch2_print_string_as_lines(const char *prefix, const char *lines,
|
||||
bool nonblocking)
|
||||
{
|
||||
bool locked = false;
|
||||
const char *p;
|
||||
@@ -281,16 +281,6 @@ static void __bch2_print_string_as_lines(const char *prefix, const char *lines,
|
||||
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,
|
||||
gfp_t gfp)
|
||||
{
|
||||
|
||||
@@ -212,8 +212,7 @@ u64 bch2_read_flag_list(const char *, const char * const[]);
|
||||
void bch2_prt_u64_base2_nbits(struct printbuf *, u64, unsigned);
|
||||
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);
|
||||
void bch2_print_string_as_lines(const char *, const char *, bool);
|
||||
|
||||
typedef DARRAY(unsigned long) bch_stacktrace;
|
||||
int bch2_save_backtrace(bch_stacktrace *stack, struct task_struct *, unsigned, gfp_t);
|
||||
|
||||
Reference in New Issue
Block a user