mirror of
https://github.com/torvalds/linux.git
synced 2026-05-05 15:02:40 -04:00
bcachefs: check_path() now prints full inode when reattaching
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
@@ -2108,7 +2108,9 @@ static int path_down(struct bch_fs *c, pathbuf *p,
|
||||
static int check_path(struct btree_trans *trans, pathbuf *p, struct bkey_s_c inode_k)
|
||||
{
|
||||
struct bch_fs *c = trans->c;
|
||||
struct btree_iter inode_iter = {};
|
||||
struct bch_inode_unpacked inode;
|
||||
struct printbuf buf = PRINTBUF;
|
||||
u32 snapshot = bch2_snapshot_equiv(c, inode_k.k->p.snapshot);
|
||||
int ret = 0;
|
||||
|
||||
@@ -2134,14 +2136,12 @@ static int check_path(struct btree_trans *trans, pathbuf *p, struct bkey_s_c ino
|
||||
|
||||
if (bch2_err_matches(ret, ENOENT)) {
|
||||
if (fsck_err(c, inode_unreachable,
|
||||
"unreachable inode %llu:%u, type %s nlink %u backptr %llu:%llu",
|
||||
inode.bi_inum, snapshot,
|
||||
bch2_d_type_str(inode_d_type(&inode)),
|
||||
inode.bi_nlink,
|
||||
inode.bi_dir,
|
||||
inode.bi_dir_offset))
|
||||
"unreachable inode\n%s",
|
||||
(printbuf_reset(&buf),
|
||||
bch2_bkey_val_to_text(&buf, c, inode_k),
|
||||
buf.buf)))
|
||||
ret = reattach_inode(trans, &inode, snapshot);
|
||||
break;
|
||||
goto out;
|
||||
}
|
||||
|
||||
bch2_trans_iter_exit(trans, &dirent_iter);
|
||||
@@ -2157,7 +2157,12 @@ static int check_path(struct btree_trans *trans, pathbuf *p, struct bkey_s_c ino
|
||||
|
||||
snapshot = parent_snapshot;
|
||||
|
||||
ret = lookup_inode(trans, inode.bi_dir, &inode, &snapshot);
|
||||
bch2_trans_iter_exit(trans, &inode_iter);
|
||||
inode_k = bch2_bkey_get_iter(trans, &inode_iter, BTREE_ID_inodes,
|
||||
SPOS(0, inode.bi_dir, snapshot), 0);
|
||||
ret = bkey_err(inode_k) ?:
|
||||
!bkey_is_inode(inode_k.k) ? -BCH_ERR_ENOENT_inode
|
||||
: bch2_inode_unpack(inode_k, &inode);
|
||||
if (ret) {
|
||||
/* Should have been caught in dirents pass */
|
||||
if (!bch2_err_matches(ret, BCH_ERR_transaction_restart))
|
||||
@@ -2165,6 +2170,8 @@ static int check_path(struct btree_trans *trans, pathbuf *p, struct bkey_s_c ino
|
||||
break;
|
||||
}
|
||||
|
||||
snapshot = inode_k.k->p.snapshot;
|
||||
|
||||
if (path_is_dup(p, inode.bi_inum, snapshot)) {
|
||||
/* XXX print path */
|
||||
bch_err(c, "directory structure loop");
|
||||
@@ -2188,7 +2195,10 @@ static int check_path(struct btree_trans *trans, pathbuf *p, struct bkey_s_c ino
|
||||
break;
|
||||
}
|
||||
}
|
||||
out:
|
||||
fsck_err:
|
||||
bch2_trans_iter_exit(trans, &inode_iter);
|
||||
printbuf_exit(&buf);
|
||||
bch_err_fn(c, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user