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 |
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 --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); }
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(-)