_("Unable to find log device path."));
return ECANCELED;
}
- if (ctx->mnt.fsgeom.rtblocks && ctx->fsinfo.fs_rt == NULL) {
+ if (ctx->mnt.fsgeom.rtblocks && ctx->fsinfo.fs_rt == NULL &&
+ !ctx->mnt.fsgeom.rtstart) {
str_error(ctx, ctx->mntpoint,
_("Unable to find realtime device path."));
return ECANCELED;
struct media_verify_state *vs,
dev_t dev)
{
- if (dev == ctx->fsinfo.fs_datadev)
- return vs->rvp_data;
- else if (dev == ctx->fsinfo.fs_logdev)
- return vs->rvp_log;
- else if (dev == ctx->fsinfo.fs_rtdev)
- return vs->rvp_realtime;
+ if (ctx->mnt.fsgeom.rtstart) {
+ if (dev == XFS_DEV_DATA)
+ return vs->rvp_data;
+ if (dev == XFS_DEV_LOG)
+ return vs->rvp_log;
+ if (dev == XFS_DEV_RT)
+ return vs->rvp_realtime;
+ } else {
+ if (dev == ctx->fsinfo.fs_datadev)
+ return vs->rvp_data;
+ if (dev == ctx->fsinfo.fs_logdev)
+ return vs->rvp_log;
+ if (dev == ctx->fsinfo.fs_rtdev)
+ return vs->rvp_realtime;
+ }
abort();
}
struct scrub_ctx *ctx,
struct disk *disk)
{
- if (disk == ctx->datadev)
- return ctx->fsinfo.fs_datadev;
- else if (disk == ctx->logdev)
- return ctx->fsinfo.fs_logdev;
- else if (disk == ctx->rtdev)
- return ctx->fsinfo.fs_rtdev;
+ if (ctx->mnt.fsgeom.rtstart) {
+ if (disk == ctx->datadev)
+ return XFS_DEV_DATA;
+ if (disk == ctx->logdev)
+ return XFS_DEV_LOG;
+ if (disk == ctx->rtdev)
+ return XFS_DEV_RT;
+ } else {
+ if (disk == ctx->datadev)
+ return ctx->fsinfo.fs_datadev;
+ if (disk == ctx->logdev)
+ return ctx->fsinfo.fs_logdev;
+ if (disk == ctx->rtdev)
+ return ctx->fsinfo.fs_rtdev;
+ }
abort();
}
struct disk *disk,
struct media_verify_state *vs)
{
- dev_t dev = disk_to_dev(ctx, disk);
-
- if (dev == ctx->fsinfo.fs_datadev)
+ if (disk == ctx->datadev)
return vs->d_bad;
- else if (dev == ctx->fsinfo.fs_rtdev)
+ if (disk == ctx->rtdev)
return vs->r_bad;
return NULL;
}
.length = length,
};
struct disk_ioerr_report *dioerr = arg;
- dev_t dev;
-
- dev = disk_to_dev(dioerr->ctx, dioerr->disk);
/* Go figure out which blocks are bad from the fsmap. */
- keys[0].fmr_device = dev;
+ keys[0].fmr_device = disk_to_dev(dioerr->ctx, dioerr->disk);
keys[0].fmr_physical = start;
- keys[1].fmr_device = dev;
+ keys[1].fmr_device = keys[0].fmr_device;
keys[1].fmr_physical = start + length - 1;
keys[1].fmr_owner = ULLONG_MAX;
keys[1].fmr_offset = ULLONG_MAX;
int ret;
if (!length) {
- dev_t dev = disk_to_dev(ctx, disk);
-
- if (dev == ctx->fsinfo.fs_datadev)
+ if (disk == ctx->datadev)
vs->d_trunc = true;
- else if (dev == ctx->fsinfo.fs_rtdev)
- vs->r_trunc = true;
- else if (dev == ctx->fsinfo.fs_logdev)
+ else if (disk == ctx->logdev)
vs->l_trunc = true;
+ else if (disk == ctx->rtdev)
+ vs->r_trunc = true;
return;
}
void *arg)
{
struct summary_counts *counts;
+ bool is_rt = false;
unsigned long long len;
int ret;
+ if (ctx->mnt.fsgeom.rtstart) {
+ if (fsmap->fmr_device == XFS_DEV_LOG)
+ return 0;
+ if (fsmap->fmr_device == XFS_DEV_RT)
+ is_rt = true;
+ } else {
+ if (fsmap->fmr_device == ctx->fsinfo.fs_logdev)
+ return 0;
+ if (fsmap->fmr_device == ctx->fsinfo.fs_rtdev)
+ is_rt = true;
+ }
+
counts = ptvar_get((struct ptvar *)arg, &ret);
if (ret) {
str_liberror(ctx, -ret, _("retrieving summary counts"));
return -ret;
}
- if (fsmap->fmr_device == ctx->fsinfo.fs_logdev)
- return 0;
+
if ((fsmap->fmr_flags & FMR_OF_SPECIAL_OWNER) &&
fsmap->fmr_owner == XFS_FMR_OWN_FREE) {
uint64_t blocks;
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)
+ if (is_rt)
hist_add(&counts->rtdev_hist, blocks);
+ else
+ hist_add(&counts->datadev_hist, blocks);
return 0;
}
/* freesp btrees live in free space, need to adjust counters later. */
if ((fsmap->fmr_flags & FMR_OF_SPECIAL_OWNER) &&
- fsmap->fmr_owner == XFS_FMR_OWN_AG) {
+ fsmap->fmr_owner == XFS_FMR_OWN_AG)
counts->agbytes += fsmap->fmr_length;
- }
- if (fsmap->fmr_device == ctx->fsinfo.fs_rtdev) {
+
+ if (is_rt) {
/* Count realtime extents. */
counts->rbytes += len;
} else {
bperag = (off_t)ctx->mnt.fsgeom.agblocks *
(off_t)ctx->mnt.fsgeom.blocksize;
- keys[0].fmr_device = ctx->fsinfo.fs_datadev;
+ if (ctx->mnt.fsgeom.rtstart)
+ keys[0].fmr_device = XFS_DEV_DATA;
+ else
+ keys[0].fmr_device = ctx->fsinfo.fs_datadev;
keys[0].fmr_physical = agno * bperag;
- keys[1].fmr_device = ctx->fsinfo.fs_datadev;
+ keys[1].fmr_device = keys[0].fmr_device;
keys[1].fmr_physical = ((agno + 1) * bperag) - 1;
keys[1].fmr_owner = ULLONG_MAX;
keys[1].fmr_offset = ULLONG_MAX;
off_t bperrg = bytes_per_rtgroup(&ctx->mnt.fsgeom);
int ret;
- keys[0].fmr_device = ctx->fsinfo.fs_rtdev;
+ if (ctx->mnt.fsgeom.rtstart)
+ keys[0].fmr_device = XFS_DEV_RT;
+ else
+ keys[0].fmr_device = ctx->fsinfo.fs_rtdev;
keys[0].fmr_physical = (xfs_rtblock_t)rgno * bperrg;
- keys[1].fmr_device = ctx->fsinfo.fs_rtdev;
+ keys[1].fmr_device = keys[0].fmr_device;
keys[1].fmr_physical = ((rgno + 1) * bperrg) - 1;
keys[1].fmr_owner = ULLONG_MAX;
keys[1].fmr_offset = ULLONG_MAX;
{
struct scrub_ctx *ctx = (struct scrub_ctx *)wq->wq_ctx;
- scan_dev_rmaps(ctx, ctx->fsinfo.fs_logdev, arg);
+ scan_dev_rmaps(ctx, ctx->mnt.fsgeom.rtstart ? 2 : ctx->fsinfo.fs_logdev,
+ arg);
}
/*