.SH SYNOPSIS
.B xfs_repair
[
-.B \-dfLnPv
+.B \-dfLPv
+] [
+.BR \-n " | " -e
] [
.B \-m
.I maxmem
No modify mode. Specifies that
.B xfs_repair
should not modify the filesystem but should only scan the
-filesystem and indicate what repairs would have been made.
+filesystem and indicate what repairs would have been made. This option cannot
+be used together with
+.BR \-e .
.TP
.B \-P
Disable prefetching of inode and directory blocks. Use this option if
to repair an XFS filesystem mounted read only. This is typically done
on a root filesystem from single user mode, immediately followed by a reboot.
.TP
+.B \-e
+If any metadata corruption was repaired, the status returned is 4 instead of the
+usual 0. This option cannot be used together with
+.BR \-n .
+.TP
.B \-V
Prints the version number and exits.
.SS Checks Performed
0 if no filesystem corruption was detected.
.B xfs_repair
run without the \-n option will always return a status code of 0 if
-it completes without problems. If a runtime error is encountered
-during operation, it will return a status of 1. In this case,
+it completes without problems, unless the flag
+.B -e
+is used. If it is used, then status 4 is reported when any issue with the
+filesystem was found, but could be fixed. If a runtime error is encountered during
+operation, it will return a status of 1. In this case,
.B xfs_repair
should be restarted. If
.B xfs_repair is unable
to proceed due to a dirty log, it will return a status of 2. See below.
.SH DIRTY LOGS
-Due to the design of the XFS log, a dirty log can only be replayed
+Due to the design of the XFS log, a dirty log can only be replayed
by the kernel, on a machine having the same CPU architecture as the
machine which was writing to the log.
.B xfs_repair
static int bhash_option_used;
static long max_mem_specified; /* in megabytes */
static int phase2_threads = 32;
+static bool report_corrected;
static void
usage(void)
" -l logdev Specifies the device where the external log resides.\n"
" -m maxmem Maximum amount of memory to be used in megabytes.\n"
" -n No modify mode, just checks the filesystem for damage.\n"
+" (Cannot be used together with -e.)\n"
" -P Disables prefetching.\n"
" -r rtdev Specifies the device where the realtime section resides.\n"
" -v Verbose output.\n"
" -o subopts Override default behaviour, refer to man page.\n"
" -t interval Reporting interval in seconds.\n"
" -d Repair dangerously.\n"
+" -e Exit with a non-zero code if any errors were repaired.\n"
+" (Cannot be used together with -n.)\n"
" -V Reports version and exits.\n"), progname);
exit(1);
}
ag_stride = 0;
thread_count = 1;
report_interval = PROG_RPT_DEFAULT;
+ report_corrected = false;
/*
* XXX have to add suboption processing here
* attributes, quotas, nlinks, aligned_inos, sb_fbits
*/
- while ((c = getopt(argc, argv, "c:o:fl:m:r:LnDvVdPt:")) != EOF) {
+ while ((c = getopt(argc, argv, "c:o:fl:m:r:LnDvVdPet:")) != EOF) {
switch (c) {
case 'D':
dumpcore = 1;
case 't':
report_interval = (int)strtol(optarg, NULL, 0);
break;
+ case 'e':
+ report_corrected = true;
+ break;
case '?':
usage();
}
if ((fs_name = argv[optind]) == NULL)
usage();
+
+ if (report_corrected && no_modify)
+ usage();
}
void __attribute__((noreturn))
free(msgbuf);
+ if (fs_is_dirty && report_corrected)
+ return (4);
return (0);
}