X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=cmd_format.c;h=42f3fc6ca4ac822422906a1505a20ff7c6a571ce;hb=9f98746bfcd5159307237f7a491fd79db02d8bf3;hp=d25163a7ecba0b7b76ff93805021d038038d83f2;hpb=733a17f637dccb7b47bcb3016dd867974db7088d;p=bcachefs-tools-debian diff --git a/cmd_format.c b/cmd_format.c index d25163a..42f3fc6 100644 --- a/cmd_format.c +++ b/cmd_format.c @@ -20,11 +20,11 @@ #include -#include "ccan/darray/darray.h" - #include "cmds.h" #include "libbcachefs.h" #include "crypto.h" +#include "libbcachefs/darray.h" +#include "libbcachefs/errcode.h" #include "libbcachefs/opts.h" #include "libbcachefs/super-io.h" #include "libbcachefs/util.h" @@ -80,7 +80,7 @@ static void usage(void) "Device specific options must come before corresponding devices, e.g.\n" " bcachefs format --label cache /dev/sdb /dev/sdc\n" "\n" - "Report bugs to "); + "Report bugs to "); } enum { @@ -114,17 +114,14 @@ u64 read_flag_list_or_die(char *opt, const char * const list[], int cmd_format(int argc, char *argv[]) { - darray(struct dev_opts) devices; - darray(char *) device_paths; + DARRAY(struct dev_opts) devices = { 0 }; + DARRAY(char *) device_paths = { 0 }; struct format_opts opts = format_opts_default(); struct dev_opts dev_opts = dev_opts_default(), *dev; bool force = false, no_passphrase = false, quiet = false, initialize = true, verbose = false; unsigned v; int opt; - darray_init(devices); - darray_init(device_paths); - struct bch_opt_strs fs_opt_strs = bch2_cmdline_opts_get(&argc, argv, OPT_FORMAT); struct bch_opts fs_opts = bch2_parse_opts(fs_opt_strs); @@ -201,9 +198,9 @@ int cmd_format(int argc, char *argv[]) initialize = false; break; case O_no_opt: - darray_append(device_paths, optarg); + darray_push(&device_paths, optarg); dev_opts.path = optarg; - darray_append(devices, dev_opts); + darray_push(&devices, dev_opts); dev_opts.size = 0; break; case O_quiet: @@ -222,7 +219,10 @@ int cmd_format(int argc, char *argv[]) break; } - if (darray_empty(devices)) + if (opts.version != bcachefs_metadata_version_current) + initialize = false; + + if (!devices.nr) die("Please supply a device"); if (opts.encrypted && !no_passphrase) { @@ -230,22 +230,25 @@ int cmd_format(int argc, char *argv[]) initialize = false; } - darray_foreach(dev, devices) - dev->fd = open_for_format(dev->path, force); + darray_for_each(devices, dev) { + int ret = open_for_format(dev, force); + if (ret) + die("Error opening %s: %s", dev_opts.path, strerror(-ret)); + } struct bch_sb *sb = bch2_format(fs_opt_strs, fs_opts, opts, - devices.item, darray_size(devices)); + devices.data, devices.nr); bch2_opt_strs_free(&fs_opt_strs); if (!quiet) { struct printbuf buf = PRINTBUF; - buf.units = PRINTBUF_UNITS_HUMAN_READABLE; + buf.human_readable_units = true; - bch2_sb_to_text(&buf, sb, false, 1 << BCH_SB_FIELD_members); + bch2_sb_to_text(&buf, sb, false, 1 << BCH_SB_FIELD_members_v2); printf("%s", buf.buf); printbuf_exit(&buf); @@ -257,7 +260,7 @@ int cmd_format(int argc, char *argv[]) free(opts.passphrase); } - darray_free(devices); + darray_exit(&devices); if (initialize) { struct bch_opts mount_opts = bch2_opts_empty(); @@ -269,17 +272,17 @@ int cmd_format(int argc, char *argv[]) * Start the filesystem once, to allocate the journal and create * the root directory: */ - struct bch_fs *c = bch2_fs_open(device_paths.item, - darray_size(device_paths), + struct bch_fs *c = bch2_fs_open(device_paths.data, + device_paths.nr, mount_opts); if (IS_ERR(c)) - die("error opening %s: %s", device_paths.item[0], - strerror(-PTR_ERR(c))); + die("error opening %s: %s", device_paths.data[0], + bch2_err_str(PTR_ERR(c))); bch2_fs_stop(c); } - darray_free(device_paths); + darray_exit(&device_paths); return 0; } @@ -293,7 +296,7 @@ static void show_super_usage(void) " -f, --fields=(fields) list of sections to print\n" " -l, --layout print superblock layout\n" " -h, --help display this help and exit\n" - "Report bugs to "); + "Report bugs to "); exit(EXIT_SUCCESS); } @@ -305,8 +308,9 @@ int cmd_show_super(int argc, char *argv[]) { "help", 0, NULL, 'h' }, { NULL } }; - unsigned fields = 1 << BCH_SB_FIELD_members; + unsigned fields = 0; bool print_layout = false; + bool print_default_fields = true; int opt; while ((opt = getopt_long(argc, argv, "f:lh", longopts, NULL)) != -1) @@ -316,6 +320,7 @@ int cmd_show_super(int argc, char *argv[]) ? ~0 : read_flag_list_or_die(optarg, bch2_sb_fields, "superblock field"); + print_default_fields = false; break; case 'l': print_layout = true; @@ -340,11 +345,16 @@ int cmd_show_super(int argc, char *argv[]) struct bch_sb_handle sb; int ret = bch2_read_super(dev, &opts, &sb); if (ret) - die("Error opening %s: %s", dev, strerror(-ret)); + die("Error opening %s: %s", dev, bch2_err_str(ret)); + + if (print_default_fields) + fields = bch2_sb_get_members_v2(sb.sb) + ? 1 << BCH_SB_FIELD_members_v2 + : 1 << BCH_SB_FIELD_members_v1; struct printbuf buf = PRINTBUF; - buf.units = PRINTBUF_UNITS_HUMAN_READABLE; + buf.human_readable_units = true; bch2_sb_to_text(&buf, sb.sb, print_layout, fields); printf("%s", buf.buf);