@@ -22,6 +22,10 @@
#include "descr.h"
#include "scrub_private.h"
+static int scrub_epilogue(struct scrub_ctx *ctx, struct descr *dsc,
+ struct scrub_item *sri, struct xfs_scrub_metadata *meta,
+ int error);
+
/* Online scrub and repair wrappers. */
/* Format a scrub description. */
@@ -117,12 +121,32 @@ xfs_check_metadata(
dbg_printf("check %s flags %xh\n", descr_render(&dsc), meta.sm_flags);
error = -xfrog_scrub_metadata(xfdp, &meta);
+ return scrub_epilogue(ctx, &dsc, sri, &meta, error);
+}
+
+/*
+ * Update all internal state after a scrub ioctl call.
+ * Returns 0 for success, or ECANCELED to abort the program.
+ */
+static int
+scrub_epilogue(
+ struct scrub_ctx *ctx,
+ struct descr *dsc,
+ struct scrub_item *sri,
+ struct xfs_scrub_metadata *meta,
+ int error)
+{
+ unsigned int scrub_type = meta->sm_type;
+ enum xfrog_scrub_group group;
+
+ group = xfrog_scrubbers[scrub_type].group;
+
switch (error) {
case 0:
/* No operational errors encountered. */
if (!sri->sri_revalidate &&
debug_tweak_on("XFS_SCRUB_FORCE_REPAIR"))
- meta.sm_flags |= XFS_SCRUB_OFLAG_CORRUPT;
+ meta->sm_flags |= XFS_SCRUB_OFLAG_CORRUPT;
break;
case ENOENT:
/* Metadata not present, just skip it. */
@@ -130,13 +154,13 @@ xfs_check_metadata(
return 0;
case ESHUTDOWN:
/* FS already crashed, give up. */
- str_error(ctx, descr_render(&dsc),
+ str_error(ctx, descr_render(dsc),
_("Filesystem is shut down, aborting."));
return ECANCELED;
case EIO:
case ENOMEM:
/* Abort on I/O errors or insufficient memory. */
- str_liberror(ctx, error, descr_render(&dsc));
+ str_liberror(ctx, error, descr_render(dsc));
return ECANCELED;
case EDEADLOCK:
case EBUSY:
@@ -152,7 +176,7 @@ _("Filesystem is shut down, aborting."));
return 0;
default:
/* Operational error. Log it and move on. */
- str_liberror(ctx, error, descr_render(&dsc));
+ str_liberror(ctx, error, descr_render(dsc));
scrub_item_clean_state(sri, scrub_type);
return 0;
}
@@ -163,27 +187,27 @@ _("Filesystem is shut down, aborting."));
* we'll try the scan again, just in case the fs was busy.
* Only retry so many times.
*/
- if (want_retry(&meta) && scrub_item_schedule_retry(sri, scrub_type))
+ if (want_retry(meta) && scrub_item_schedule_retry(sri, scrub_type))
return 0;
/* Complain about incomplete or suspicious metadata. */
- scrub_warn_incomplete_scrub(ctx, &dsc, &meta);
+ scrub_warn_incomplete_scrub(ctx, dsc, meta);
/*
* If we need repairs or there were discrepancies, schedule a
* repair if desired, otherwise complain.
*/
- if (is_corrupt(&meta) || xref_disagrees(&meta)) {
+ if (is_corrupt(meta) || xref_disagrees(meta)) {
if (ctx->mode != SCRUB_MODE_REPAIR) {
/* Dry-run mode, so log an error and forget it. */
- str_corrupt(ctx, descr_render(&dsc),
+ str_corrupt(ctx, descr_render(dsc),
_("Repairs are required."));
scrub_item_clean_state(sri, scrub_type);
return 0;
}
/* Schedule repairs. */
- scrub_item_save_state(sri, scrub_type, meta.sm_flags);
+ scrub_item_save_state(sri, scrub_type, meta->sm_flags);
return 0;
}
@@ -191,12 +215,12 @@ _("Repairs are required."));
* If we could optimize, schedule a repair if desired,
* otherwise complain.
*/
- if (is_unoptimized(&meta)) {
+ if (is_unoptimized(meta)) {
if (ctx->mode == SCRUB_MODE_DRY_RUN) {
/* Dry-run mode, so log an error and forget it. */
if (group != XFROG_SCRUB_GROUP_INODE) {
/* AG or FS metadata, always warn. */
- str_info(ctx, descr_render(&dsc),
+ str_info(ctx, descr_render(dsc),
_("Optimization is possible."));
} else if (!ctx->preen_triggers[scrub_type]) {
/* File metadata, only warn once per type. */
@@ -210,7 +234,7 @@ _("Optimization is possible."));
}
/* Schedule optimizations. */
- scrub_item_save_state(sri, scrub_type, meta.sm_flags);
+ scrub_item_save_state(sri, scrub_type, meta->sm_flags);
return 0;
}
@@ -221,8 +245,8 @@ _("Optimization is possible."));
* re-examine the object as repairs progress to see if the kernel will
* deem it completely consistent at some point.
*/
- if (xref_failed(&meta) && ctx->mode == SCRUB_MODE_REPAIR) {
- scrub_item_save_state(sri, scrub_type, meta.sm_flags);
+ if (xref_failed(meta) && ctx->mode == SCRUB_MODE_REPAIR) {
+ scrub_item_save_state(sri, scrub_type, meta->sm_flags);
return 0;
}