]> git-server-git.apps.pok.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
xfs_scrub: fix spacemap external log device scan dev key
authorDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jun 2026 01:02:24 +0000 (18:02 -0700)
committerAndrey Albershteyn <aalbersh@kernel.org>
Tue, 30 Jun 2026 09:50:19 +0000 (11:50 +0200)
Codex bizarrely complains about the rtstart>0 logic in scan_log_rmaps,
because it gets confused about the difference between internal logs
(which are scanned by scan_ag_rmaps) and external logs, which this
function handles.  I'm ignoring the report, but we shouldn't open-code
the synthetic device keys so let's fix that by hoisting the fsmap device
helpers from phase6.c to spacemap.h and using them everywhere.

Cc: linux-xfs@vger.kernel.org # v6.15.0
Fixes: 37591ef3f4f14c ("xfs_scrub: support internal RT device")
Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
scrub/phase6.c
scrub/phase7.c
scrub/spacemap.c
scrub/spacemap.h

index aef817add4157bd72fd95cb8b9a6aeff7530d2c7..c562a07666516b818986249f94dec26f274b8f33 100644 (file)
@@ -45,48 +45,6 @@ struct media_verify_state {
        struct read_verify_pool *rvp[XFS_DEV_RT + 1];
 };
 
-/* Return XFS device index from fsmap device. */
-static enum xfs_device
-from_fsmap_dev(
-       struct scrub_ctx        *ctx,
-       dev_t                   dev)
-{
-       if (ctx->mnt.fsgeom.rtstart) {
-               if (dev < XFS_DEV_DATA || dev > XFS_DEV_RT)
-                       abort();
-               return dev;
-       }
-
-       if (dev == ctx->fsinfo.fs_datadev)
-               return XFS_DEV_DATA;
-       if (dev == ctx->fsinfo.fs_logdev)
-               return XFS_DEV_LOG;
-       if (dev == ctx->fsinfo.fs_rtdev)
-               return XFS_DEV_RT;
-       abort();
-}
-
-/* Return fsmap device for XFS device index. */
-static uint32_t
-to_fsmap_dev(
-       struct scrub_ctx        *ctx,
-       enum xfs_device         dev)
-{
-       if (ctx->mnt.fsgeom.rtstart)
-               return dev;
-
-       switch (dev) {
-       case XFS_DEV_DATA:
-               return ctx->fsinfo.fs_datadev;
-       case XFS_DEV_LOG:
-               return ctx->fsinfo.fs_logdev;
-       case XFS_DEV_RT:
-               return ctx->fsinfo.fs_rtdev;
-       default:
-               abort();
-       }
-}
-
 struct disk_ioerr_report {
        struct scrub_ctx        *ctx;
        enum xfs_device         dev;
index 375ba0632c353b3b2d9b9918bd11f96a273fbf30..d741865295d043de774ea749151a64b792c34bc7 100644 (file)
@@ -70,19 +70,10 @@ count_block_summary(
        void                    *arg)
 {
        struct summary_counts   *counts;
-       enum xfs_device         dev;
+       enum xfs_device         dev = from_fsmap_dev(ctx, fsmap->fmr_device);
        unsigned long long      len;
        int                     ret;
 
-       if (ctx->mnt.fsgeom.rtstart)
-               dev = fsmap->fmr_device;
-       else if (fsmap->fmr_device == ctx->fsinfo.fs_logdev)
-               dev = XFS_DEV_LOG;
-       else if (fsmap->fmr_device == ctx->fsinfo.fs_rtdev)
-               dev = XFS_DEV_RT;
-       else
-               dev = XFS_DEV_DATA;
-
        counts = ptvar_get((struct ptvar *)arg, &ret);
        if (ret) {
                str_liberror(ctx, -ret, _("retrieving summary counts"));
index 8f595ad94c5991e9ce5ab3a1d74c3b10af23c5f4..45ac61d0942ccb1e334a58771684a173f7e23001 100644 (file)
@@ -103,10 +103,7 @@ scan_ag_rmaps(
        bperag = (off_t)ctx->mnt.fsgeom.agblocks *
                 (off_t)ctx->mnt.fsgeom.blocksize;
 
-       if (ctx->mnt.fsgeom.rtstart)
-               keys[0].fmr_device = XFS_DEV_DATA;
-       else
-               keys[0].fmr_device = ctx->fsinfo.fs_datadev;
+       keys[0].fmr_device = to_fsmap_dev(ctx, XFS_DEV_DATA);
        keys[0].fmr_physical = agno * bperag;
        keys[1].fmr_device = keys[0].fmr_device;
        keys[1].fmr_physical = ((agno + 1) * bperag) - 1;
@@ -143,10 +140,7 @@ scan_rtg_rmaps(
        off_t                   bperrg = bytes_per_rtgroup(&ctx->mnt.fsgeom);
        int                     ret;
 
-       if (ctx->mnt.fsgeom.rtstart)
-               keys[0].fmr_device = XFS_DEV_RT;
-       else
-               keys[0].fmr_device = ctx->fsinfo.fs_rtdev;
+       keys[0].fmr_device = to_fsmap_dev(ctx, XFS_DEV_RT);
        keys[0].fmr_physical = (xfs_rtblock_t)rgno * bperrg;
        keys[1].fmr_device = keys[0].fmr_device;
        keys[1].fmr_physical = ((rgno + 1) * bperrg) - 1;
@@ -210,10 +204,10 @@ scan_rt_rmaps(
 {
        struct scrub_ctx        *ctx = (struct scrub_ctx *)wq->wq_ctx;
 
-       scan_dev_rmaps(ctx, ctx->fsinfo.fs_rtdev, arg);
+       scan_dev_rmaps(ctx, to_fsmap_dev(ctx, XFS_DEV_RT), arg);
 }
 
-/* Iterate all the reverse mappings of the log device. */
+/* Iterate all the reverse mappings of the external log device. */
 static void
 scan_log_rmaps(
        struct workqueue        *wq,
@@ -222,8 +216,7 @@ scan_log_rmaps(
 {
        struct scrub_ctx        *ctx = (struct scrub_ctx *)wq->wq_ctx;
 
-       scan_dev_rmaps(ctx, ctx->mnt.fsgeom.rtstart ? 2 : ctx->fsinfo.fs_logdev,
-                       arg);
+       scan_dev_rmaps(ctx, to_fsmap_dev(ctx, XFS_DEV_LOG), arg);
 }
 
 /*
index 759d0f89089a23fa383da9a975d3c0a8d743c46e..0d85285f29ede9cd99175c6fd025f7c8a4ff6a06 100644 (file)
@@ -23,4 +23,46 @@ static inline unsigned int scrub_scan_spacemaps_nproc(struct scrub_ctx *ctx)
        return scrub_nproc(ctx);
 }
 
+/* Return XFS device index from fsmap device. */
+static inline enum xfs_device
+from_fsmap_dev(
+       struct scrub_ctx        *ctx,
+       dev_t                   dev)
+{
+       if (ctx->mnt.fsgeom.rtstart) {
+               if (dev < XFS_DEV_DATA || dev > XFS_DEV_RT)
+                       abort();
+               return dev;
+       }
+
+       if (dev == ctx->fsinfo.fs_datadev)
+               return XFS_DEV_DATA;
+       if (dev == ctx->fsinfo.fs_logdev)
+               return XFS_DEV_LOG;
+       if (dev == ctx->fsinfo.fs_rtdev)
+               return XFS_DEV_RT;
+       abort();
+}
+
+/* Return fsmap device for XFS device index. */
+static inline uint32_t
+to_fsmap_dev(
+       struct scrub_ctx        *ctx,
+       enum xfs_device         dev)
+{
+       if (ctx->mnt.fsgeom.rtstart)
+               return dev;
+
+       switch (dev) {
+       case XFS_DEV_DATA:
+               return ctx->fsinfo.fs_datadev;
+       case XFS_DEV_LOG:
+               return ctx->fsinfo.fs_logdev;
+       case XFS_DEV_RT:
+               return ctx->fsinfo.fs_rtdev;
+       default:
+               abort();
+       }
+}
+
 #endif /* XFS_SCRUB_SPACEMAP_H_ */