Commit 3a5895e3 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: check_subvol_path() now prints subvol root inode

parent 0b0f0ad9
Loading
Loading
Loading
Loading
+13 −19
Original line number Diff line number Diff line
@@ -2371,22 +2371,6 @@ static bool darray_u32_has(darray_u32 *d, u32 v)
	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)
{
	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);

		ret = subvol_has_dirent(trans, s);
		if (ret < 0)
		struct bch_inode_unpacked subvol_root;
		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;

		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,
				"unreachable subvolume %s",
				(bch2_bkey_val_to_text(&buf, c, s.s_c),
				 prt_newline(&buf),
				 bch2_inode_unpacked_to_text(&buf, &subvol_root),
				 buf.buf))) {
			ret = reattach_subvol(trans, s);
			break;
+1 −1
Original line number Diff line number Diff line
@@ -271,7 +271,7 @@ enum bch_fsck_flags {
	x(subvol_children_not_set,				256,	0)		\
	x(subvol_children_bad,					257,	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_topology_empty_interior_node,		261,	0)		\
	x(btree_ptr_v2_min_key_bad,				262,	0)		\