diff options
Diffstat (limited to 'c_src')
-rw-r--r-- | c_src/cmd_dump.c | 10 | ||||
-rw-r--r-- | c_src/cmd_kill_btree_node.c | 73 |
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; |