mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
bcachefs: check_subvol_path() now prints subvol root inode
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
0b0f0ad93c
commit
3a5895e3ac
2 changed files with 14 additions and 20 deletions
|
@ -2371,22 +2371,6 @@ static bool darray_u32_has(darray_u32 *d, u32 v)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* We've checked that inode backpointers point to valid dirents; here, it's
|
|
||||||
* sufficient to check that the subvolume root has a dirent:
|
|
||||||
*/
|
|
||||||
static int subvol_has_dirent(struct btree_trans *trans, struct bkey_s_c_subvolume s)
|
|
||||||
{
|
|
||||||
struct bch_inode_unpacked inode;
|
|
||||||
int ret = bch2_inode_find_by_inum_trans(trans,
|
|
||||||
(subvol_inum) { s.k->p.offset, le64_to_cpu(s.v->inode) },
|
|
||||||
&inode);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
return inode.bi_dir != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter, struct bkey_s_c k)
|
static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter, struct bkey_s_c k)
|
||||||
{
|
{
|
||||||
struct bch_fs *c = trans->c;
|
struct bch_fs *c = trans->c;
|
||||||
|
@ -2405,14 +2389,24 @@ static int check_subvol_path(struct btree_trans *trans, struct btree_iter *iter,
|
||||||
|
|
||||||
struct bkey_s_c_subvolume s = bkey_s_c_to_subvolume(k);
|
struct bkey_s_c_subvolume s = bkey_s_c_to_subvolume(k);
|
||||||
|
|
||||||
ret = subvol_has_dirent(trans, s);
|
struct bch_inode_unpacked subvol_root;
|
||||||
if (ret < 0)
|
ret = bch2_inode_find_by_inum_trans(trans,
|
||||||
|
(subvol_inum) { s.k->p.offset, le64_to_cpu(s.v->inode) },
|
||||||
|
&subvol_root);
|
||||||
|
if (ret)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (fsck_err_on(!ret,
|
/*
|
||||||
|
* We've checked that inode backpointers point to valid dirents;
|
||||||
|
* here, it's sufficient to check that the subvolume root has a
|
||||||
|
* dirent:
|
||||||
|
*/
|
||||||
|
if (fsck_err_on(!subvol_root.bi_dir,
|
||||||
trans, subvol_unreachable,
|
trans, subvol_unreachable,
|
||||||
"unreachable subvolume %s",
|
"unreachable subvolume %s",
|
||||||
(bch2_bkey_val_to_text(&buf, c, s.s_c),
|
(bch2_bkey_val_to_text(&buf, c, s.s_c),
|
||||||
|
prt_newline(&buf),
|
||||||
|
bch2_inode_unpacked_to_text(&buf, &subvol_root),
|
||||||
buf.buf))) {
|
buf.buf))) {
|
||||||
ret = reattach_subvol(trans, s);
|
ret = reattach_subvol(trans, s);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -271,7 +271,7 @@ enum bch_fsck_flags {
|
||||||
x(subvol_children_not_set, 256, 0) \
|
x(subvol_children_not_set, 256, 0) \
|
||||||
x(subvol_children_bad, 257, 0) \
|
x(subvol_children_bad, 257, 0) \
|
||||||
x(subvol_loop, 258, 0) \
|
x(subvol_loop, 258, 0) \
|
||||||
x(subvol_unreachable, 259, 0) \
|
x(subvol_unreachable, 259, FSCK_AUTOFIX) \
|
||||||
x(btree_node_bkey_bad_u64s, 260, 0) \
|
x(btree_node_bkey_bad_u64s, 260, 0) \
|
||||||
x(btree_node_topology_empty_interior_node, 261, 0) \
|
x(btree_node_topology_empty_interior_node, 261, 0) \
|
||||||
x(btree_ptr_v2_min_key_bad, 262, 0) \
|
x(btree_ptr_v2_min_key_bad, 262, 0) \
|
||||||
|
|
Loading…
Add table
Reference in a new issue