From 94c1f4adec42c03c8fb1b7dc41f2fc07481a5395 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 24 Jul 2018 19:45:22 -0400 Subject: [PATCH] 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 --- fs/bcachefs/alloc.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 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; - ret = bch2_invalidate_buckets(c, ca); - if (ret) - goto stop; + down_read(&c->gc_lock); - if (!fifo_empty(&ca->free_inc)) + ret = bch2_invalidate_buckets(c, ca); + if (ret) { + up_read(&c->gc_lock); + goto stop; + } + + 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);