]> www.infradead.org Git - nvme.git/commitdiff
bcachefs: BCH_FS_clean_recovery
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 26 Sep 2024 20:19:58 +0000 (16:19 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 28 Sep 2024 02:32:22 +0000 (22:32 -0400)
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: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs.h
fs/bcachefs/fsck.c
fs/bcachefs/inode.c
fs/bcachefs/recovery.c

index e6dd4812c02039718771a3045a40c2a1be7ec257..f4151ee51b034201d3f8077c07c77857f3f4f3f3 100644 (file)
@@ -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)                    \
index 10e2930b62da356c55f2c114871ea2376b35b17c..9c10eeeb0bcb889a50f8463e97ad35b2ba9d0ea8 100644 (file)
@@ -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))) {
index 1116db239708f23f6f907df91cecca6a4e08f6ce..753c208896c3be7417b7f8b7aefe5421c942df44 100644 (file)
@@ -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)) {
index c84295a072320beb18d5e91e888df4953ea1142e..6db72d3bad7db76bb5908d99c8b0a98236462cdd 100644 (file)
@@ -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) {