xfs: cleanup xfs_growfs_compute_deltas

xfs_growfs_compute_deltas has an odd calling conventions, and looks
very convoluted due to the use of do_div and strangely named and typed
variables.

Rename it, make it return the agcount and let the caller calculate the
delta.  The internally use the better div_u64_rem helper and descriptive
variable names and types.  Also add a comment describing what the
function is used for.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
Christoph Hellwig 2026-06-09 09:52:45 +02:00 committed by Carlos Maiolino
parent 4cb6e89a3d
commit dfac6ba848
3 changed files with 25 additions and 26 deletions

View File

@ -863,32 +863,30 @@ xfs_ag_shrink_space(
return err2;
}
void
xfs_growfs_compute_deltas(
/*
* Return the agcount for the new file system size passed in *nb and adjust *nb
* when it has to be reduced because of maximum AG count or because it would
* create a below minimum size AG.
*/
xfs_agnumber_t
xfs_growfs_compute_agcount(
struct xfs_mount *mp,
xfs_rfsblock_t *nb,
int64_t *deltap,
xfs_agnumber_t *nagcountp)
xfs_rfsblock_t *nb)
{
xfs_rfsblock_t nb_div, nb_mod;
int64_t delta;
xfs_agnumber_t nagcount;
uint64_t agcount; /* 64-bits wide to catch overflows */
xfs_extlen_t remainder;
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;
if (nb_div > XFS_MAX_AGNUMBER + 1) {
nb_div = XFS_MAX_AGNUMBER + 1;
*nb = nb_div * mp->m_sb.sb_agblocks;
agcount = div_u64_rem(*nb, mp->m_sb.sb_agblocks, &remainder);
if (agcount >= XFS_MAX_AGNUMBER + 1) {
agcount = XFS_MAX_AGNUMBER + 1;
remainder = 0;
}
nagcount = nb_div;
delta = *nb - mp->m_sb.sb_dblocks;
*deltap = delta;
*nagcountp = nagcount;
*nb = (xfs_rfsblock_t)agcount * mp->m_sb.sb_agblocks;
if (remainder >= XFS_MIN_AG_BLOCKS) {
*nb += remainder;
agcount++;
}
return agcount;
}
/*

View File

@ -329,12 +329,11 @@ struct aghdr_init_data {
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,
int64_t *deltap, xfs_agnumber_t *nagcountp);
int xfs_ag_extend_space(struct xfs_perag *pag, struct xfs_trans *tp,
xfs_extlen_t len);
int xfs_ag_get_geometry(struct xfs_perag *pag, struct xfs_ag_geometry *ageo);
xfs_agnumber_t xfs_growfs_compute_agcount(struct xfs_mount *mp,
xfs_rfsblock_t *nb);
static inline xfs_fsblock_t
xfs_agbno_to_fsb(

View File

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