mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
bcachefs: bch2_trans_downgrade()
bch2_btree_iter_downgrade() was looping over all iterators in a transaction; bch2_trans_downgrade() should be doing that. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
784d8d173d
commit
72545b5e76
3 changed files with 22 additions and 24 deletions
|
@ -349,31 +349,20 @@ bool __bch2_btree_iter_upgrade_nounlock(struct btree_iter *iter,
|
|||
void __bch2_btree_iter_downgrade(struct btree_iter *iter,
|
||||
unsigned downgrade_to)
|
||||
{
|
||||
struct btree_iter *linked;
|
||||
unsigned l;
|
||||
unsigned l, new_locks_want = downgrade_to ?:
|
||||
(iter->flags & BTREE_ITER_INTENT ? 1 : 0);
|
||||
|
||||
/*
|
||||
* We downgrade linked iterators as well because btree_iter_upgrade
|
||||
* might have had to modify locks_want on linked iterators due to lock
|
||||
* ordering:
|
||||
*/
|
||||
trans_for_each_iter(iter->trans, linked) {
|
||||
unsigned new_locks_want = downgrade_to ?:
|
||||
(linked->flags & BTREE_ITER_INTENT ? 1 : 0);
|
||||
if (iter->locks_want < downgrade_to) {
|
||||
iter->locks_want = new_locks_want;
|
||||
|
||||
if (linked->locks_want <= new_locks_want)
|
||||
continue;
|
||||
|
||||
linked->locks_want = new_locks_want;
|
||||
|
||||
while (linked->nodes_locked &&
|
||||
(l = __fls(linked->nodes_locked)) >= linked->locks_want) {
|
||||
if (l > linked->level) {
|
||||
btree_node_unlock(linked, l);
|
||||
while (iter->nodes_locked &&
|
||||
(l = __fls(iter->nodes_locked)) >= iter->locks_want) {
|
||||
if (l > iter->level) {
|
||||
btree_node_unlock(iter, l);
|
||||
} else {
|
||||
if (btree_node_intent_locked(linked, l)) {
|
||||
six_lock_downgrade(&linked->l[l].b->c.lock);
|
||||
linked->nodes_intent_locked ^= 1 << l;
|
||||
if (btree_node_intent_locked(iter, l)) {
|
||||
six_lock_downgrade(&iter->l[l].b->c.lock);
|
||||
iter->nodes_intent_locked ^= 1 << l;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -383,6 +372,14 @@ void __bch2_btree_iter_downgrade(struct btree_iter *iter,
|
|||
bch2_btree_trans_verify_locks(iter->trans);
|
||||
}
|
||||
|
||||
void bch2_trans_downgrade(struct btree_trans *trans)
|
||||
{
|
||||
struct btree_iter *iter;
|
||||
|
||||
trans_for_each_iter(trans, iter)
|
||||
bch2_btree_iter_downgrade(iter);
|
||||
}
|
||||
|
||||
/* Btree transaction locking: */
|
||||
|
||||
bool bch2_trans_relock(struct btree_trans *trans)
|
||||
|
|
|
@ -136,6 +136,8 @@ static inline void bch2_btree_iter_downgrade(struct btree_iter *iter)
|
|||
__bch2_btree_iter_downgrade(iter, 0);
|
||||
}
|
||||
|
||||
void bch2_trans_downgrade(struct btree_trans *);
|
||||
|
||||
void bch2_btree_iter_node_replace(struct btree_iter *, struct btree *);
|
||||
void bch2_btree_iter_node_drop(struct btree_iter *, struct btree *);
|
||||
|
||||
|
|
|
@ -543,8 +543,7 @@ static inline int do_bch2_trans_commit(struct btree_trans *trans,
|
|||
|
||||
trans->nounlock = false;
|
||||
|
||||
trans_for_each_update2(trans, i)
|
||||
bch2_btree_iter_downgrade(i->iter);
|
||||
bch2_trans_downgrade(trans);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue