supported are:
.RS 1.0i
.TP
+.B fsprops_advise
+Decide the operating mode from the value of the
+.I self_healing
+filesystem property.
+See the
+.B filesytem properties
+section for more details.
+.TP
.BI fstrim_pct= percentage
To constrain the amount of time spent on fstrim activities during phase 8,
this program tries to balance estimated runtime against completeness of the
.PP
If corrupt metadata is successfully repaired, this program will log that
a repair has succeeded instead of a corruption report.
+.SH FILESYSTEM PROPERTIES
+System administrators can convey their preferences for scrubbing of a
+particular filesystem by setting the filesystem property
+.B self_healing
+via the
+.B setfsprops
+subcommand of the
+.B xfs_spaceman
+on the filesystem.
+These preferences will be honored if the
+.B -o fsprops_advise
+option is specified.
+
+Recognized values for the
+.B self_healing
+property are:
+.RS
+.TP
+.I none
+Do not scan the filesystem at all.
+.TP
+.I check
+Scan and report corruption and opportunities for optimization, but do not
+change anything.
+.TP
+.I optimize
+Scan the filesystem and optimize where possible.
+Report corruptions, but do not fix them.
+.TP
+.I repair
+Scan the filesystem, fix corruptions, and optimize where possible.
+.RE
+
+If the property is not set, the default is
+.IR check .
+
.SH EXIT CODE
The exit code returned by
.B xfs_scrub
#include "repair.h"
#include "libfrog/fsgeom.h"
#include "xfs_errortag.h"
+#include "libfrog/fsprops.h"
+#include "libfrog/fsproperties.h"
/* Phase 1: Find filesystem geometry (and clean up after) */
return error;
}
+#define MAX_SELFHEAL_LEN 128
+/*
+ * Decide the operating mode from filesystem properties. No fs property or
+ * system errors means we only check.
+ */
+static void
+mode_from_fsprops(
+ struct scrub_ctx *ctx)
+{
+ struct fsprops_handle fph = { };
+ char valuebuf[MAX_SELFHEAL_LEN + 1] = { 0 };
+ size_t valuelen = MAX_SELFHEAL_LEN;
+ enum fsprop_self_healing shval;
+ int ret;
+
+ ret = fsprops_open_handle(&ctx->mnt, &ctx->fsinfo, &fph);
+ if (ret) {
+ ctx->mode = SCRUB_MODE_DRY_RUN;
+ goto summarize;
+ }
+
+ ret = fsprops_get(&fph, FSPROP_SELF_HEALING_NAME, valuebuf, &valuelen);
+ if (ret) {
+ ctx->mode = SCRUB_MODE_DRY_RUN;
+ goto summarize;
+ }
+
+ shval = fsprop_read_self_healing(valuebuf);
+ switch (shval) {
+ case FSPROP_SELFHEAL_NONE:
+ ctx->mode = SCRUB_MODE_NONE;
+ break;
+ case FSPROP_SELFHEAL_OPTIMIZE:
+ ctx->mode = SCRUB_MODE_PREEN;
+ break;
+ case FSPROP_SELFHEAL_REPAIR:
+ ctx->mode = SCRUB_MODE_REPAIR;
+ break;
+ case FSPROP_SELFHEAL_UNSET:
+ str_info(ctx, ctx->mntpoint,
+ _("Unknown self_healing directive \"%s\"."),
+ valuebuf);
+ fallthrough;
+ case FSPROP_SELFHEAL_CHECK:
+ ctx->mode = SCRUB_MODE_DRY_RUN;
+ break;
+ }
+
+ fsprops_free_handle(&fph);
+
+summarize:
+ switch (ctx->mode) {
+ case SCRUB_MODE_NONE:
+ str_info(ctx, ctx->mntpoint,
+ _("Disabling scrub per self_healing directive."));
+ break;
+ case SCRUB_MODE_DRY_RUN:
+ str_info(ctx, ctx->mntpoint,
+ _("Checking per self_healing directive."));
+ break;
+ case SCRUB_MODE_PREEN:
+ str_info(ctx, ctx->mntpoint,
+ _("Optimizing per self_healing directive."));
+ break;
+ case SCRUB_MODE_REPAIR:
+ str_info(ctx, ctx->mntpoint,
+ _("Checking and repairing per self_healing directive."));
+ break;
+ }
+}
+
/*
* Bind to the mountpoint, read the XFS geometry, bind to the block devices.
* Anything we've already built will be cleaned up by scrub_cleanup.
return error;
}
+ /*
+ * If we've been instructed to decide the operating mode from the
+ * fs properties set on the mount point, do that now before we start
+ * downgrading based on actual fs/kernel capabilities.
+ */
+ if (ctx->mode == SCRUB_MODE_NONE)
+ mode_from_fsprops(ctx);
+
/* Do we have kernel-assisted metadata scrubbing? */
if (!can_scrub_fs_metadata(ctx) || !can_scrub_inode(ctx) ||
!can_scrub_bmap(ctx) || !can_scrub_dir(ctx) ||