mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
bcachefs: bch2_indirect_extent_missing_error() prints path, not just inode number
We want all error messages converted to print paths, not just inode numbers - users want this information, and it speeds up debugging too. Auditing and converting all error messages is going to be a big project, so for the moment we're just doing this incrementally. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
e63cf203d7
commit
45f0e6c838
@ -535,7 +535,6 @@ int bch2_inum_err_msg_trans(struct btree_trans *trans, struct printbuf *out, sub
|
||||
u32 restart_count = trans->restart_count;
|
||||
int ret = 0;
|
||||
|
||||
/* XXX: we don't yet attempt to print paths when we don't know the subvol */
|
||||
if (inum.subvol)
|
||||
ret = lockrestart_do(trans, bch2_inum_to_path(trans, inum, out));
|
||||
if (!inum.subvol || ret)
|
||||
@ -562,3 +561,34 @@ void bch2_inum_offset_err_msg(struct bch_fs *c, struct printbuf *out,
|
||||
{
|
||||
bch2_trans_run(c, bch2_inum_offset_err_msg_trans(trans, out, inum, offset));
|
||||
}
|
||||
|
||||
int bch2_inum_snap_err_msg_trans(struct btree_trans *trans, struct printbuf *out,
|
||||
struct bpos pos)
|
||||
{
|
||||
u32 restart_count = trans->restart_count;
|
||||
struct bch_fs *c = trans->c;
|
||||
int ret = 0;
|
||||
|
||||
if (!bch2_snapshot_is_leaf(c, pos.snapshot))
|
||||
prt_str(out, "(multiple snapshots) ");
|
||||
|
||||
subvol_inum inum = {
|
||||
.subvol = bch2_snapshot_tree_oldest_subvol(c, pos.snapshot),
|
||||
.inum = pos.inode,
|
||||
};
|
||||
|
||||
if (inum.subvol)
|
||||
ret = lockrestart_do(trans, bch2_inum_to_path(trans, inum, out));
|
||||
if (!inum.subvol || ret)
|
||||
prt_printf(out, "inum %llu:%u", pos.inode, pos.snapshot);
|
||||
|
||||
return trans_was_restarted(trans, restart_count);
|
||||
}
|
||||
|
||||
int bch2_inum_snap_offset_err_msg_trans(struct btree_trans *trans, struct printbuf *out,
|
||||
struct bpos pos)
|
||||
{
|
||||
int ret = bch2_inum_snap_err_msg_trans(trans, out, pos);
|
||||
prt_printf(out, " offset %llu: ", pos.offset << 8);
|
||||
return ret;
|
||||
}
|
||||
|
@ -244,4 +244,7 @@ int bch2_inum_offset_err_msg_trans(struct btree_trans *, struct printbuf *, subv
|
||||
void bch2_inum_err_msg(struct bch_fs *, struct printbuf *, subvol_inum);
|
||||
void bch2_inum_offset_err_msg(struct bch_fs *, struct printbuf *, subvol_inum, u64);
|
||||
|
||||
int bch2_inum_snap_err_msg_trans(struct btree_trans *, struct printbuf *, struct bpos);
|
||||
int bch2_inum_snap_offset_err_msg_trans(struct btree_trans *, struct printbuf *, struct bpos);
|
||||
|
||||
#endif /* _BCACHEFS_ERROR_H */
|
||||
|
@ -185,12 +185,21 @@ static int bch2_indirect_extent_missing_error(struct btree_trans *trans,
|
||||
BUG_ON(missing_start < refd_start);
|
||||
BUG_ON(missing_end > refd_end);
|
||||
|
||||
if (fsck_err(trans, reflink_p_to_missing_reflink_v,
|
||||
"pointer to missing indirect extent\n"
|
||||
" %s\n"
|
||||
" missing range %llu-%llu",
|
||||
(bch2_bkey_val_to_text(&buf, c, p.s_c), buf.buf),
|
||||
missing_start, missing_end)) {
|
||||
struct bpos missing_pos = bkey_start_pos(p.k);
|
||||
missing_pos.offset += missing_start - live_start;
|
||||
|
||||
prt_printf(&buf, "pointer to missing indirect extent in ");
|
||||
ret = bch2_inum_snap_offset_err_msg_trans(trans, &buf, missing_pos);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
prt_printf(&buf, "-%llu\n ", (missing_pos.offset + (missing_end - missing_start)) << 9);
|
||||
bch2_bkey_val_to_text(&buf, c, p.s_c);
|
||||
|
||||
prt_printf(&buf, "\n missing reflink btree range %llu-%llu",
|
||||
missing_start, missing_end);
|
||||
|
||||
if (fsck_err(trans, reflink_p_to_missing_reflink_v, "%s", buf.buf)) {
|
||||
struct bkey_i_reflink_p *new = bch2_bkey_make_mut_noupdate_typed(trans, p.s_c, reflink_p);
|
||||
ret = PTR_ERR_OR_ZERO(new);
|
||||
if (ret)
|
||||
|
@ -390,7 +390,7 @@ static u32 bch2_snapshot_tree_next(struct bch_fs *c, u32 id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u32 bch2_snapshot_tree_oldest_subvol(struct bch_fs *c, u32 snapshot_root)
|
||||
u32 bch2_snapshot_tree_oldest_subvol(struct bch_fs *c, u32 snapshot_root)
|
||||
{
|
||||
u32 id = snapshot_root;
|
||||
u32 subvol = 0, s;
|
||||
|
@ -105,6 +105,7 @@ static inline u32 bch2_snapshot_nth_parent(struct bch_fs *c, u32 id, u32 n)
|
||||
return id;
|
||||
}
|
||||
|
||||
u32 bch2_snapshot_tree_oldest_subvol(struct bch_fs *, u32);
|
||||
u32 bch2_snapshot_skiplist_get(struct bch_fs *, u32);
|
||||
|
||||
static inline u32 bch2_snapshot_root(struct bch_fs *c, u32 id)
|
||||
|
Loading…
x
Reference in New Issue
Block a user