]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - cmd_format.c
cmd_device_set_state: use buffered IO for writing superblock
[bcachefs-tools-debian] / cmd_format.c
index 2c610af23b44f0d56aadd316fdeb3b747302269c..4debc285f9101a3df0e8e0c474fbce43a9d00814 100644 (file)
 
 #include <uuid/uuid.h>
 
-#include "ccan/darray/darray.h"
-
 #include "cmds.h"
 #include "libbcachefs.h"
 #include "crypto.h"
+#include "libbcachefs/darray.h"
 #include "libbcachefs/opts.h"
 #include "libbcachefs/super-io.h"
 #include "libbcachefs/util.h"
@@ -46,6 +45,7 @@ x(0,  version,                required_argument)      \
 x(0,   no_initialize,          no_argument)            \
 x('f', force,                  no_argument)            \
 x('q', quiet,                  no_argument)            \
+x('v', verbose,                no_argument)            \
 x('h', help,                   no_argument)
 
 static void usage(void)
@@ -73,12 +73,13 @@ static void usage(void)
             "\n"
             "  -f, --force\n"
             "  -q, --quiet                 Only print errors\n"
+            "  -v, --verbose               Verbose filesystem initialization\n"
             "  -h, --help                  Display this help and exit\n"
             "\n"
             "Device specific options must come before corresponding devices, e.g.\n"
             "  bcachefs format --label cache /dev/sdb /dev/sdc\n"
             "\n"
-            "Report bugs to <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
 }
 
 enum {
@@ -112,23 +113,20 @@ 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;
+       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);
 
        while ((opt = getopt_long(argc, argv,
-                                 "-L:U:g:fqh",
+                                 "-L:U:g:fqhv",
                                  format_opts,
                                  NULL)) != -1)
                switch (opt) {
@@ -163,8 +161,6 @@ int cmd_format(int argc, char *argv[])
                case O_fs_size:
                        if (bch2_strtoull_h(optarg, &dev_opts.size))
                                die("invalid filesystem size");
-
-                       dev_opts.size >>= 9;
                        break;
                case O_superblock_size:
                        if (bch2_strtouint_h(optarg, &opts.superblock_size))
@@ -173,8 +169,8 @@ int cmd_format(int argc, char *argv[])
                        opts.superblock_size >>= 9;
                        break;
                case O_bucket_size:
-                       dev_opts.bucket_size =
-                               hatoi_validate(optarg, "bucket size");
+                       if (bch2_strtoull_h(optarg, &dev_opts.bucket_size))
+                               die("bad bucket_size %s", optarg);
                        break;
                case O_label:
                case 'l':
@@ -201,15 +197,17 @@ 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:
                case 'q':
                        quiet = true;
                        break;
+               case 'v':
+                       verbose = true;
                case O_help:
                case 'h':
                        usage();
@@ -220,7 +218,7 @@ int cmd_format(int argc, char *argv[])
                        break;
                }
 
-       if (darray_empty(devices))
+       if (!devices.nr)
                die("Please supply a device");
 
        if (opts.encrypted && !no_passphrase) {
@@ -228,18 +226,26 @@ int cmd_format(int argc, char *argv[])
                initialize = false;
        }
 
-       darray_foreach(dev, devices)
+       darray_for_each(devices, dev)
                dev->fd = open_for_format(dev->path, force);
 
        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)
-               bch2_sb_print(sb, false, 1 << BCH_SB_FIELD_members, HUMAN_READABLE);
+       if (!quiet) {
+               struct printbuf buf = PRINTBUF;
+
+               buf.human_readable_units = true;
+
+               bch2_sb_to_text(&buf, sb, false, 1 << BCH_SB_FIELD_members);
+               printf("%s", buf.buf);
+
+               printbuf_exit(&buf);
+       }
        free(sb);
 
        if (opts.passphrase) {
@@ -247,24 +253,29 @@ 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();
+
+
+               opt_set(mount_opts, verbose, verbose);
+
                /*
                 * 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),
-                                               bch2_opts_empty());
+               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,
+                       die("error opening %s: %s", device_paths.data[0],
                            strerror(-PTR_ERR(c)));
 
                bch2_fs_stop(c);
        }
 
-       darray_free(device_paths);
+       darray_exit(&device_paths);
 
        return 0;
 }
@@ -278,7 +289,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 <linux-bcache@vger.kernel.org>");
+            "Report bugs to <linux-bcachefs@vger.kernel.org>");
        exit(EXIT_SUCCESS);
 }
 
@@ -327,7 +338,14 @@ int cmd_show_super(int argc, char *argv[])
        if (ret)
                die("Error opening %s: %s", dev, strerror(-ret));
 
-       bch2_sb_print(sb.sb, print_layout, fields, HUMAN_READABLE);
+       struct printbuf buf = PRINTBUF;
+
+       buf.human_readable_units = true;
+
+       bch2_sb_to_text(&buf, sb.sb, print_layout, fields);
+       printf("%s", buf.buf);
+
        bch2_free_super(&sb);
+       printbuf_exit(&buf);
        return 0;
 }