summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-07-24 19:45:22 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:08 -0400
commit94c1f4adec42c03c8fb1b7dc41f2fc07481a5395 (patch)
treed20f8d91bfc5f79d6e8ba2170d9481cd93965b07
parent277c981c634f3e64dd99523aabfd9ed5e6c5be55 (diff)
downloadlwn-94c1f4adec42c03c8fb1b7dc41f2fc07481a5395.tar.gz
lwn-94c1f4adec42c03c8fb1b7dc41f2fc07481a5395.zip
bcachefs: Fix locking in allocator thread
gc lock must be held while invalidating buckets - fixes "1f7a95698e bcachefs: Invalidate buckets when writing to alloc btree" Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/alloc.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/bcachefs/alloc.c b/fs/bcachefs/alloc.c
index ea1dc52e5ff6..192ab655ca23 100644
--- a/fs/bcachefs/alloc.c
+++ b/fs/bcachefs/alloc.c
@@ -964,16 +964,21 @@ static int bch2_allocator_thread(void *arg)
if (ret)
goto stop;
+ down_read(&c->gc_lock);
+
ret = bch2_invalidate_buckets(c, ca);
- if (ret)
+ if (ret) {
+ up_read(&c->gc_lock);
goto stop;
+ }
- if (!fifo_empty(&ca->free_inc))
+ if (!fifo_empty(&ca->free_inc)) {
+ up_read(&c->gc_lock);
continue;
+ }
pr_debug("free_inc now empty");
- down_read(&c->gc_lock);
do {
if (test_bit(BCH_FS_GC_FAILURE, &c->flags)) {
up_read(&c->gc_lock);