Commit 1c0ee43b authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: BCH_FS_clean_recovery



Add a filesystem flag to indicate whether we did a clean recovery -
using c->sb.clean after we've got rw is incorrect, since c->sb is
updated whenever we write the superblock.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 9773547b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -594,6 +594,7 @@ struct bch_dev {
#define BCH_FS_FLAGS()			\
	x(new_fs)			\
	x(started)			\
	x(clean_recovery)		\
	x(btree_running)		\
	x(accounting_replay_done)	\
	x(may_go_rw)			\
+4 −2
Original line number Diff line number Diff line
@@ -1084,8 +1084,9 @@ static int check_inode(struct btree_trans *trans,
		}
	}

	/* i_size_dirty is vestigal, since we now have logged ops for truncate * */
	if (u.bi_flags & BCH_INODE_i_size_dirty &&
	    (!c->sb.clean ||
	    (!test_bit(BCH_FS_clean_recovery, &c->flags) ||
	     fsck_err(trans, inode_i_size_dirty_but_clean,
		      "filesystem marked clean, but inode %llu has i_size dirty",
		      u.bi_inum))) {
@@ -1114,8 +1115,9 @@ static int check_inode(struct btree_trans *trans,
		do_update = true;
	}

	/* i_sectors_dirty is vestigal, i_sectors is always updated transactionally */
	if (u.bi_flags & BCH_INODE_i_sectors_dirty &&
	    (!c->sb.clean ||
	    (!test_bit(BCH_FS_clean_recovery, &c->flags) ||
	     fsck_err(trans, inode_i_sectors_dirty_but_clean,
		      "filesystem marked clean, but inode %llu has i_sectors dirty",
		      u.bi_inum))) {
+1 −1
Original line number Diff line number Diff line
@@ -1113,7 +1113,7 @@ static int may_delete_deleted_inode(struct btree_trans *trans,
			pos.offset, pos.snapshot))
		goto delete;

	if (c->sb.clean &&
	if (test_bit(BCH_FS_clean_recovery, &c->flags) &&
	    !fsck_err(trans, deleted_inode_but_clean,
		      "filesystem marked as clean but have deleted inode %llu:%u",
		      pos.offset, pos.snapshot)) {
+2 −0
Original line number Diff line number Diff line
@@ -717,6 +717,8 @@ int bch2_fs_recovery(struct bch_fs *c)

	if (c->opts.fsck)
		set_bit(BCH_FS_fsck_running, &c->flags);
	if (c->sb.clean)
		set_bit(BCH_FS_clean_recovery, &c->flags);

	ret = bch2_blacklist_table_initialize(c);
	if (ret) {