aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-12-11 18:40:17 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-12-11 20:43:11 -0500
commitbedd6fe4d357f3cffb392f2153b52ef71f810259 (patch)
tree1ae1c94cc42ddf4aa0efc85b06e87c479a14f565
parenta66ff26b0f31189e413a87065c25949c359e4bef (diff)
downloadlinux-bedd6fe4d357f3cffb392f2153b52ef71f810259.tar.gz
bcachefs: Fix nocow locks deadlock
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>
-rw-r--r--fs/bcachefs/data_update.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/bcachefs/data_update.c b/fs/bcachefs/data_update.c
index 2418c528c5333b..b05457d284a600 100644
--- a/fs/bcachefs/data_update.c
+++ b/fs/bcachefs/data_update.c
@@ -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,