bcachefs: Fix nocow locks deadlock
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 11 Dec 2023 23:40:17 +0000 (18:40 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Tue, 12 Dec 2023 01:43:11 +0000 (20:43 -0500)
On trylock failure we were waiting for outstanding reads to complete -
but nocow locks need to be held until the whole move is finished.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/data_update.c

index 2418c528c5333b6e621df17e1579cd2205264e36..b05457d284a6009c8077ba01d401bd8fe42e63bf 100644 (file)
@@ -560,7 +560,8 @@ int bch2_data_update_init(struct btree_trans *trans,
                                move_ctxt_wait_event(ctxt,
                                                (locked = bch2_bucket_nocow_trylock(&c->nocow_locks,
                                                                          PTR_BUCKET_POS(c, &p.ptr), 0)) ||
-                                               !atomic_read(&ctxt->read_sectors));
+                                               (!atomic_read(&ctxt->read_sectors) &&
+                                                !atomic_read(&ctxt->write_sectors)));
 
                                if (!locked)
                                        bch2_bucket_nocow_lock(&c->nocow_locks,