bcachefs: Ensure bch2_trans_get_iter() returns iters with correct locks
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 12 Aug 2019 18:35:34 +0000 (14:35 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:25 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c

index 9e6faf7e2830586c1ea80c8f2717433a5ff0c276..a91d655035efea72efb0269093e13cf81e7afca6 100644 (file)
@@ -86,7 +86,7 @@ void __bch2_btree_node_lock_write(struct btree *b, struct btree_iter *iter)
        struct btree_iter *linked;
        unsigned readers = 0;
 
-       EBUG_ON(btree_node_read_locked(iter, b->c.level));
+       EBUG_ON(!btree_node_intent_locked(iter, b->c.level));
 
        trans_for_each_iter(iter->trans, linked)
                if (linked->l[b->c.level].b == b &&
@@ -1779,6 +1779,12 @@ found:
 
                iter->flags &= ~(BTREE_ITER_INTENT|BTREE_ITER_PREFETCH);
                iter->flags |= flags & (BTREE_ITER_INTENT|BTREE_ITER_PREFETCH);
+
+               if ((iter->flags & BTREE_ITER_INTENT) &&
+                   !bch2_btree_iter_upgrade(iter, 1)) {
+                       trace_trans_restart_upgrade(trans->ip);
+                       return ERR_PTR(-EINTR);
+               }
        }
 
        BUG_ON(iter->btree_id != btree_id);