bcachefs: bch2_trans_downgrade()
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 8 Jun 2020 17:26:48 +0000 (13:26 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:40 +0000 (17:08 -0400)
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>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h
fs/bcachefs/btree_update_leaf.c

index 43ea3ceafcf22e2927dd208cb485149e50125365..bed0bb67a85dfb597056ce638b4fdd3b52e80c7d 100644 (file)
@@ -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)
index f9dcbdc9ab5259ba4c670adc97ccfb6dd25dc657..bc408f1272e7f50fe1eaa1a1aa268d5b9f0e5340 100644 (file)
@@ -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 *);
 
index ffcaecc8a64fc2eaec3d32566b3f60b41c2be49f..fc4d4b0d3770692665472df58767b4bcfa27198e 100644 (file)
@@ -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;
 }