diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2020-06-08 13:26:48 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:40 -0400 |
commit | 72545b5e76b05407e13f369590479ef1a5fd0f52 (patch) | |
tree | 3f28367f1bd367da4e2fe00b759730c413f741c2 /fs | |
parent | 784d8d173d7aa68a32ea04c45bc8a038e4cfbc4e (diff) |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bcachefs/btree_iter.c | 41 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 3 |
3 files changed, 22 insertions, 24 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 43ea3ceafcf2..bed0bb67a85d 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -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; - - /* - * 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; + unsigned l, new_locks_want = downgrade_to ?: + (iter->flags & BTREE_ITER_INTENT ? 1 : 0); - linked->locks_want = new_locks_want; + if (iter->locks_want < downgrade_to) { + iter->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) diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index f9dcbdc9ab52..bc408f1272e7 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -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 *); diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index ffcaecc8a64f..fc4d4b0d3770 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -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; } |