summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-02-13 15:17:23 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2019-04-03 12:44:07 -0400
commit1ed73008baf25eef9604417e43bc090c32372268 (patch)
tree77914cb9dee0a07e391c8c648a29ea5bd6f252b8
parentae11bb2d0dff150a338c71ae4b3e30d7be63ed4f (diff)
bcachefs: fix more locking bugs
-rw-r--r--fs/bcachefs/alloc_background.c3
-rw-r--r--fs/bcachefs/btree_update_interior.c15
2 files changed, 12 insertions, 6 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index ebc7c09ba71c..88f01f57beb6 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -885,7 +885,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 6504401e01f4..b1b858dedaf0 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -1562,7 +1562,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;
@@ -1605,7 +1606,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;
}
@@ -1683,7 +1685,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,
@@ -1743,7 +1746,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);
@@ -1774,7 +1778,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));