]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_mdrestore: support internal RT devices
authorChristoph Hellwig <hch@lst.de>
Mon, 14 Apr 2025 05:36:25 +0000 (07:36 +0200)
committerAndrey Albershteyn <aalbersh@kernel.org>
Tue, 29 Apr 2025 16:11:09 +0000 (18:11 +0200)
Calculate the size properly for internal RT devices and skip restoring
to the external one for this case.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
mdrestore/xfs_mdrestore.c

index d5014981b15a68c2ecbbd05fe37ba68e072a3787..95b01a99a1549b3f107ac661c51428c3b0bc8bc3 100644 (file)
@@ -183,6 +183,20 @@ verify_device_size(
        }
 }
 
+static void
+verify_main_device_size(
+       const struct mdrestore_dev      *dev,
+       struct xfs_sb                   *sb)
+{
+       xfs_rfsblock_t                  nr_blocks = sb->sb_dblocks;
+
+       /* internal RT device */
+       if (sb->sb_rtstart)
+               nr_blocks = sb->sb_rtstart + sb->sb_rblocks;
+
+       verify_device_size(dev, nr_blocks, sb->sb_blocksize);
+}
+
 static void
 read_header_v1(
        union mdrestore_headers *h,
@@ -269,7 +283,7 @@ restore_v1(
 
        ((struct xfs_dsb*)block_buffer)->sb_inprogress = 1;
 
-       verify_device_size(ddev, sb.sb_dblocks, sb.sb_blocksize);
+       verify_main_device_size(ddev, &sb);
 
        bytes_read = 0;
 
@@ -432,14 +446,14 @@ restore_v2(
 
        ((struct xfs_dsb *)block_buffer)->sb_inprogress = 1;
 
-       verify_device_size(ddev, sb.sb_dblocks, sb.sb_blocksize);
+       verify_main_device_size(ddev, &sb);
 
        if (sb.sb_logstart == 0) {
                ASSERT(mdrestore.external_log == true);
                verify_device_size(logdev, sb.sb_logblocks, sb.sb_blocksize);
        }
 
-       if (sb.sb_rblocks > 0) {
+       if (sb.sb_rblocks > 0 && !sb.sb_rtstart) {
                ASSERT(mdrestore.realtime_data == true);
                verify_device_size(rtdev, sb.sb_rblocks, sb.sb_blocksize);
        }