diff options
author | Wang Shilong <wangsl.fnst@cn.fujitsu.com> | 2013-12-02 14:42:25 +0800 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-01-31 08:22:11 -0800 |
commit | f8675eb30ff5757402bd9dbde51bebc61fdff67e (patch) | |
tree | aadce9d45283842bca4466946f23b3875e75f446 /cmds-scrub.c | |
parent | b94a3003aebe235171383ced624da10b2a2fa94b (diff) | |
download | btrfs-progs-f8675eb30ff5757402bd9dbde51bebc61fdff67e.tar.gz |
Btrfs-progs: add option to skip whether a scrub has started/resumed in userspace
I hit a problem that i can not start scrub when i am trying to track
superblock generation mismatch problems.
The fact is that we are trying to check whether we have started a scrub operation
in userspace, this will make us can't start scrub if that record file is damaged
itself. By adding a option to skip that check, everything will be fine.
Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'cmds-scrub.c')
-rw-r--r-- | cmds-scrub.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/cmds-scrub.c b/cmds-scrub.c index b933770..25d4ef5 100644 --- a/cmds-scrub.c +++ b/cmds-scrub.c @@ -1096,9 +1096,10 @@ static int scrub_start(int argc, char **argv, int resume) void *terr; u64 devid; DIR *dirstream = NULL; + int force = 0; optind = 1; - while ((c = getopt(argc, argv, "BdqrRc:n:")) != -1) { + while ((c = getopt(argc, argv, "BdqrRc:n:f")) != -1) { switch (c) { case 'B': do_background = 0; @@ -1123,6 +1124,9 @@ static int scrub_start(int argc, char **argv, int resume) case 'n': ioprio_classdata = (int)strtol(optarg, NULL, 10); break; + case 'f': + force = 1; + break; case '?': default: usage(resume ? cmd_scrub_resume_usage : @@ -1195,7 +1199,7 @@ static int scrub_start(int argc, char **argv, int resume) * is a normal mode of operation to start scrub on multiple * single devices, there is no reason to prevent this. */ - if (is_scrub_running_on_fs(&fi_args, di_args, past_scrubs)) { + if (!force && is_scrub_running_on_fs(&fi_args, di_args, past_scrubs)) { ERR(!do_quiet, "ERROR: scrub is already running.\n" "To cancel use 'btrfs scrub cancel %s'.\n" @@ -1507,7 +1511,7 @@ out: } static const char * const cmd_scrub_start_usage[] = { - "btrfs scrub start [-BdqrR] [-c ioprio_class -n ioprio_classdata] <path>|<device>", + "btrfs scrub start [-BdqrRf] [-c ioprio_class -n ioprio_classdata] <path>|<device>", "Start a new scrub", "", "-B do not background", @@ -1517,6 +1521,8 @@ static const char * const cmd_scrub_start_usage[] = { "-R raw print mode, print full data instead of summary" "-c set ioprio class (see ionice(1) manpage)", "-n set ioprio classdata (see ionice(1) manpage)", + "-f force to skip checking whether scrub has started/resumed in userspace ", + " this is useful when scrub stats record file is damaged", NULL }; |