summaryrefslogtreecommitdiff
path: root/cmds-rescue.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.cz>2013-09-17 17:21:22 +0200
committerChris Mason <chris.mason@fusionio.com>2013-10-16 08:22:23 -0400
commite9270f62090c2312bccb340e4394bc216733edac (patch)
tree912a6a1f86121b8bb98fe45ea3139b34cc0c6be2 /cmds-rescue.c
parent6ed613854d104a8f3a70d6eee06bfccf991e23a3 (diff)
btrfs-progs: separate command and implementation of chunk-recover code
The command has been moved and we should rename the files accordingly, so the entry point is now in cmds-rescue.c and the core functionality in it's own file. Return codes of btrfs_recover_chunk_tree have been simplified not to require a define and another file for defintion. CC: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'cmds-rescue.c')
-rw-r--r--cmds-rescue.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/cmds-rescue.c b/cmds-rescue.c
index 35b3bb11..cfbc198a 100644
--- a/cmds-rescue.c
+++ b/cmds-rescue.c
@@ -18,13 +18,75 @@
#include "kerncompat.h"
+#include <getopt.h>
#include "commands.h"
+#include "utils.h"
static const char * const rescue_cmd_group_usage[] = {
"btrfs rescue <command> [options] <path>",
NULL
};
+int btrfs_recover_chunk_tree(char *path, int verbose, int yes);
+
+const char * const cmd_chunk_recover_usage[] = {
+ "btrfs rescue chunk-recover [options] <device>",
+ "Recover the chunk tree by scanning the devices one by one.",
+ "",
+ "-y Assume an answer of `yes' to all questions",
+ "-v Verbose mode",
+ "-h Help",
+ NULL
+};
+
+int cmd_chunk_recover(int argc, char *argv[])
+{
+ int ret = 0;
+ char *file;
+ int yes = 0;
+ int verbose = 0;
+
+ while (1) {
+ int c = getopt(argc, argv, "yvh");
+ if (c < 0)
+ break;
+ switch (c) {
+ case 'y':
+ yes = 1;
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ case 'h':
+ default:
+ usage(cmd_chunk_recover_usage);
+ }
+ }
+
+ argc = argc - optind;
+ if (argc == 0)
+ usage(cmd_chunk_recover_usage);
+
+ file = argv[optind];
+
+ ret = check_mounted(file);
+ if (ret) {
+ fprintf(stderr, "the device is busy\n");
+ return ret;
+ }
+
+ ret = btrfs_recover_chunk_tree(file, verbose, yes);
+ if (!ret) {
+ fprintf(stdout, "Recover the chunk tree successfully.\n");
+ } else if (ret > 0) {
+ ret = 0;
+ fprintf(stdout, "Abort to rebuild the on-disk chunk tree.\n");
+ } else {
+ fprintf(stdout, "Fail to recover the chunk tree.\n");
+ }
+ return ret;
+}
+
const struct cmd_group rescue_cmd_group = {
rescue_cmd_group_usage, NULL, {
{ "chunk-recover", cmd_chunk_recover, cmd_chunk_recover_usage, NULL, 0},