mirror of
https://github.com/torvalds/linux.git
synced 2025-11-02 01:29:02 +02:00
bcachefs: Consistent indentation of multiline fsck errors
Add the new helper printbuf_indent_add_nextline(), and use it in __bch2_fsck_err() to centralize setting the indentation of multiline fsck errors. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
a7cdf2276e
commit
1ece53237e
20 changed files with 113 additions and 94 deletions
|
|
@ -676,8 +676,7 @@ static int __need_discard_or_freespace_err(struct btree_trans *trans,
|
|||
bch2_bkey_val_to_text(&buf, c, alloc_k);
|
||||
|
||||
int ret = __bch2_fsck_err(NULL, trans, flags, err_id,
|
||||
"bucket incorrectly %sset in %s btree\n"
|
||||
" %s",
|
||||
"bucket incorrectly %sset in %s btree\n%s",
|
||||
set ? "" : "un",
|
||||
bch2_btree_id_str(btree),
|
||||
buf.buf);
|
||||
|
|
@ -1204,8 +1203,7 @@ int bch2_check_alloc_key(struct btree_trans *trans,
|
|||
|
||||
if (fsck_err_on(a->gen != alloc_gen(k, gens_offset),
|
||||
trans, bucket_gens_key_wrong,
|
||||
"incorrect gen in bucket_gens btree (got %u should be %u)\n"
|
||||
" %s",
|
||||
"incorrect gen in bucket_gens btree (got %u should be %u)\n%s",
|
||||
alloc_gen(k, gens_offset), a->gen,
|
||||
(printbuf_reset(&buf),
|
||||
bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) {
|
||||
|
|
@ -1715,8 +1713,7 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
|
|||
|
||||
if (fsck_err_on(!a->io_time[READ],
|
||||
trans, alloc_key_cached_but_read_time_zero,
|
||||
"cached bucket with read_time 0\n"
|
||||
" %s",
|
||||
"cached bucket with read_time 0\n%s",
|
||||
(printbuf_reset(&buf),
|
||||
bch2_bkey_val_to_text(&buf, c, alloc_k), buf.buf))) {
|
||||
struct bkey_i_alloc_v4 *a_mut =
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ static int backpointer_target_not_found(struct btree_trans *trans,
|
|||
bp.v->level ? "btree node" : "extent");
|
||||
bch2_bkey_val_to_text(&buf, c, bp.s_c);
|
||||
|
||||
prt_printf(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
bch2_bkey_val_to_text(&buf, c, target_k);
|
||||
|
||||
struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(target_k);
|
||||
|
|
@ -222,7 +222,7 @@ static int backpointer_target_not_found(struct btree_trans *trans,
|
|||
struct extent_ptr_decoded p;
|
||||
bkey_for_each_ptr_decode(target_k.k, ptrs, p, entry)
|
||||
if (p.ptr.dev == bp.k->p.inode) {
|
||||
prt_printf(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
struct bkey_i_backpointer bp2;
|
||||
bch2_extent_ptr_to_bp(c, bp.v->btree_id, bp.v->level, target_k, p, entry, &bp2);
|
||||
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&bp2.k_i));
|
||||
|
|
@ -443,12 +443,11 @@ static int check_extent_checksum(struct btree_trans *trans,
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
prt_str(&buf, "extents pointing to same space, but first extent checksum bad:");
|
||||
prt_printf(&buf, "\n ");
|
||||
prt_printf(&buf, "extents pointing to same space, but first extent checksum bad:\n");
|
||||
bch2_btree_id_to_text(&buf, btree);
|
||||
prt_str(&buf, " ");
|
||||
bch2_bkey_val_to_text(&buf, c, extent);
|
||||
prt_printf(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
bch2_btree_id_to_text(&buf, o_btree);
|
||||
prt_str(&buf, " ");
|
||||
bch2_bkey_val_to_text(&buf, c, extent2);
|
||||
|
|
@ -541,7 +540,7 @@ static int check_bp_exists(struct btree_trans *trans,
|
|||
printbuf_reset(&buf);
|
||||
prt_printf(&buf, "duplicate versions of same extent, deleting smaller\n");
|
||||
bch2_bkey_val_to_text(&buf, c, orig_k);
|
||||
prt_str(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
bch2_bkey_val_to_text(&buf, c, other_extent);
|
||||
bch_err(c, "%s", buf.buf);
|
||||
|
||||
|
|
@ -582,7 +581,7 @@ static int check_bp_exists(struct btree_trans *trans,
|
|||
printbuf_reset(&buf);
|
||||
prt_printf(&buf, "duplicate extents pointing to same space on dev %llu\n", bp->k.p.inode);
|
||||
bch2_bkey_val_to_text(&buf, c, orig_k);
|
||||
prt_str(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
bch2_bkey_val_to_text(&buf, c, other_extent);
|
||||
bch_err(c, "%s", buf.buf);
|
||||
ret = -BCH_ERR_fsck_repair_unimplemented;
|
||||
|
|
|
|||
|
|
@ -1417,7 +1417,7 @@ void __bch2_btree_pos_to_text(struct printbuf *out, struct bch_fs *c,
|
|||
prt_printf(out, "%u", r->level);
|
||||
else
|
||||
prt_printf(out, "(unknown)");
|
||||
prt_printf(out, "\n ");
|
||||
prt_newline(out);
|
||||
|
||||
bch2_bkey_val_to_text(out, c, k);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -280,9 +280,9 @@ static int btree_repair_node_end(struct btree_trans *trans, struct btree *b,
|
|||
if (bpos_eq(child->key.k.p, b->key.k.p))
|
||||
return 0;
|
||||
|
||||
prt_printf(&buf, " at ");
|
||||
prt_printf(&buf, "\nat: ");
|
||||
bch2_btree_id_level_to_text(&buf, b->c.btree_id, b->c.level);
|
||||
prt_printf(&buf, ":\n parent: ");
|
||||
prt_printf(&buf, "\nparent: ");
|
||||
bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
|
||||
|
||||
prt_str(&buf, "\nchild: ");
|
||||
|
|
@ -351,8 +351,7 @@ static int bch2_btree_repair_topology_recurse(struct btree_trans *trans, struct
|
|||
|
||||
if (mustfix_fsck_err_on(bch2_err_matches(ret, EIO),
|
||||
trans, btree_node_read_error,
|
||||
"Topology repair: unreadable btree node at\n"
|
||||
" %s",
|
||||
"Topology repair: unreadable btree node at\n%s",
|
||||
buf.buf)) {
|
||||
bch2_btree_node_evict(trans, cur_k.k);
|
||||
cur = NULL;
|
||||
|
|
|
|||
|
|
@ -525,8 +525,6 @@ static void btree_err_msg(struct printbuf *out, struct bch_fs *c,
|
|||
prt_printf(out, "at btree ");
|
||||
bch2_btree_pos_to_text(out, c, b);
|
||||
|
||||
printbuf_indent_add(out, 2);
|
||||
|
||||
prt_printf(out, "\nnode offset %u/%u",
|
||||
b->written, btree_ptr_sectors_written(bkey_i_to_s_c(&b->key)));
|
||||
if (i)
|
||||
|
|
|
|||
|
|
@ -305,6 +305,13 @@ int __bch2_fsck_err(struct bch_fs *c,
|
|||
|
||||
bch2_sb_error_count(c, err);
|
||||
|
||||
printbuf_indent_add_nextline(out, 2);
|
||||
|
||||
#ifdef BCACHEFS_LOG_PREFIX
|
||||
if (strncmp(fmt, "bcachefs", 8))
|
||||
prt_printf(out, bch2_log_msg(c, ""));
|
||||
#endif
|
||||
|
||||
va_start(args, fmt);
|
||||
prt_vprintf(out, fmt, args);
|
||||
va_end(args);
|
||||
|
|
@ -354,11 +361,6 @@ int __bch2_fsck_err(struct bch_fs *c,
|
|||
s->nr++;
|
||||
}
|
||||
|
||||
#ifdef BCACHEFS_LOG_PREFIX
|
||||
if (!strncmp(fmt, "bcachefs:", 9))
|
||||
prt_printf(out, bch2_log_msg(c, ""));
|
||||
#endif
|
||||
|
||||
if ((flags & FSCK_AUTOFIX) &&
|
||||
(c->opts.errors == BCH_ON_ERROR_continue ||
|
||||
c->opts.errors == BCH_ON_ERROR_fix_safe)) {
|
||||
|
|
@ -435,6 +437,15 @@ int __bch2_fsck_err(struct bch_fs *c,
|
|||
print = true;
|
||||
}
|
||||
print:
|
||||
prt_newline(out);
|
||||
|
||||
if (inconsistent)
|
||||
bch2_inconsistent_error(c);
|
||||
else if (exiting)
|
||||
prt_printf(out, "Unable to continue, halting\n");
|
||||
else if (suppressing)
|
||||
prt_printf(out, "Ratelimiting new instances of previous error\n");
|
||||
|
||||
if (print) {
|
||||
if (bch2_fs_stdio_redirect(c))
|
||||
bch2_print(c, "%s\n", out->buf);
|
||||
|
|
@ -442,11 +453,6 @@ int __bch2_fsck_err(struct bch_fs *c,
|
|||
bch2_print_string_as_lines(KERN_ERR, out->buf);
|
||||
}
|
||||
|
||||
if (exiting)
|
||||
bch_err(c, "Unable to continue, halting");
|
||||
else if (suppressing)
|
||||
bch_err(c, "Ratelimiting new instances of previous error");
|
||||
|
||||
if (s)
|
||||
s->ret = ret;
|
||||
|
||||
|
|
@ -514,7 +520,7 @@ int __bch2_bkey_fsck_err(struct bch_fs *c,
|
|||
prt_printf(&buf, " level=%u: ", from.level);
|
||||
|
||||
bch2_bkey_val_to_text(&buf, c, k);
|
||||
prt_str(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
|
|
|
|||
|
|
@ -1571,7 +1571,7 @@ static int overlapping_extents_found(struct btree_trans *trans,
|
|||
if (ret)
|
||||
goto err;
|
||||
|
||||
prt_str(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
bch2_bkey_val_to_text(&buf, c, k1);
|
||||
|
||||
if (!bpos_eq(pos1, k1.k->p)) {
|
||||
|
|
@ -1600,7 +1600,7 @@ static int overlapping_extents_found(struct btree_trans *trans,
|
|||
break;
|
||||
}
|
||||
|
||||
prt_str(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
bch2_bkey_val_to_text(&buf, c, k2);
|
||||
|
||||
if (bpos_gt(k2.k->p, pos2.p) ||
|
||||
|
|
|
|||
|
|
@ -101,8 +101,7 @@ int bch2_lru_check_set(struct btree_trans *trans,
|
|||
goto err;
|
||||
|
||||
if (fsck_err(trans, alloc_key_to_missing_lru_entry,
|
||||
"missing %s lru entry\n"
|
||||
" %s",
|
||||
"missing %s lru entry\n%s",
|
||||
bch2_lru_types[lru_type(lru_k)],
|
||||
(bch2_bkey_val_to_text(&buf, c, referring_k), buf.buf))) {
|
||||
ret = bch2_lru_set(trans, lru_id, dev_bucket, time);
|
||||
|
|
|
|||
|
|
@ -702,7 +702,7 @@ static int bch2_check_dirent_inode_dirent(struct btree_trans *trans,
|
|||
!fsck_err(trans, inode_wrong_backpointer,
|
||||
"dirent points to inode that does not point back:\n%s",
|
||||
(bch2_bkey_val_to_text(&buf, c, d.s_c),
|
||||
prt_printf(&buf, "\n "),
|
||||
prt_newline(&buf),
|
||||
bch2_inode_unpacked_to_text(&buf, target),
|
||||
buf.buf)))
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -276,6 +276,25 @@ void bch2_printbuf_indent_add(struct printbuf *buf, unsigned spaces)
|
|||
buf->has_indent_or_tabstops = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* bch2_printbuf_indent_add_nextline() - add to the current indent level for
|
||||
* subsequent lines
|
||||
*
|
||||
* @buf: printbuf to control
|
||||
* @spaces: number of spaces to add to the current indent level
|
||||
*
|
||||
* Subsequent lines - not the current line - will be indented by @spaces more
|
||||
* spaces.
|
||||
*/
|
||||
void bch2_printbuf_indent_add_nextline(struct printbuf *buf, unsigned spaces)
|
||||
{
|
||||
if (WARN_ON_ONCE(buf->indent + spaces < buf->indent))
|
||||
spaces = 0;
|
||||
|
||||
buf->indent += spaces;
|
||||
buf->has_indent_or_tabstops = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* bch2_printbuf_indent_sub() - subtract from the current indent level
|
||||
*
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ void bch2_printbuf_tabstop_pop(struct printbuf *);
|
|||
int bch2_printbuf_tabstop_push(struct printbuf *, unsigned);
|
||||
|
||||
void bch2_printbuf_indent_add(struct printbuf *, unsigned);
|
||||
void bch2_printbuf_indent_add_nextline(struct printbuf *, unsigned);
|
||||
void bch2_printbuf_indent_sub(struct printbuf *, unsigned);
|
||||
|
||||
void bch2_prt_newline(struct printbuf *);
|
||||
|
|
|
|||
|
|
@ -323,7 +323,7 @@ static int trans_trigger_reflink_p_segment(struct btree_trans *trans,
|
|||
__le64 *refcount = bkey_refcount(bkey_i_to_s(new));
|
||||
if (!*refcount && (flags & BTREE_TRIGGER_overwrite)) {
|
||||
bch2_bkey_val_to_text(&buf, c, p.s_c);
|
||||
prt_printf(&buf, "\n ");
|
||||
prt_newline(&buf);
|
||||
bch2_bkey_val_to_text(&buf, c, k);
|
||||
log_fsck_err(trans, reflink_refcount_underflow,
|
||||
"indirect extent refcount underflow while marking\n%s",
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ do { \
|
|||
#define printbuf_tabstop_push(_buf, _n) bch2_printbuf_tabstop_push(_buf, _n)
|
||||
|
||||
#define printbuf_indent_add(_out, _n) bch2_printbuf_indent_add(_out, _n)
|
||||
#define printbuf_indent_add_nextline(_out, _n) bch2_printbuf_indent_add_nextline(_out, _n)
|
||||
#define printbuf_indent_sub(_out, _n) bch2_printbuf_indent_sub(_out, _n)
|
||||
|
||||
#define prt_newline(_out) bch2_prt_newline(_out)
|
||||
|
|
|
|||
Loading…
Reference in a new issue