]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/backpointers.c
Merge pull request #196 from Conan-Kudo/spec-libexecdir
[bcachefs-tools-debian] / libbcachefs / backpointers.c
index 9b5f5809ba3798bd7ba2e3b5c0f072045ac14428..a97fc2b61ee2dc48e64180b253064a750f669381 100644 (file)
@@ -391,17 +391,12 @@ fsck_err:
 /* verify that every backpointer has a corresponding alloc key */
 int bch2_check_btree_backpointers(struct bch_fs *c)
 {
-       struct btree_iter iter;
-       struct bkey_s_c k;
-       int ret;
-
-       ret = bch2_trans_run(c,
+       int ret = bch2_trans_run(c,
                for_each_btree_key_commit(trans, iter,
                        BTREE_ID_backpointers, POS_MIN, 0, k,
                        NULL, NULL, BCH_TRANS_COMMIT_no_enospc,
                  bch2_check_btree_backpointer(trans, &iter, k)));
-       if (ret)
-               bch_err_fn(c, ret);
+       bch_err_fn(c, ret);
        return ret;
 }
 
@@ -417,8 +412,11 @@ static int check_bp_exists(struct btree_trans *trans,
        struct btree_iter bp_iter = { NULL };
        struct printbuf buf = PRINTBUF;
        struct bkey_s_c bp_k;
+       struct bkey_buf tmp;
        int ret;
 
+       bch2_bkey_buf_init(&tmp);
+
        if (bpos_lt(bucket, bucket_start) ||
            bpos_gt(bucket, bucket_end))
                return 0;
@@ -438,6 +436,8 @@ static int check_bp_exists(struct btree_trans *trans,
                if (!bpos_eq(orig_k.k->p, last_flushed->k->k.p) ||
                    bkey_bytes(orig_k.k) != bkey_bytes(&last_flushed->k->k) ||
                    memcmp(orig_k.v, &last_flushed->k->v, bkey_val_bytes(orig_k.k))) {
+                       bch2_bkey_buf_reassemble(&tmp, c, orig_k);
+
                        if (bp.level) {
                                bch2_trans_unlock(trans);
                                bch2_btree_interior_updates_flush(c);
@@ -447,7 +447,7 @@ static int check_bp_exists(struct btree_trans *trans,
                        if (ret)
                                goto err;
 
-                       bch2_bkey_buf_reassemble(last_flushed, c, orig_k);
+                       bch2_bkey_buf_copy(last_flushed, c, tmp.k);
                        ret = -BCH_ERR_transaction_restart_write_buffer_flush;
                        goto out;
                }
@@ -457,6 +457,7 @@ out:
 err:
 fsck_err:
        bch2_trans_iter_exit(trans, &bp_iter);
+       bch2_bkey_buf_exit(&tmp, c);
        printbuf_exit(&buf);
        return ret;
 missing:
@@ -763,8 +764,7 @@ int bch2_check_extents_to_backpointers(struct bch_fs *c)
        }
        bch2_trans_put(trans);
 
-       if (ret)
-               bch_err_fn(c, ret);
+       bch_err_fn(c, ret);
        return ret;
 }
 
@@ -818,8 +818,6 @@ static int bch2_check_backpointers_to_extents_pass(struct btree_trans *trans,
                                                   struct bbpos start,
                                                   struct bbpos end)
 {
-       struct btree_iter iter;
-       struct bkey_s_c k;
        struct bpos last_flushed_pos = SPOS_MAX;
 
        return for_each_btree_key_commit(trans, iter, BTREE_ID_backpointers,
@@ -871,7 +869,6 @@ int bch2_check_backpointers_to_extents(struct bch_fs *c)
        }
        bch2_trans_put(trans);
 
-       if (ret)
-               bch_err_fn(c, ret);
+       bch_err_fn(c, ret);
        return ret;
 }