if (aborted)
return ECANCELED;
- pthread_mutex_lock(&ctx->lock);
- if (ctx->corruptions_found == 0 && ctx->unfixable_errors == 0 &&
- want_fstrim) {
- fstrim(ctx);
- progress_add(1);
+ return 0;
+}
+
+/* Decide if we have any repair work to do. */
+static inline bool
+have_action_items(
+ struct scrub_ctx *ctx)
+{
+ xfs_agnumber_t agno;
+
+ for (agno = 0; agno < ctx->mnt.fsgeom.agcount; agno++) {
+ if (action_list_length(&ctx->action_lists[agno]) > 0)
+ return true;
}
- pthread_mutex_unlock(&ctx->lock);
- return 0;
+ return false;
+}
+
+/* Trim the unused areas of the filesystem if the caller asked us to. */
+static void
+trim_filesystem(
+ struct scrub_ctx *ctx)
+{
+ if (want_fstrim)
+ fstrim(ctx);
+ progress_add(1);
}
/* Fix everything that needs fixing. */
{
int ret;
+ if (!have_action_items(ctx))
+ goto maybe_trim;
+
/*
* Check the summary counters early. Normally we do this during phase
* seven, but some of the cross-referencing requires fairly-accurate
if (ret)
return ret;
- return repair_everything(ctx);
+ ret = repair_everything(ctx);
+ if (ret)
+ return ret;
+
+ /*
+ * If errors remain on the filesystem, do not trim anything. We don't
+ * have any threads running, so it's ok to skip the ctx lock here.
+ */
+ if (ctx->corruptions_found || ctx->unfixable_errors != 0)
+ return 0;
+
+maybe_trim:
+ trim_filesystem(ctx);
+ return 0;
}
/* Estimate how much work we're going to do. */