From e7fff2d4851a9824c3a38bc2190b0915775e1729 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Thu, 19 Dec 2024 19:54:43 -0800 Subject: [PATCH] xfs_mdrestore: support internal RT devices Calculate the size properly for internal RT devices and skip restoring to the external one for this case. Signed-off-by: Christoph Hellwig --- mdrestore/xfs_mdrestore.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index d5014981b..95b01a99a 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -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); } -- 2.50.1