Messages in this thread Patch in this message | | | From | Kent Overstreet <> | Subject | [PATCH 3/6] bcachefs: Assert that btree node locks aren't being leaked | Date | Wed, 22 Nov 2023 18:51:10 -0500 |
| |
This asserts (when lockdep is enabled) that btree locks aren't held when exiting a btree_trans.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev> --- fs/bcachefs/btree_gc.c | 3 +++ fs/bcachefs/btree_locking.c | 7 +++++++ fs/bcachefs/btree_types.h | 1 + 3 files changed, 11 insertions(+)
diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c index 136df94e9f84..7e5d52f8ffd7 100644 --- a/fs/bcachefs/btree_gc.c +++ b/fs/bcachefs/btree_gc.c @@ -1087,6 +1087,9 @@ static int bch2_gc_btrees(struct bch_fs *c, bool initial, bool metadata_only) unsigned i; int ret = 0; + if (initial) + trans->is_initial_gc = true; + for (i = 0; i < BTREE_ID_NR; i++) ids[i] = i; bubble_sort(ids, BTREE_ID_NR, btree_id_gc_phase_cmp); diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c index 6039278121dc..308c891ad3ca 100644 --- a/fs/bcachefs/btree_locking.c +++ b/fs/bcachefs/btree_locking.c @@ -751,6 +751,13 @@ void bch2_trans_unlock(struct btree_trans *trans) trans_for_each_path(trans, path) __bch2_btree_path_unlock(trans, path); + + /* + * bch2_gc_btree_init_recurse() doesn't use btree iterators for walking + * btree nodes, it implements its own walking: + */ + if (!trans->is_initial_gc) + bch2_assert_btree_nodes_not_locked(); } void bch2_trans_unlock_long(struct btree_trans *trans) diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index ca7526603d06..2326bceb34f8 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -399,6 +399,7 @@ struct btree_trans { bool memory_allocation_failure:1; bool journal_transaction_names:1; bool journal_replay_not_finished:1; + bool is_initial_gc:1; bool notrace_relock_fail:1; bool write_locked:1; enum bch_errcode restarted:16; -- 2.42.0
| |