xfs_scrub: remove preen mode

While it's true that the kernel can tell us whether something needs
repairs or it needs optimizing, from the admin's perspective there's
no point in having an optimize-only mode -- either fix everything, or
don't.  This is what xfs_repair does w.r.t. -n, so let's do the same
thing too.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>

diff --git a/man/man8/xfs_scrub.8 b/man/man8/xfs_scrub.8
index 4c394a5..77fed92 100644
--- a/man/man8/xfs_scrub.8
+++ b/man/man8/xfs_scrub.8
@@ -1,10 +1,10 @@
 .TH xfs_scrub 8
 .SH NAME
-xfs_scrub \- scrub the contents of an XFS filesystem
+xfs_scrub \- check the contents of a mounted XFS filesystem
 .SH SYNOPSIS
 .B xfs_scrub
 [
-.B \-abCemnTvxy
+.B \-abCemnTvx
 ]
 .RI "[" mount-point " | " block-device "]"
 .br
@@ -13,6 +13,12 @@
 .B xfs_scrub
 attempts to check and repair all metadata in a mounted XFS filesystem.
 .PP
+.B WARNING!
+This program is
+.BR EXPERIMENTAL ","
+which means that its behavior and interface
+could change at any time!
+.PP
 .B xfs_scrub
 asks the kernel to scrub all metadata objects in the filesystem.
 Metadata records are scanned for obviously bad values and then
@@ -28,19 +34,17 @@
 Enabling verbose mode will increase the amount of status information
 sent to the output.
 .PP
-This utility does not know how to correct all errors.
-If the tool cannot fix the detected errors, you must unmount the
-filesystem and run
+If the kernel scrub reports that metadata needs repairs or optimizations and
+the user does not pass
+.B -n
+on the command line, this program will ask the kernel to make the repairs and
+to perform the optimizations.
+See the sections about optimizations and repairs for a list of optimizations
+and repairs known to this program.
+The kernel may not support repairing or optimizing the filesystem.
+If this is the case, the filesystem must be unmounted and
 .BR xfs_repair (8)
-to fix the problems.
-If this tool is not run with either of the
-.B \-n
-or
-.B \-y
-options, then it will optimize the filesystem when possible,
-but it will not try to fix errors.
-See the optimizations section below for a list of optimizations
-supported by this program.
+run on the filesystem to fix the problems.
 .SH OPTIONS
 .TP
 .BI \-a " errors"
@@ -73,14 +77,14 @@
 behavior.
 .TP
 .B \-k
-Do not call FITRIM on the free space.
+Do not call TRIM on the free space.
 .TP
 .BI \-m " file"
 Search this file for mounted filesystems instead of /etc/mtab.
 .TP
 .B \-n
-Dry run, do not modify anything in the filesystem.
-This disables all optimization and repair behaviors.
+Only check filesystem metadata.
+Do not repair or optimize anything.
 .TP
 .BI \-T
 Print timing and memory usage information for each phase.
@@ -98,20 +102,11 @@
 If the block device is a SCSI disk, it will instead issue READ VERIFY commands
 directly to the disk.
 These actions will confirm that all file data blocks can be read from storage.
-.TP
-.B \-y
-Try to repair all filesystem errors.
-If the errors cannot be fixed online, then the filesystem must be taken
-offline for repair.
 .SH OPTIMIZATIONS
-Optimizations supported by this program include:
+Optimizations supported by this program include, but are not limited to:
 .IP \[bu] 2
-Updating secondary superblocks to match the primary superblock.
-.IP \[bu]
-Turning off shared block write checks for files that no longer share blocks.
-.IP \[bu]
 Instructing the underlying storage to discard unused extents via the
-.B FITRIM
+.B TRIM
 ioctl.
 .SH REPAIRS
 This program currently does not support making any repairs.
diff --git a/scrub/phase1.c b/scrub/phase1.c
index 75da296..af93d0f 100644
--- a/scrub/phase1.c
+++ b/scrub/phase1.c
@@ -181,11 +181,7 @@
 
 	/* Do we need kernel-assisted metadata repair? */
 	if (ctx->mode != SCRUB_MODE_DRY_RUN && !xfs_can_repair(ctx)) {
-		if (ctx->mode == SCRUB_MODE_PREEN)
-			str_error(ctx, ctx->mntpoint,
-_("Kernel metadata optimization facility is not available.  Use -n to scrub."));
-		else
-			str_error(ctx, ctx->mntpoint,
+		str_error(ctx, ctx->mntpoint,
 _("Kernel metadata repair facility is not available.  Use -n to scrub."));
 		return false;
 	}
diff --git a/scrub/phase4.c b/scrub/phase4.c
index 3100d75..1fb8da9 100644
--- a/scrub/phase4.c
+++ b/scrub/phase4.c
@@ -62,25 +62,6 @@
 	return xfs_process_action_items(ctx);
 }
 
-/* Run the optimize-only phase if there are no errors. */
-bool
-xfs_optimize_fs(
-	struct scrub_ctx	*ctx)
-{
-	/*
-	 * In preen mode, corruptions are immediately recorded as errors,
-	 * so if there are any corruptions on the filesystem errors_found
-	 * will be non-zero and we won't do anything.
-	 */
-	if (ctx->errors_found) {
-		str_info(ctx, ctx->mntpoint,
-_("Errors found, please re-run with -y."));
-		return true;
-	}
-
-	return xfs_process_action_items(ctx);
-}
-
 /* Estimate how much work we're going to do. */
 bool
 xfs_estimate_repair_work(
diff --git a/scrub/scrub.c b/scrub/scrub.c
index 6abca2a..bc0e2f0 100644
--- a/scrub/scrub.c
+++ b/scrub/scrub.c
@@ -279,7 +279,7 @@
 	 * otherwise complain.
 	 */
 	if (is_unoptimized(meta)) {
-		if (ctx->mode < SCRUB_MODE_PREEN) {
+		if (ctx->mode != SCRUB_MODE_REPAIR) {
 			if (!is_inode) {
 				/* AG or FS metadata, always warn. */
 				str_info(ctx, buf,
diff --git a/scrub/xfs_scrub.c b/scrub/xfs_scrub.c
index 5ab557d..6efcf77 100644
--- a/scrub/xfs_scrub.c
+++ b/scrub/xfs_scrub.c
@@ -187,7 +187,6 @@
 	fprintf(stderr, _("  -v           Verbose output.\n"));
 	fprintf(stderr, _("  -V           Print version.\n"));
 	fprintf(stderr, _("  -x           Scrub file data too.\n"));
-	fprintf(stderr, _("  -y           Repair all errors.\n"));
 
 	exit(SCRUB_RET_SYNTAX);
 }
@@ -441,16 +440,11 @@
 		/* Turn on certain phases if user said to. */
 		if (sp->fn == DATASCAN_DUMMY_FN && scrub_data) {
 			sp->fn = xfs_scan_blocks;
-		} else if (sp->fn == REPAIR_DUMMY_FN) {
-			if (ctx->mode == SCRUB_MODE_PREEN) {
-				sp->descr = _("Optimize filesystem.");
-				sp->fn = xfs_optimize_fs;
-				sp->must_run = true;
-			} else if (ctx->mode == SCRUB_MODE_REPAIR) {
-				sp->descr = _("Repair filesystem.");
-				sp->fn = xfs_repair_fs;
-				sp->must_run = true;
-			}
+		} else if (sp->fn == REPAIR_DUMMY_FN &&
+			   ctx->mode == SCRUB_MODE_REPAIR) {
+			sp->descr = _("Repair filesystem.");
+			sp->fn = xfs_repair_fs;
+			sp->must_run = true;
 		}
 
 		/* Skip certain phases unless they're turned on. */
@@ -524,9 +518,9 @@
 	textdomain(PACKAGE);
 
 	pthread_mutex_init(&ctx.lock, NULL);
-	ctx.mode = SCRUB_MODE_DEFAULT;
+	ctx.mode = SCRUB_MODE_REPAIR;
 	ctx.error_action = ERRORS_CONTINUE;
-	while ((c = getopt(argc, argv, "a:bC:de:km:nTvxVy")) != EOF) {
+	while ((c = getopt(argc, argv, "a:bC:de:km:nTvxV")) != EOF) {
 		switch (c) {
 		case 'a':
 			ctx.max_errors = cvt_u64(optarg, 10);
@@ -574,11 +568,6 @@
 			mtab = optarg;
 			break;
 		case 'n':
-			if (ctx.mode != SCRUB_MODE_DEFAULT) {
-				fprintf(stderr,
-_("Only one of the options -n or -y may be specified.\n"));
-				usage();
-			}
 			ctx.mode = SCRUB_MODE_DRY_RUN;
 			break;
 		case 'T':
@@ -595,14 +584,6 @@
 		case 'x':
 			scrub_data = true;
 			break;
-		case 'y':
-			if (ctx.mode != SCRUB_MODE_DEFAULT) {
-				fprintf(stderr,
-_("Only one of the options -n or -y may be specified.\n"));
-				usage();
-			}
-			ctx.mode = SCRUB_MODE_REPAIR;
-			break;
 		case '?':
 			/* fall through */
 		default:
diff --git a/scrub/xfs_scrub.h b/scrub/xfs_scrub.h
index 8407885..89b46a4 100644
--- a/scrub/xfs_scrub.h
+++ b/scrub/xfs_scrub.h
@@ -34,10 +34,8 @@
 
 enum scrub_mode {
 	SCRUB_MODE_DRY_RUN,
-	SCRUB_MODE_PREEN,
 	SCRUB_MODE_REPAIR,
 };
-#define SCRUB_MODE_DEFAULT			SCRUB_MODE_PREEN
 
 enum error_action {
 	ERRORS_CONTINUE,
@@ -111,7 +109,6 @@
 bool xfs_scan_blocks(struct scrub_ctx *ctx);
 bool xfs_scan_summary(struct scrub_ctx *ctx);
 bool xfs_repair_fs(struct scrub_ctx *ctx);
-bool xfs_optimize_fs(struct scrub_ctx *ctx);
 
 /* Progress estimator functions */
 uint64_t xfs_estimate_inodes(struct scrub_ctx *ctx);