@@ -31,6 +31,7 @@ struct summary_counts {
/* Free space histogram, in fsb */
struct histogram datadev_hist;
+ struct histogram rtdev_hist;
};
/*
@@ -56,6 +57,7 @@ summary_count_init(
struct summary_counts *counts = data;
init_freesp_hist(&counts->datadev_hist);
+ init_freesp_hist(&counts->rtdev_hist);
}
/* Record block usage. */
@@ -83,6 +85,8 @@ count_block_summary(
blocks = cvt_b_to_off_fsbt(&ctx->mnt, fsmap->fmr_length);
if (fsmap->fmr_device == ctx->fsinfo.fs_datadev)
hist_add(&counts->datadev_hist, blocks);
+ else if (fsmap->fmr_device == ctx->fsinfo.fs_rtdev)
+ hist_add(&counts->rtdev_hist, blocks);
return 0;
}
@@ -124,7 +128,9 @@ add_summaries(
total->agbytes += item->agbytes;
hist_import(&total->datadev_hist, &item->datadev_hist);
+ hist_import(&total->rtdev_hist, &item->rtdev_hist);
hist_free(&item->datadev_hist);
+ hist_free(&item->rtdev_hist);
return 0;
}
@@ -195,6 +201,7 @@ phase7_func(
/* Preserve free space histograms for phase 8. */
hist_move(&ctx->datadev_hist, &totalcount.datadev_hist);
+ hist_move(&ctx->rtdev_hist, &totalcount.rtdev_hist);
/* Scan the whole fs. */
error = scrub_count_all_inodes(ctx, &counted_inodes);
@@ -211,13 +211,17 @@ fstrim_rtdev(
struct scrub_ctx *ctx)
{
struct xfs_fsop_geom *geo = &ctx->mnt.fsgeom;
+ uint64_t minlen_fsb;
+
+ minlen_fsb = fstrim_compute_minlen(ctx, &ctx->rtdev_hist);
/*
* The fstrim ioctl pretends that the realtime volume is in the address
* space immediately after the data volume. Ignore EINVAL if someone
* tries to run us on an older kernel.
*/
- return fstrim_fsblocks(ctx, geo->datablocks, geo->rtblocks, 0, true);
+ return fstrim_fsblocks(ctx, geo->datablocks, geo->rtblocks,
+ minlen_fsb, true);
}
/* Trim the filesystem, if desired. */
@@ -728,6 +728,7 @@ main(
int error;
hist_init(&ctx.datadev_hist);
+ hist_init(&ctx.rtdev_hist);
fprintf(stdout, "EXPERIMENTAL xfs_scrub program in use! Use at your own risk!\n");
fflush(stdout);
@@ -960,6 +961,7 @@ main(
unicrash_unload();
hist_free(&ctx.datadev_hist);
+ hist_free(&ctx.rtdev_hist);
/*
* If we're being run as a service, the return code must fit the LSB
@@ -101,6 +101,7 @@ struct scrub_ctx {
/* Free space histograms, in fsb */
struct histogram datadev_hist;
+ struct histogram rtdev_hist;
/*
* Pick the largest value for fstrim minlen such that we trim at least