diff options
Diffstat (limited to 'bcache.c')
-rw-r--r-- | bcache.c | 151 |
1 files changed, 97 insertions, 54 deletions
@@ -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; } |