summaryrefslogtreecommitdiff
path: root/bcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'bcache.c')
-rw-r--r--bcache.c151
1 files changed, 97 insertions, 54 deletions
diff --git a/bcache.c b/bcache.c
index b3c8e468..1074210e 100644
--- a/bcache.c
+++ b/bcache.c
@@ -28,56 +28,113 @@ static void usage(void)
puts("bcache - tool for managing bcache volumes/filesystems\n"
"usage: bcache <command> [<args>]\n"
"\n"
- "Commands for formatting, startup and shutdown:\n"
- " format Format a new filesystem\n"
- " unlock Unlock an encrypted filesystem prior to running/mounting\n"
- " assemble Assemble an existing multi device filesystem\n"
- " incremental Incrementally assemble an existing multi device filesystem\n"
- " run Start a partially assembled filesystem\n"
- " stop Stop a running filesystem\n"
+ "Superblock commands:\n"
+ " format Format a new filesystem\n"
+ " show-super Dump superblock information to stdout\n"
"\n"
+ "Repair:\n"
+ " bcache fsck Check an existing filesystem for errors\n"
+ "\n"
+ "Startup/shutdown, assembly of multi device filesystems:\n"
+ " unlock Unlock an encrypted filesystem prior to running/mounting\n"
+ " assemble Assemble an existing multi device filesystem\n"
+ " incremental Incrementally assemble an existing multi device filesystem\n"
+ " run Start a partially assembled filesystem\n"
+ " stop Stop a running filesystem\n"
+
"Commands for managing a running filesystem:\n"
- " fs_show Show various information about a filesystem\n"
- " fs_set Modify filesystem options\n"
+ " fs show Show various information about a filesystem\n"
+ " fs set Modify filesystem options\n"
"\n"
- "Commands for managing a specific device in a filesystem:\n"
- " device_show Show information about a formatted device\n"
- " device_add Add a device to an existing (running) filesystem\n"
- " device_fail Mark a device as failed\n"
- " device_remove Remove a device from an existing (running) filesystem\n"
+ "Commands for managing devices within a running filesystem:\n"
+ " device add Add a new device to an existing filesystem\n"
+ " device remove Remove a device from an existing filesystem\n"
+ " device online Readd an existing member to a filesystem\n"
+ " device offline Take a device offline, without removing it\n"
+ " device evacuate Migrate data off of a specific device\n"
+ " device set-state Mark a device as failed\n"
"\n"
- "Repair:\n"
- " bcache fsck Check an existing filesystem for errors\n"
+ "Migrate:\n"
+ " migrate Migrate an existing filesystem to bcachefs, in place\n"
+ " migrate-superblock\n"
+ " Add default superblock, after bcache migrate\n"
"\n"
"Debug:\n"
- " bcache dump Dump filesystem metadata to a qcow2 image\n"
- " bcache list List filesystem metadata in textual form\n"
- "\n"
- "Migrate:\n"
- " bcache migrate Migrate an existing filesystem to bcachefs, in place\n"
- " bcache migrate_superblock\n"
- " Add default superblock, after bcache migrate\n");
+ "These commands work on offline, unmounted filesystems\n"
+ " dump Dump filesystem metadata to a qcow2 image\n"
+ " list List filesystem metadata in textual form\n");
}
-int main(int argc, char *argv[])
-{
- char *cmd;
-
- setvbuf(stdout, NULL, _IOLBF, 0);
+static char *full_cmd;
- if (argc < 2) {
+static char *pop_cmd(int *argc, char *argv[])
+{
+ if (*argc < 2) {
printf("%s: missing command\n", argv[0]);
usage();
exit(EXIT_FAILURE);
}
- cmd = argv[1];
+ char *cmd = argv[1];
+ memmove(&argv[1], &argv[2], *argc * sizeof(argv[0]));
+ (*argc)--;
+
+ full_cmd = mprintf("%s %s", full_cmd, cmd);
+ return cmd;
+}
+
+static int fs_cmds(int argc, char *argv[])
+{
+ char *cmd = pop_cmd(&argc, argv);
+
+ if (!strcmp(cmd, "show"))
+ return cmd_fs_show(argc, argv);
+ if (!strcmp(cmd, "set"))
+ return cmd_fs_set(argc, argv);
- memmove(&argv[1], &argv[2], argc * sizeof(argv[0]));
- argc--;
+ usage();
+ return 0;
+}
+
+static int device_cmds(int argc, char *argv[])
+{
+ char *cmd = pop_cmd(&argc, argv);
+
+ if (!strcmp(cmd, "add"))
+ return cmd_device_add(argc, argv);
+ if (!strcmp(cmd, "remove"))
+ return cmd_device_remove(argc, argv);
+ if (!strcmp(cmd, "online"))
+ return cmd_device_online(argc, argv);
+ if (!strcmp(cmd, "offline"))
+ return cmd_device_offline(argc, argv);
+ if (!strcmp(cmd, "evacuate"))
+ return cmd_device_offline(argc, argv);
+ if (!strcmp(cmd, "set-state"))
+ return cmd_device_set_state(argc, argv);
+
+ usage();
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ full_cmd = argv[0];
+
+ setvbuf(stdout, NULL, _IOLBF, 0);
+
+ char *cmd = pop_cmd(&argc, argv);
if (!strcmp(cmd, "format"))
return cmd_format(argc, argv);
+ if (!strcmp(cmd, "show-super"))
+ return cmd_show_super(argc, argv);
+
+ if (!strcmp(cmd, "fsck"))
+ return cmd_fsck(argc, argv);
+
+ if (!strcmp(cmd, "unlock"))
+ return cmd_unlock(argc, argv);
if (!strcmp(cmd, "assemble"))
return cmd_assemble(argc, argv);
if (!strcmp(cmd, "incremental"))
@@ -87,36 +144,22 @@ int main(int argc, char *argv[])
if (!strcmp(cmd, "stop"))
return cmd_stop(argc, argv);
- if (!strcmp(cmd, "fs_show"))
- return cmd_fs_show(argc, argv);
- if (!strcmp(cmd, "fs_set"))
- return cmd_fs_set(argc, argv);
+ if (!strcmp(cmd, "fs"))
+ return fs_cmds(argc, argv);
- if (!strcmp(cmd, "device_show"))
- return cmd_device_show(argc, argv);
- if (!strcmp(cmd, "device_add"))
- return cmd_device_add(argc, argv);
- if (!strcmp(cmd, "device_fail"))
- return cmd_device_fail(argc, argv);
- if (!strcmp(cmd, "device_remove"))
- return cmd_device_remove(argc, argv);
+ if (!strcmp(cmd, "device"))
+ return device_cmds(argc, argv);
- if (!strcmp(cmd, "fsck"))
- return cmd_fsck(argc, argv);
-
- if (!strcmp(cmd, "unlock"))
- return cmd_unlock(argc, argv);
+ if (!strcmp(cmd, "migrate"))
+ return cmd_migrate(argc, argv);
+ if (!strcmp(cmd, "migrate-superblock"))
+ return cmd_migrate_superblock(argc, argv);
if (!strcmp(cmd, "dump"))
return cmd_dump(argc, argv);
if (!strcmp(cmd, "list"))
return cmd_list(argc, argv);
- if (!strcmp(cmd, "migrate"))
- return cmd_migrate(argc, argv);
- if (!strcmp(cmd, "migrate_superblock"))
- return cmd_migrate_superblock(argc, argv);
-
usage();
return 0;
}