From: Kent Overstreet <kent.overstreet@gmail.com>
Date: Wed, 13 Feb 2019 20:17:23 +0000 (-0500)
Subject: bcachefs: fix more locking bugs
X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=8c96cfccf045efff12d8287a41f2b8f4ef3094c2;p=linux.git

bcachefs: fix more locking bugs

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
---

diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index 7c57de5390b47..5b9d6c77d037b 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -886,7 +886,8 @@ static int bch2_invalidate_buckets(struct bch_fs *c, struct bch_dev *ca)
 		ret = __bch2_alloc_write_key(c, ca, b, &iter,
 				must_flush ? &journal_seq : NULL,
 				BTREE_INSERT_GC_LOCK_HELD|
-				!fifo_empty(&ca->free_inc) ? BTREE_INSERT_NOWAIT : 0);
+				(!fifo_empty(&ca->free_inc)
+				 ? BTREE_INSERT_NOWAIT : 0));
 	}
 
 	bch2_btree_iter_unlock(&iter);
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c
index 60aa28e3f5f87..7ccf2f935701c 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -1567,7 +1567,8 @@ int bch2_btree_split_leaf(struct bch_fs *c, struct btree_iter *iter,
 	closure_init_stack(&cl);
 
 	/* Hack, because gc and splitting nodes doesn't mix yet: */
-	if (!down_read_trylock(&c->gc_lock)) {
+	if (!(flags & BTREE_INSERT_GC_LOCK_HELD) &&
+	    !down_read_trylock(&c->gc_lock)) {
 		if (flags & BTREE_INSERT_NOUNLOCK)
 			return -EINTR;
 
@@ -1610,7 +1611,8 @@ int bch2_btree_split_leaf(struct bch_fs *c, struct btree_iter *iter,
 	 */
 	__bch2_btree_iter_downgrade(iter, 1);
 out:
-	up_read(&c->gc_lock);
+	if (!(flags & BTREE_INSERT_GC_LOCK_HELD))
+		up_read(&c->gc_lock);
 	closure_sync(&cl);
 	return ret;
 }
@@ -1688,7 +1690,8 @@ retry:
 	}
 
 	/* We're changing btree topology, doesn't mix with gc: */
-	if (!down_read_trylock(&c->gc_lock))
+	if (!(flags & BTREE_INSERT_GC_LOCK_HELD) &&
+	    !down_read_trylock(&c->gc_lock))
 		goto err_cycle_gc_lock;
 
 	if (!bch2_btree_iter_upgrade(iter, U8_MAX,
@@ -1748,7 +1751,8 @@ retry:
 
 	bch2_btree_update_done(as);
 
-	up_read(&c->gc_lock);
+	if (!(flags & BTREE_INSERT_GC_LOCK_HELD))
+		up_read(&c->gc_lock);
 out:
 	bch2_btree_iter_verify_locks(iter);
 
@@ -1779,7 +1783,8 @@ err_cycle_gc_lock:
 
 err_unlock:
 	six_unlock_intent(&m->lock);
-	up_read(&c->gc_lock);
+	if (!(flags & BTREE_INSERT_GC_LOCK_HELD))
+		up_read(&c->gc_lock);
 err:
 	BUG_ON(ret == -EAGAIN && (flags & BTREE_INSERT_NOUNLOCK));