xfs: pass back updated nb from xfs_growfs_compute_deltas

xfs_growfs_compute_deltas can update nb for corner cases like a number
of blocks that would create a less the minimal sized AG, or running
past the max AG limit.  Pass back the calculated value to the caller,
as it relies on to calculate the new number of perag structures.

Note that the grown file system size is not affected by this
miscalculation as it uses the passed back delta value.

Fixes: a49b7ff63f ("xfs: Refactoring the nagcount and delta calculation")
Cc: stable@vger.kernel.org # v7.0
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
Christoph Hellwig 2026-06-09 09:52:44 +02:00 committed by Carlos Maiolino
parent 84eec3f7fc
commit 4cb6e89a3d
3 changed files with 7 additions and 7 deletions

View File

@ -866,7 +866,7 @@ xfs_ag_shrink_space(
void
xfs_growfs_compute_deltas(
struct xfs_mount *mp,
xfs_rfsblock_t nb,
xfs_rfsblock_t *nb,
int64_t *deltap,
xfs_agnumber_t *nagcountp)
{
@ -874,19 +874,19 @@ xfs_growfs_compute_deltas(
int64_t delta;
xfs_agnumber_t nagcount;
nb_div = nb;
nb_div = *nb;
nb_mod = do_div(nb_div, mp->m_sb.sb_agblocks);
if (nb_mod && nb_mod >= XFS_MIN_AG_BLOCKS)
nb_div++;
else if (nb_mod)
nb = nb_div * mp->m_sb.sb_agblocks;
*nb = nb_div * mp->m_sb.sb_agblocks;
if (nb_div > XFS_MAX_AGNUMBER + 1) {
nb_div = XFS_MAX_AGNUMBER + 1;
nb = nb_div * mp->m_sb.sb_agblocks;
*nb = nb_div * mp->m_sb.sb_agblocks;
}
nagcount = nb_div;
delta = nb - mp->m_sb.sb_dblocks;
delta = *nb - mp->m_sb.sb_dblocks;
*deltap = delta;
*nagcountp = nagcount;
}

View File

@ -330,7 +330,7 @@ int xfs_ag_init_headers(struct xfs_mount *mp, struct aghdr_init_data *id);
int xfs_ag_shrink_space(struct xfs_perag *pag, struct xfs_trans **tpp,
xfs_extlen_t delta);
void
xfs_growfs_compute_deltas(struct xfs_mount *mp, xfs_rfsblock_t nb,
xfs_growfs_compute_deltas(struct xfs_mount *mp, xfs_rfsblock_t *nb,
int64_t *deltap, xfs_agnumber_t *nagcountp);
int xfs_ag_extend_space(struct xfs_perag *pag, struct xfs_trans *tp,
xfs_extlen_t len);

View File

@ -124,7 +124,7 @@ xfs_growfs_data_private(
mp->m_sb.sb_rextsize);
if (error)
return error;
xfs_growfs_compute_deltas(mp, nb, &delta, &nagcount);
xfs_growfs_compute_deltas(mp, &nb, &delta, &nagcount);
/*
* Reject filesystems with a single AG because they are not