bcachefs: Fix key cache assertion
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 24 Apr 2021 22:02:59 +0000 (18:02 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:02 +0000 (17:09 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs.h
fs/bcachefs/btree_key_cache.c
fs/bcachefs/recovery.c
fs/bcachefs/super.c

index dc7b78b7e2a25975aedaa74a91d9216d16451191..64a9094ec748cffe91219d406a138a21f8f6ee13 100644 (file)
@@ -489,6 +489,7 @@ enum {
        BCH_FS_FSCK_DONE,
        BCH_FS_STARTED,
        BCH_FS_RW,
+       BCH_FS_WAS_RW,
 
        /* shutdown: */
        BCH_FS_STOPPING,
index 019d4d164553b6d99a2a111dad56bf6595d54e1c..f8b9ca4dfb2b4e419429d74d79e6e002c6e74345 100644 (file)
@@ -683,7 +683,9 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
                kmem_cache_free(bch2_key_cache, ck);
        }
 
-       BUG_ON(atomic_long_read(&bc->nr_dirty) && !bch2_journal_error(&c->journal));
+       BUG_ON(atomic_long_read(&bc->nr_dirty) &&
+              !bch2_journal_error(&c->journal) &&
+              test_bit(BCH_FS_WAS_RW, &c->flags));
        BUG_ON(atomic_long_read(&bc->nr_keys));
 
        mutex_unlock(&bc->lock);
index 2dc3dee4efc8a8a38787cc06d2349473998766fe..fe6886e42216b0ce3de98900d38fe6fa625f8ff4 100644 (file)
@@ -973,7 +973,7 @@ int bch2_fs_recovery(struct bch_fs *c)
        struct jset *last_journal_entry = NULL;
        u64 blacklist_seq, journal_seq;
        bool write_sb = false;
-       int ret;
+       int ret = 0;
 
        if (c->sb.clean)
                clean = read_superblock_clean(c);
@@ -1253,10 +1253,9 @@ use_clean:
        if (c->journal_seq_blacklist_table &&
            c->journal_seq_blacklist_table->nr > 128)
                queue_work(system_long_wq, &c->journal_seq_blacklist_gc_work);
-out:
+
        ret = 0;
-err:
-fsck_err:
+out:
        set_bit(BCH_FS_FSCK_DONE, &c->flags);
        bch2_flush_fsck_errs(c);
 
@@ -1270,6 +1269,10 @@ fsck_err:
        else
                bch_verbose(c, "ret %i", ret);
        return ret;
+err:
+fsck_err:
+       bch2_fs_emergency_read_only(c);
+       goto out;
 }
 
 int bch2_fs_initialize(struct bch_fs *c)
index 18ad2db9f4bf5483cbfab19883ecc37ce38905be..64bc5ed33203e658f7b424bc69be29f76ab394ef 100644 (file)
@@ -441,6 +441,7 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early)
 
        percpu_ref_reinit(&c->writes);
        set_bit(BCH_FS_RW, &c->flags);
+       set_bit(BCH_FS_WAS_RW, &c->flags);
        return 0;
 err:
        __bch2_fs_read_only(c);