On Thu, Aug 22, 2024 at 05:20:07PM -0700, Darrick J. Wong wrote: > From: Christoph Hellwig <hch@xxxxxx> > > Split the check that the rtsummary fits into the log into a separate > helper, and use xfs_growfs_rt_alloc_fake_mount to calculate the new RT > geometry. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> > [djwong: avoid division for the 0-rtx growfs check] > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > --- > fs/xfs/xfs_rtalloc.c | 43 +++++++++++++++++++++++++++++-------------- > 1 file changed, 29 insertions(+), 14 deletions(-) > > > diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c > index 61231b1dc4b79..78a3879ad6193 100644 > --- a/fs/xfs/xfs_rtalloc.c > +++ b/fs/xfs/xfs_rtalloc.c > @@ -1023,6 +1023,31 @@ xfs_growfs_rtg( > return error; > } > > +static int > +xfs_growfs_check_rtgeom( > + const struct xfs_mount *mp, > + xfs_rfsblock_t rblocks, > + xfs_extlen_t rextsize) > +{ > + struct xfs_mount *nmp; > + int error = 0; > + > + nmp = xfs_growfs_rt_alloc_fake_mount(mp, rblocks, rextsize); > + if (!nmp) > + return -ENOMEM; > + > + /* > + * New summary size can't be more than half the size of the log. This > + * prevents us from getting a log overflow, since we'll log basically > + * the whole summary file at once. > + */ > + if (nmp->m_rsumblocks > (mp->m_sb.sb_logblocks >> 1)) > + error = -EINVAL; FWIW, the new size needs to be smaller than that, because the "half the log size" must to include all the log metadata needed to encapsulate that object. The grwofs transaction also logs inodes and the superblock, so that also takes away from the maximum size of the summary file.... -Dave. -- Dave Chinner david@xxxxxxxxxxxxx