@@ -51,7 +51,7 @@ Does not start a new scrub if the last scrub finished successfully.
+
see *scrub start*.
-*start* [-BdqrRf] [-c <ioprio_class> -n <ioprio_classdata>] <path>|<device>::
+*start* [-BdqrRf] [-c <ioprio_class> -n <ioprio_classdata> -s <start_pos> -e <end_pos>] <path>|<device>::
Start a scrub on all devices of the filesystem identified by 'path' or on
a single 'device'. If a scrub is already running, the new one fails.
+
@@ -77,6 +77,10 @@ raw print mode, print full data instead of summary
set IO priority class (see `ionice`(1) manpage)
-n <ioprio_classdata>::::
set IO priority classdata (see `ionice`(1) manpage)
+-s <start_pos>::::
+set start position by logical address (btrfs extent bytenr, default 0)
+-e <end_pos>::::
+set end position by logical address (btrfs extent bytenr, default end of filesystem)
-f::::
force starting new scrub even if a scrub is already running,
this can useful when scrub status file is damaged and reports a running
@@ -1172,8 +1172,10 @@ static int scrub_start(const struct cmd_struct *cmd, int argc, char **argv,
DIR *dirstream = NULL;
int force = 0;
int nothing_to_resume = 0;
+ u64 start_pos = 0;
+ u64 end_pos = -1ULL;
- while ((c = getopt(argc, argv, "BdqrRc:n:f")) != -1) {
+ while ((c = getopt(argc, argv, "BdqrRc:n:fs:e:")) != -1) {
switch (c) {
case 'B':
do_background = 0;
@@ -1198,6 +1200,12 @@ static int scrub_start(const struct cmd_struct *cmd, int argc, char **argv,
case 'n':
ioprio_classdata = (int)strtol(optarg, NULL, 10);
break;
+ case 's':
+ start_pos = strtoull(optarg, NULL, 0);
+ break;
+ case 'e':
+ end_pos = strtoull(optarg, NULL, 0);
+ break;
case 'f':
force = 1;
break;
@@ -1319,11 +1327,11 @@ static int scrub_start(const struct cmd_struct *cmd, int argc, char **argv,
continue;
} else {
++n_start;
- sp[i].scrub_args.start = 0ll;
+ sp[i].scrub_args.start = start_pos;
sp[i].resumed = NULL;
}
sp[i].skip = 0;
- sp[i].scrub_args.end = (u64)-1ll;
+ sp[i].scrub_args.end = end_pos;
sp[i].scrub_args.flags = readonly ? BTRFS_SCRUB_READONLY : 0;
sp[i].ioprio_class = ioprio_class;
sp[i].ioprio_classdata = ioprio_classdata;
@@ -1599,7 +1607,7 @@ out:
}
static const char * const cmd_scrub_start_usage[] = {
- "btrfs scrub start [-BdqrRf] [-c ioprio_class -n ioprio_classdata] <path>|<device>",
+ "btrfs scrub start [-BdqrRf] [-c ioprio_class -n ioprio_classdata -s start_pos -e end_pos] <path>|<device>",
"Start a new scrub. If a scrub is already running, the new one fails.",
"",
"-B do not background",
@@ -1609,6 +1617,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)",
+ "-s start scrub at position (default 0)",
+ "-e end scrub at position (default end of device)",
"-f force starting new scrub even if a scrub is already running",
" this is useful when scrub stats record file is damaged",
NULL
Allow user to specify start (-s) and end (-e) position directly during btrfs scrub start, by giving device offsets on the command line. This allows scrubs to be targeted toward specific areas of disk. These options may be used with either device names or mounted filesystem paths, though it is probably more useful with the former. The intended use case is to verify that data areas identified in previous scrubs as being unreadable or containing uncorrectable errors have since been remapped or removed, without having to rescan entire disks. Note that some of the printed statistics (ETA, totals) will be significantly inaccurate if these options are used. Signed-off-by: Zygo Blaxell <ce3g8jdj@umail.furryterror.org> --- Documentation/btrfs-scrub.asciidoc | 6 +++++- cmds/scrub.c | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-)