bcachefs: Fix an assertion pop
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 20 Jan 2021 22:31:31 +0000 (17:31 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:51 +0000 (17:08 -0400)
There was a race: btree node writes drop their reference on journal pins
before clearing the btree_node_write_in_flight flag.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_io.c
fs/bcachefs/btree_io.h
fs/bcachefs/super.c

index c4d53ea2e9206ca716e74cbc8a5d2f8bdbafe0fb..cd2b300043b68333367d83b63c8c56c0e867e402 100644 (file)
@@ -1829,23 +1829,6 @@ void bch2_btree_flush_all_writes(struct bch_fs *c)
        __bch2_btree_flush_all(c, BTREE_NODE_write_in_flight);
 }
 
-void bch2_btree_verify_flushed(struct bch_fs *c)
-{
-       struct bucket_table *tbl;
-       struct rhash_head *pos;
-       struct btree *b;
-       unsigned i;
-
-       rcu_read_lock();
-       for_each_cached_btree(b, c, tbl, i, pos) {
-               unsigned long flags = READ_ONCE(b->flags);
-
-               BUG_ON((flags & (1 << BTREE_NODE_dirty)) ||
-                      (flags & (1 << BTREE_NODE_write_in_flight)));
-       }
-       rcu_read_unlock();
-}
-
 void bch2_dirty_btree_nodes_to_text(struct printbuf *out, struct bch_fs *c)
 {
        struct bucket_table *tbl;
index 1a4b11e99cc40367457a69259860a3cff462eae6..3b61555ef9067e5a347bc83994f68a17e93a0b30 100644 (file)
@@ -185,7 +185,6 @@ do {                                                                        \
 
 void bch2_btree_flush_all_reads(struct bch_fs *);
 void bch2_btree_flush_all_writes(struct bch_fs *);
-void bch2_btree_verify_flushed(struct bch_fs *);
 void bch2_dirty_btree_nodes_to_text(struct printbuf *, struct bch_fs *);
 
 static inline void compat_bformat(unsigned level, enum btree_id btree_id,
index f46b4b05b4aa75145267d5d5e835205437230443..2b3fb07fbc4d8a13ba4bd5a6e30d4e5f99667403 100644 (file)
@@ -242,10 +242,7 @@ nowrote_alloc:
         * the journal kicks off btree writes via reclaim - wait for in flight
         * writes after stopping journal:
         */
-       if (test_bit(BCH_FS_EMERGENCY_RO, &c->flags))
-               bch2_btree_flush_all_writes(c);
-       else
-               bch2_btree_verify_flushed(c);
+       bch2_btree_flush_all_writes(c);
 
        /*
         * After stopping journal: