bcachefs: Fix an error path
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 22 Jul 2020 22:26:04 +0000 (18:26 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:43 +0000 (17:08 -0400)
We were missing a 'goto retry' and continuing on with an error pointer.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update_interior.c

index 81386b26f369a71205edb34bd55e75e08af4aa91..5317f29c27766f8530f61b47d2d3347cdb084b2d 100644 (file)
@@ -1869,7 +1869,7 @@ int bch2_btree_node_update_key(struct bch_fs *c, struct btree_iter *iter,
 
                new_hash = bch2_btree_node_mem_alloc(c);
        }
-
+retry:
        as = bch2_btree_update_start(iter->trans, iter->btree_id,
                parent ? btree_update_reserve_required(c, parent) : 0,
                BTREE_INSERT_NOFAIL|
@@ -1882,16 +1882,17 @@ int bch2_btree_node_update_key(struct bch_fs *c, struct btree_iter *iter,
                if (ret == -EAGAIN)
                        ret = -EINTR;
 
-               if (ret != -EINTR)
-                       goto err;
+               if (ret == -EINTR) {
+                       bch2_trans_unlock(iter->trans);
+                       up_read(&c->gc_lock);
+                       closure_sync(&cl);
+                       down_read(&c->gc_lock);
 
-               bch2_trans_unlock(iter->trans);
-               up_read(&c->gc_lock);
-               closure_sync(&cl);
-               down_read(&c->gc_lock);
+                       if (bch2_trans_relock(iter->trans))
+                               goto retry;
+               }
 
-               if (!bch2_trans_relock(iter->trans))
-                       goto err;
+               goto err;
        }
 
        ret = bch2_mark_bkey_replicas(c, bkey_i_to_s_c(new_key));