diff mbox series

[44/45] xfs_mdrestore: support internal RT devices

Message ID 20250409075557.3535745-45-hch@lst.de (mailing list archive)
State New
Headers show
Series [01/45] xfs: generalize the freespace and reserved blocks handling | expand

Commit Message

Christoph Hellwig April 9, 2025, 7:55 a.m. UTC
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>
---
 mdrestore/xfs_mdrestore.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

Comments

Darrick J. Wong April 9, 2025, 7:36 p.m. UTC | #1
On Wed, Apr 09, 2025 at 09:55:47AM +0200, Christoph Hellwig wrote:
> 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>

Looks good,
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  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 d5014981b15a..95b01a99a154 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.47.2
> 
>
diff mbox series

Patch

diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c
index d5014981b15a..95b01a99a154 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);
 	}