summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-24 18:02:59 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-05-19 15:33:45 -0400
commit9054a0b2e503ad1eb64b6c9cd6f7e88e24cde1fb (patch)
treedca557b0ac24f9b7647b005521decdd4e8a4bd29 /fs
parent98f759a30741238a62160e517e40019baf4b4756 (diff)
bcachefs: Fix key cache assertion
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/bcachefs.h1
-rw-r--r--fs/bcachefs/btree_key_cache.c4
-rw-r--r--fs/bcachefs/recovery.c11
-rw-r--r--fs/bcachefs/super.c1
4 files changed, 12 insertions, 5 deletions
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h
index ce058d55eb34..a673a5c75ce1 100644
--- a/fs/bcachefs/bcachefs.h
+++ b/fs/bcachefs/bcachefs.h
@@ -489,6 +489,7 @@ enum {
BCH_FS_FSCK_DONE,
BCH_FS_STARTED,
BCH_FS_RW,
+ BCH_FS_WAS_RW,
/* shutdown: */
BCH_FS_STOPPING,
diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c
index a5181a96397a..a0ff0c3ceb90 100644
--- a/fs/bcachefs/btree_key_cache.c
+++ b/fs/bcachefs/btree_key_cache.c
@@ -682,7 +682,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);
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c
index 2dc3dee4efc8..fe6886e42216 100644
--- a/fs/bcachefs/recovery.c
+++ b/fs/bcachefs/recovery.c
@@ -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)
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c
index 69d8a02610fa..fcfd27a47b03 100644
--- a/fs/bcachefs/super.c
+++ b/fs/bcachefs/super.c
@@ -440,6 +440,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);