}
        }
 
+       /* 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))) {
                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))) {
 
                        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)) {
 
 
        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) {