summaryrefslogtreecommitdiff
path: root/c_src
diff options
context:
space:
mode:
Diffstat (limited to 'c_src')
-rw-r--r--c_src/cmd_dump.c10
-rw-r--r--c_src/cmd_kill_btree_node.c73
2 files changed, 39 insertions, 44 deletions
diff --git a/c_src/cmd_dump.c b/c_src/cmd_dump.c
index f89d83ae..86ff507d 100644
--- a/c_src/cmd_dump.c
+++ b/c_src/cmd_dump.c
@@ -70,26 +70,24 @@ static void dump_one_device(struct bch_fs *c, struct bch_dev *ca, int fd,
/* Btree: */
for (i = 0; i < BTREE_ID_NR; i++) {
struct btree_trans *trans = bch2_trans_get(c);
- struct btree_iter iter;
- struct btree *b;
- __for_each_btree_node(trans, iter, i, POS_MIN, 0, 1, 0, b, ret) {
+ ret = __for_each_btree_node(trans, iter, i, POS_MIN, 0, 1, 0, b, ({
struct btree_node_iter iter;
struct bkey u;
struct bkey_s_c k;
for_each_btree_node_key_unpack(b, k, &iter, &u)
dump_node(c, ca, k, &data);
- }
+ 0;
+ }));
if (ret)
die("error %s walking btree nodes", bch2_err_str(ret));
- b = bch2_btree_id_root(c, i)->b;
+ struct btree *b = bch2_btree_id_root(c, i)->b;
if (!btree_node_fake(b))
dump_node(c, ca, bkey_i_to_s_c(&b->key), &data);
- bch2_trans_iter_exit(trans, &iter);
bch2_trans_put(trans);
}
diff --git a/c_src/cmd_kill_btree_node.c b/c_src/cmd_kill_btree_node.c
index fe551d94..dd230752 100644
--- a/c_src/cmd_kill_btree_node.c
+++ b/c_src/cmd_kill_btree_node.c
@@ -64,9 +64,6 @@ int cmd_kill_btree_node(int argc, char *argv[])
if (IS_ERR(c))
die("error opening %s: %s", argv[0], bch2_err_str(PTR_ERR(c)));
- struct btree_trans *trans = bch2_trans_get(c);
- struct btree_iter iter;
- struct btree *b;
int ret;
void *zeroes;
@@ -74,46 +71,46 @@ int cmd_kill_btree_node(int argc, char *argv[])
if (ret)
die("error %s from posix_memalign", bch2_err_str(ret));
- __for_each_btree_node(trans, iter, btree_id, POS_MIN, 0, level, 0, b, ret) {
- if (b->c.level != level)
- continue;
-
- if (!node_index) {
- struct printbuf buf = PRINTBUF;
- bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
- bch_info(c, "killing btree node %s", buf.buf);
- printbuf_exit(&buf);
-
- struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(bkey_i_to_s_c(&b->key));
- bkey_for_each_ptr(ptrs, ptr) {
- struct bch_dev *ca = bch2_dev_tryget(c, ptr->dev);
- if (!ca)
- continue;
-
- ret = pwrite(ca->disk_sb.bdev->bd_fd, zeroes,
- c->opts.block_size, ptr->offset << 9);
- bch2_dev_put(ca);
- if (ret != c->opts.block_size) {
- bch_err(c, "pwrite error: expected %u got %i %s",
- c->opts.block_size, ret, strerror(errno));
- ret = EXIT_FAILURE;
- goto done;
+ ret = bch2_trans_run(c,
+ __for_each_btree_node(trans, iter, btree_id, POS_MIN, 0, level, 0, b, ({
+ if (b->c.level != level)
+ continue;
+
+ int ret2 = 0;
+ if (!node_index) {
+ struct printbuf buf = PRINTBUF;
+ bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&b->key));
+ bch_info(c, "killing btree node %s", buf.buf);
+ printbuf_exit(&buf);
+
+ ret2 = 1;
+
+ struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(bkey_i_to_s_c(&b->key));
+ bkey_for_each_ptr(ptrs, ptr) {
+ struct bch_dev *ca = bch2_dev_tryget(c, ptr->dev);
+ if (!ca)
+ continue;
+
+ int ret3 = pwrite(ca->disk_sb.bdev->bd_fd, zeroes,
+ c->opts.block_size, ptr->offset << 9);
+ bch2_dev_put(ca);
+ if (ret3 != c->opts.block_size) {
+ bch_err(c, "pwrite error: expected %u got %i %s",
+ c->opts.block_size, ret, strerror(errno));
+ ret2 = EXIT_FAILURE;
+ }
}
}
- ret = 0;
- goto done;
- }
- node_index--;
- }
- if (ret)
+ node_index--;
+ ret2;
+ })));
+ if (ret < 0)
bch_err(c, "error %i walking btree nodes", ret);
- else
+ else if (!ret) {
bch_err(c, "node at specified index not found");
- ret = EXIT_FAILURE;
-done:
- bch2_trans_iter_exit(trans, &iter);
- bch2_trans_put(trans);
+ ret = EXIT_FAILURE;
+ }
bch2_fs_stop(c);
return ret;