mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
sketch
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
d061c7ea11
commit
26282ecfc6
@ -263,6 +263,99 @@ int cmd_format(int argc, char *argv[])
|
|||||||
initialize = false;
|
initialize = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (build_compact_filesystem) {
|
||||||
|
/* create tmp file */
|
||||||
|
/* estimate size of metadata we need? */
|
||||||
|
|
||||||
|
/* append tmp file to list of devices */
|
||||||
|
/* set data_allowed appropriately for devices to format */
|
||||||
|
|
||||||
|
/* format */
|
||||||
|
|
||||||
|
new_dev_opts->dawa_allowed = (1U << BCH_DATA_user);
|
||||||
|
tmp_dev_opts->data_allowed = ((1U << BCH_DATA_journal)|
|
||||||
|
(1U << BCH_DATA_btree));
|
||||||
|
|
||||||
|
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.data, devices.nr);
|
||||||
|
bch2_opt_strs_free(&fs_opt_strs);
|
||||||
|
|
||||||
|
if (!quiet) {
|
||||||
|
struct printbuf buf = PRINTBUF;
|
||||||
|
|
||||||
|
buf.human_readable_units = true;
|
||||||
|
|
||||||
|
bch2_sb_to_text(&buf, sb, false, 1 << BCH_SB_FIELD_members_v2);
|
||||||
|
printf("%s", buf.buf);
|
||||||
|
|
||||||
|
printbuf_exit(&buf);
|
||||||
|
}
|
||||||
|
free(sb);
|
||||||
|
|
||||||
|
if (opts.passphrase) {
|
||||||
|
memzero_explicit(opts.passphrase, strlen(opts.passphrase));
|
||||||
|
free(opts.passphrase);
|
||||||
|
}
|
||||||
|
|
||||||
|
darray_exit(&devices);
|
||||||
|
|
||||||
|
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.data,
|
||||||
|
device_paths.nr,
|
||||||
|
mount_opts);
|
||||||
|
if (IS_ERR(c))
|
||||||
|
die("error opening %s: %s", device_paths.data[0],
|
||||||
|
bch2_err_str(PTR_ERR(c)));
|
||||||
|
|
||||||
|
build_fs(c, opts.source);
|
||||||
|
|
||||||
|
/* set data_allowed |= 1U << BCH_DATA_btree on new device */
|
||||||
|
/* now, migrate btrees we want to the new dev */
|
||||||
|
|
||||||
|
for (btrees_that_we_move) {
|
||||||
|
ret = bch2_move_btree(c,
|
||||||
|
BBPOS(btree, POS_MIN),
|
||||||
|
BBPOS(btree, SPOS_MAX),
|
||||||
|
your_pred, &op, NULL);
|
||||||
|
if (ret)
|
||||||
|
die("");
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 highest_bucket_used = 0;
|
||||||
|
|
||||||
|
/* truncate image */
|
||||||
|
for_each_btree_key_upto(...,
|
||||||
|
BTREE_ID_alloc,
|
||||||
|
POS(dev_idx, 0),
|
||||||
|
POS(dev_idx, U64_MAX),
|
||||||
|
if (k.k->type == KEY_TYPE_alloc_v4 &&
|
||||||
|
bkey_s_c_to_alloc_v4(k).v->dirty_sectors)
|
||||||
|
highest_bucket_used = k.k->offset;
|
||||||
|
);
|
||||||
|
|
||||||
|
/* set ca->mi.nbuckets to highest_bucket_used + 1 */
|
||||||
|
/* write super */
|
||||||
|
/* truncate file */
|
||||||
|
|
||||||
|
bch2_fs_stop(c);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
darray_for_each(devices, dev) {
|
darray_for_each(devices, dev) {
|
||||||
int ret = open_for_format(dev, force);
|
int ret = open_for_format(dev, force);
|
||||||
if (ret)
|
if (ret)
|
||||||
@ -301,9 +394,13 @@ int cmd_format(int argc, char *argv[])
|
|||||||
initialize = 1;
|
initialize = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initialize) {
|
if (build_compact_filesystem) {
|
||||||
struct bch_opts mount_opts = bch2_opts_empty();
|
/* create tmp file */
|
||||||
|
/* estimate size of metadata we need? */
|
||||||
|
|
||||||
|
/* append tmp file to list of devices */
|
||||||
|
|
||||||
|
struct bch_opts mount_opts = bch2_opts_empty();
|
||||||
|
|
||||||
opt_set(mount_opts, verbose, verbose);
|
opt_set(mount_opts, verbose, verbose);
|
||||||
|
|
||||||
@ -318,10 +415,29 @@ int cmd_format(int argc, char *argv[])
|
|||||||
die("error opening %s: %s", device_paths.data[0],
|
die("error opening %s: %s", device_paths.data[0],
|
||||||
bch2_err_str(PTR_ERR(c)));
|
bch2_err_str(PTR_ERR(c)));
|
||||||
|
|
||||||
if (opts.source) {
|
if (opts.source)
|
||||||
build_fs(c, opts.source);
|
build_fs(c, opts.source);
|
||||||
}
|
|
||||||
|
|
||||||
|
bch2_fs_stop(c);
|
||||||
|
|
||||||
|
} else 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.data,
|
||||||
|
device_paths.nr,
|
||||||
|
mount_opts);
|
||||||
|
if (IS_ERR(c))
|
||||||
|
die("error opening %s: %s", device_paths.data[0],
|
||||||
|
bch2_err_str(PTR_ERR(c)));
|
||||||
|
|
||||||
|
if (opts.source)
|
||||||
|
build_fs(c, opts.source);
|
||||||
|
|
||||||
bch2_fs_stop(c);
|
bch2_fs_stop(c);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user