diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-02-13 15:17:23 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:16 -0400 |
commit | 8c96cfccf045efff12d8287a41f2b8f4ef3094c2 (patch) | |
tree | febb2d947390f6b69e10bf8888882b52b44244e3 | |
parent | 8777210b92c661a50fb8147574cb0a366566ae07 (diff) |
bcachefs: fix more locking bugs
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/alloc_background.c | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 15 |
2 files changed, 12 insertions, 6 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 7c57de5390b4..5b9d6c77d037 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 60aa28e3f5f8..7ccf2f935701 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)); |