Commit 72545b5e authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

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: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 784d8d17
...@@ -349,31 +349,20 @@ bool __bch2_btree_iter_upgrade_nounlock(struct btree_iter *iter, ...@@ -349,31 +349,20 @@ bool __bch2_btree_iter_upgrade_nounlock(struct btree_iter *iter,
void __bch2_btree_iter_downgrade(struct btree_iter *iter, void __bch2_btree_iter_downgrade(struct btree_iter *iter,
unsigned downgrade_to) unsigned downgrade_to)
{ {
struct btree_iter *linked; unsigned l, new_locks_want = downgrade_to ?:
unsigned l; (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 (linked->locks_want <= new_locks_want)
continue;
linked->locks_want = new_locks_want; if (iter->locks_want < downgrade_to) {
iter->locks_want = new_locks_want;
while (linked->nodes_locked && while (iter->nodes_locked &&
(l = __fls(linked->nodes_locked)) >= linked->locks_want) { (l = __fls(iter->nodes_locked)) >= iter->locks_want) {
if (l > linked->level) { if (l > iter->level) {
btree_node_unlock(linked, l); btree_node_unlock(iter, l);
} else { } else {
if (btree_node_intent_locked(linked, l)) { if (btree_node_intent_locked(iter, l)) {
six_lock_downgrade(&linked->l[l].b->c.lock); six_lock_downgrade(&iter->l[l].b->c.lock);
linked->nodes_intent_locked ^= 1 << l; iter->nodes_intent_locked ^= 1 << l;
} }
break; break;
} }
...@@ -383,6 +372,14 @@ void __bch2_btree_iter_downgrade(struct btree_iter *iter, ...@@ -383,6 +372,14 @@ void __bch2_btree_iter_downgrade(struct btree_iter *iter,
bch2_btree_trans_verify_locks(iter->trans); 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: */ /* Btree transaction locking: */
bool bch2_trans_relock(struct btree_trans *trans) bool bch2_trans_relock(struct btree_trans *trans)
......
...@@ -136,6 +136,8 @@ static inline void bch2_btree_iter_downgrade(struct btree_iter *iter) ...@@ -136,6 +136,8 @@ static inline void bch2_btree_iter_downgrade(struct btree_iter *iter)
__bch2_btree_iter_downgrade(iter, 0); __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_replace(struct btree_iter *, struct btree *);
void bch2_btree_iter_node_drop(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, ...@@ -543,8 +543,7 @@ static inline int do_bch2_trans_commit(struct btree_trans *trans,
trans->nounlock = false; trans->nounlock = false;
trans_for_each_update2(trans, i) bch2_trans_downgrade(trans);
bch2_btree_iter_downgrade(i->iter);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment