diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2024-08-09 14:43:59 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-08-10 11:52:25 -0400 |
commit | 6687752a1d0904442dd9946157248b5496bd6e50 (patch) | |
tree | 640247ecba08f3a99fd3779cdc9edd4b855a2819 /c_src/cmd_kill_btree_node.c | |
parent | 495a54c03b00ccc913ec8b4f3f5eb837c841d519 (diff) |
Update bcachefs sources to 070f7d6a382a bcachefs: bch2_sb_nr_devices()
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'c_src/cmd_kill_btree_node.c')
-rw-r--r-- | c_src/cmd_kill_btree_node.c | 73 |
1 files changed, 35 insertions, 38 deletions
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; |