Commit 4da1713a authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: check for inodes that should have backpointers in fsck

parent 45150765
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -1713,6 +1713,15 @@ static int check_dirent_inode_dirent(struct btree_trans *trans,
	if (inode_points_to_dirent(target, d))
		return 0;

	if (bch2_inode_should_have_bp(target) &&
	    !fsck_err(c, 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  "),
		       bch2_inode_unpacked_to_text(&buf, target),
		       buf.buf)))
		goto out_noiter;

	if (!target->bi_dir &&
	    !target->bi_dir_offset) {
		target->bi_dir		= d.k->p.inode;
@@ -1781,6 +1790,7 @@ static int check_dirent_inode_dirent(struct btree_trans *trans,
err:
fsck_err:
	bch2_trans_iter_exit(trans, &bp_iter);
out_noiter:
	printbuf_exit(&buf);
	bch_err_fn(c, ret);
	return ret;
+8 −0
Original line number Diff line number Diff line
@@ -221,6 +221,14 @@ static inline void bch2_inode_nlink_set(struct bch_inode_unpacked *bi,
int bch2_inode_nlink_inc(struct bch_inode_unpacked *);
void bch2_inode_nlink_dec(struct btree_trans *, struct bch_inode_unpacked *);

static inline bool bch2_inode_should_have_bp(struct bch_inode_unpacked *inode)
{
	bool inode_has_bp = inode->bi_dir || inode->bi_dir_offset;

	return S_ISDIR(inode->bi_mode) ||
		(!inode->bi_nlink && inode_has_bp);
}

struct bch_opts bch2_inode_opts_to_opts(struct bch_inode_unpacked *);
void bch2_inode_opts_get(struct bch_io_opts *, struct bch_fs *,
			 struct bch_inode_unpacked *);