diff options
Diffstat (limited to 'c_src')
-rw-r--r-- | c_src/cmd_format.c | 3 | ||||
-rw-r--r-- | c_src/cmd_fsck.c | 1 | ||||
-rw-r--r-- | c_src/cmd_fusemount.c | 4 | ||||
-rw-r--r-- | c_src/cmd_image.c | 14 | ||||
-rw-r--r-- | c_src/cmd_super.c | 93 | ||||
-rw-r--r-- | c_src/cmd_super.h | 8 | ||||
-rw-r--r-- | c_src/libbcachefs.c | 25 | ||||
-rw-r--r-- | c_src/tools-util.c | 5 |
8 files changed, 113 insertions, 40 deletions
diff --git a/c_src/cmd_format.c b/c_src/cmd_format.c index 740b0e81..841a7913 100644 --- a/c_src/cmd_format.c +++ b/c_src/cmd_format.c @@ -21,6 +21,7 @@ #include <uuid/uuid.h> #include "cmds.h" +#include "cmd_super.h" #include "tools-util.h" #include "posix_to_bcachefs.h" #include "libbcachefs.h" @@ -293,7 +294,7 @@ int cmd_format(int argc, char *argv[]) struct printbuf buf = PRINTBUF; buf.human_readable_units = true; - bch2_sb_to_text(&buf, sb, false, 1 << BCH_SB_FIELD_members_v2); + bch2_sb_to_text_with_names(&buf, sb, false, 1 << BCH_SB_FIELD_members_v2, -1); printf("%s", buf.buf); printbuf_exit(&buf); } diff --git a/c_src/cmd_fsck.c b/c_src/cmd_fsck.c index 8c37b1ba..17e3af4d 100644 --- a/c_src/cmd_fsck.c +++ b/c_src/cmd_fsck.c @@ -208,6 +208,7 @@ static void fsck_usage(void) " -f Force checking even if filesystem is marked clean\n" " -r, --ratelimit_errors Don't display more than 10 errors of a given type\n" " -k, --kernel Use the in-kernel fsck implementation\n" + " -K, --no-kernel\n" " -v Be verbose\n" " -h, --help Display this help and exit\n" "Report bugs to <linux-bcachefs@vger.kernel.org>"); diff --git a/c_src/cmd_fusemount.c b/c_src/cmd_fusemount.c index e5740050..056e9a08 100644 --- a/c_src/cmd_fusemount.c +++ b/c_src/cmd_fusemount.c @@ -214,7 +214,7 @@ retry: bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); err: - bch2_trans_iter_exit(trans, &iter); + bch2_trans_iter_exit(&iter); if (ret == -EINTR) goto retry; @@ -554,7 +554,7 @@ retry: ret = bch2_trans_commit(trans, NULL, NULL, BCH_TRANS_COMMIT_no_enospc); err: - bch2_trans_iter_exit(trans, &iter); + bch2_trans_iter_exit(&iter); if (ret == -EINTR) goto retry; diff --git a/c_src/cmd_image.c b/c_src/cmd_image.c index 467378b0..01179254 100644 --- a/c_src/cmd_image.c +++ b/c_src/cmd_image.c @@ -165,23 +165,19 @@ static void check_gaps(struct bch_fs *c) static int get_nbuckets_used(struct bch_fs *c, u64 *nbuckets) { - struct btree_trans *trans = bch2_trans_get(c); - struct btree_iter iter; - bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, POS(0, U64_MAX), 0); + CLASS(btree_trans, trans)(c); + CLASS(btree_iter, iter)(trans, BTREE_ID_alloc, POS(0, U64_MAX), 0); struct bkey_s_c k; - int ret = lockrestart_do(trans, bkey_err(k = bch2_btree_iter_peek_prev(trans, &iter))); + int ret = lockrestart_do(trans, bkey_err(k = bch2_btree_iter_peek_prev(&iter))); if (!ret && k.k->type != KEY_TYPE_alloc_v4) ret = -ENOENT; if (ret) { fprintf(stderr, "error looking up last alloc key: %s\n", bch2_err_str(ret)); - goto err; + return ret; } *nbuckets = (k.k->p.offset + 1); -err: - bch2_trans_iter_exit(trans, &iter); - bch2_trans_put(trans); - return ret; + return 0; } diff --git a/c_src/cmd_super.c b/c_src/cmd_super.c index 3161205f..00776b1b 100644 --- a/c_src/cmd_super.c +++ b/c_src/cmd_super.c @@ -21,6 +21,7 @@ #include <uuid/uuid.h> #include "cmds.h" +#include "cmd_super.h" #include "libbcachefs.h" #include "libbcachefs/opts.h" #include "libbcachefs/super-io.h" @@ -28,6 +29,8 @@ #include "libbcachefs/darray.h" +#include "src/rust_to_c.h" + static void show_super_usage(void) { puts("bcachefs show-super \n" @@ -42,6 +45,72 @@ static void show_super_usage(void) exit(EXIT_SUCCESS); } +static struct sb_name *sb_dev_to_name(sb_names sb_names, unsigned idx) +{ + darray_for_each(sb_names, i) + if (i->sb.sb->dev_idx == idx) + return i; + return NULL; +} + +static void print_one_member(struct printbuf *out, sb_names sb_names, + struct bch_sb *sb, + struct bch_sb_field_disk_groups *gi, + struct bch_member m, unsigned idx) +{ + struct sb_name *name = sb_dev_to_name(sb_names, idx); + prt_printf(out, "Device %u:\t%s\t", idx, name ? name->name : "(not found)"); + + if (name) { + char *model = fd_to_dev_model(name->sb.bdev->bd_fd); + prt_str(out, model); + free(model); + } + prt_newline(out); + + printbuf_indent_add(out, 2); + bch2_member_to_text(out, &m, gi, sb, idx); + printbuf_indent_sub(out, 2); +} + +void bch2_sb_to_text_with_names(struct printbuf *out, struct bch_sb *sb, + bool print_layout, unsigned fields, int field_only) +{ + CLASS(printbuf, uuid_buf)(); + prt_str(&uuid_buf, "UUID="); + pr_uuid(&uuid_buf, sb->user_uuid.b); + + sb_names sb_names = {}; + bch2_scan_device_sbs(uuid_buf.buf, &sb_names); + + if (field_only >= 0) { + struct bch_sb_field *f = bch2_sb_field_get_id(sb, field_only); + + if (f) + __bch2_sb_field_to_text(out, sb, f); + } else { + printbuf_tabstop_push(out, 44); + + bch2_sb_to_text(out, sb, print_layout, + fields & ~(BIT(BCH_SB_FIELD_members_v1)| + BIT(BCH_SB_FIELD_members_v2))); + + struct bch_sb_field_disk_groups *gi = bch2_sb_field_get(sb, disk_groups); + + struct bch_sb_field_members_v1 *mi1; + if ((fields & BIT(BCH_SB_FIELD_members_v1)) && + (mi1 = bch2_sb_field_get(sb, members_v1))) + for (unsigned i = 0; i < sb->nr_devices; i++) + print_one_member(out, sb_names, sb, gi, bch2_members_v1_get(mi1, i), i); + + struct bch_sb_field_members_v2 *mi2; + if ((fields & BIT(BCH_SB_FIELD_members_v2)) && + (mi2 = bch2_sb_field_get(sb, members_v2))) + for (unsigned i = 0; i < sb->nr_devices; i++) + print_one_member(out, sb_names, sb, gi, bch2_members_v2_get(mi2, i), i); + } +} + int cmd_show_super(int argc, char *argv[]) { static const struct option longopts[] = { @@ -98,32 +167,16 @@ int cmd_show_super(int argc, char *argv[]) if (print_default_fields) { fields |= bch2_sb_field_get(sb.sb, members_v2) - ? 1 << BCH_SB_FIELD_members_v2 - : 1 << BCH_SB_FIELD_members_v1; - fields |= 1 << BCH_SB_FIELD_errors; + ? BIT(BCH_SB_FIELD_members_v2) + : BIT(BCH_SB_FIELD_members_v1); + fields |= BIT(BCH_SB_FIELD_errors); } struct printbuf buf = PRINTBUF; buf.human_readable_units = true; - if (field_only >= 0) { - struct bch_sb_field *f = bch2_sb_field_get_id(sb.sb, field_only); - - if (f) - __bch2_sb_field_to_text(&buf, sb.sb, f); - } else { - printbuf_tabstop_push(&buf, 44); - - char *model = fd_to_dev_model(sb.bdev->bd_fd); - prt_str(&buf, "Device:"); - prt_tab(&buf); - prt_str(&buf, model); - prt_newline(&buf); - free(model); - - bch2_sb_to_text(&buf, sb.sb, print_layout, fields); - } + bch2_sb_to_text_with_names(&buf, sb.sb, print_layout, fields, field_only); printf("%s", buf.buf); bch2_free_super(&sb); diff --git a/c_src/cmd_super.h b/c_src/cmd_super.h new file mode 100644 index 00000000..78f71967 --- /dev/null +++ b/c_src/cmd_super.h @@ -0,0 +1,8 @@ +#ifndef _TOOLS_CMD_SHOW_SUPER_H +#define _TOOLS_CMD_SHOW_SUPER_H + +#include "libbcachefs/super-io.h" + +void bch2_sb_to_text_with_names(struct printbuf *, struct bch_sb *, bool, unsigned, int); + +#endif /* _TOOLS_CMD_SHOW_SUPER_H */ diff --git a/c_src/libbcachefs.c b/c_src/libbcachefs.c index 6b31d56f..2b5ca211 100644 --- a/c_src/libbcachefs.c +++ b/c_src/libbcachefs.c @@ -79,14 +79,25 @@ void bch2_sb_layout_init(struct bch_sb_layout *l, } } -static u64 dev_max_bucket_size(struct bch_opts fs_opts, u64 dev_size) +static u64 dev_bucket_size_clamp(struct bch_opts fs_opts, u64 dev_size, u64 fs_bucket_size) { - u64 size = rounddown_pow_of_two(dev_size / (BCH_MIN_NR_NBUCKETS * 4)); + u64 max_size = rounddown_pow_of_two(dev_size / (BCH_MIN_NR_NBUCKETS * 4)); if (opt_defined(fs_opts, btree_node_size)) - size = max(size, fs_opts.btree_node_size); - if (size * BCH_MIN_NR_NBUCKETS > dev_size) - die("bucket size %llu too big for device size", size); - return size; + max_size = max(max_size, fs_opts.btree_node_size); + if (max_size * BCH_MIN_NR_NBUCKETS > dev_size) + die("bucket size %llu too big for device size", max_size); + + u64 dev_bucket_size = min(max_size, fs_bucket_size); + + /* + * Use encoded_extent_max instead of 64k? + */ + + while (dev_bucket_size < 64 << 10 && + dev_size / (dev_bucket_size * 2) >= BCH_MIN_NR_NBUCKETS) + dev_bucket_size *= 2; + + return dev_bucket_size; } u64 bch2_pick_bucket_size(struct bch_opts opts, dev_opts_list devs) @@ -214,7 +225,7 @@ struct bch_sb *bch2_format(struct bch_opt_strs fs_opt_strs, darray_for_each(devs, i) if (!opt_defined(i->opts, bucket_size)) opt_set(i->opts, bucket_size, - min(fs_bucket_size, dev_max_bucket_size(fs_opts, i->fs_size))); + dev_bucket_size_clamp(fs_opts, i->fs_size, fs_bucket_size)); darray_for_each(devs, i) { i->nbuckets = i->fs_size / i->opts.bucket_size; diff --git a/c_src/tools-util.c b/c_src/tools-util.c index 5a15f306..f48d3f21 100644 --- a/c_src/tools-util.c +++ b/c_src/tools-util.c @@ -22,6 +22,7 @@ #include "linux/sort.h" #include "tools-util.h" #include "libbcachefs/util.h" +#include "src/rust_to_c.h" void die(const char *fmt, ...) { @@ -777,7 +778,9 @@ darray_const_str get_or_split_cmdline_devs(int argc, char *argv[]) darray_const_str ret = {}; if (argc == 1) { - bch2_split_devs(argv[0], &ret); + char *dev = bch2_scan_devices(argv[0]); + + bch2_split_devs(dev, &ret); } else { for (unsigned i = 0; i < argc; i++) darray_push(&ret, strdup(argv[i])); |