bcachefs: Fix an assertion
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 27 Sep 2021 05:56:31 +0000 (01:56 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:13 +0000 (17:09 -0400)
We can end up in a strange situation where a btree_path points to a node
being freed even after pointers to it should have been replaced by
pointers to the new node - if the btree node has been reused since the
pointer to it was created.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/btree_update_interior.c

index 73a79563487dd5a7a5b2d9927399fe9b5e150235..978bb56275de7ee78b2a54b61bbd216a04a99af4 100644 (file)
@@ -165,7 +165,8 @@ static void bch2_btree_node_free_inmem(struct btree_trans *trans,
        struct btree_path *path;
 
        trans_for_each_path(trans, path)
-               BUG_ON(path->l[b->c.level].b == b);
+               BUG_ON(path->l[b->c.level].b == b &&
+                      path->l[b->c.level].lock_seq == b->c.lock.state.seq);
 
        six_lock_write(&b->c.lock, NULL, NULL);