diff options
Diffstat (limited to 'fs/bcachefs/btree_iter.c')
-rw-r--r-- | fs/bcachefs/btree_iter.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index a50a6a51a3a5..afc43722c1fc 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -264,10 +264,13 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos, /* Btree iterator locking: */ #ifdef CONFIG_BCACHEFS_DEBUG -void bch2_btree_iter_verify_locks(struct btree_iter *iter) +void __bch2_btree_iter_verify_locks(struct btree_iter *iter) { unsigned l; + BUG_ON((iter->flags & BTREE_ITER_NOUNLOCK) && + !btree_node_locked(iter, 0)); + for (l = 0; btree_iter_node(iter, l); l++) { if (iter->uptodate >= BTREE_ITER_NEED_RELOCK && !btree_node_locked(iter, l)) @@ -277,6 +280,15 @@ void bch2_btree_iter_verify_locks(struct btree_iter *iter) btree_node_locked_type(iter, l)); } } + +void bch2_btree_iter_verify_locks(struct btree_iter *iter) +{ + struct btree_iter *linked; + + for_each_btree_iter(iter, linked) + __bch2_btree_iter_verify_locks(linked); + +} #endif __flatten @@ -382,9 +394,9 @@ void __bch2_btree_iter_downgrade(struct btree_iter *iter, break; } } - - bch2_btree_iter_verify_locks(linked); } + + bch2_btree_iter_verify_locks(iter); } int bch2_btree_iter_unlock(struct btree_iter *iter) @@ -776,9 +788,17 @@ void bch2_btree_iter_node_drop(struct btree_iter *iter, struct btree *b) struct btree_iter *linked; unsigned level = b->level; + /* caller now responsible for unlocking @b */ + + BUG_ON(iter->l[level].b != b); + BUG_ON(!btree_node_intent_locked(iter, level)); + + iter->l[level].b = BTREE_ITER_NOT_END; + mark_btree_node_unlocked(iter, level); + for_each_btree_iter(iter, linked) if (linked->l[level].b == b) { - btree_node_unlock(linked, level); + __btree_node_unlock(linked, level); linked->l[level].b = BTREE_ITER_NOT_END; } } |