]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: pass back updated nb from xfs_growfs_compute_deltas
authorChristoph Hellwig <hch@lst.de>
Tue, 9 Jun 2026 07:52:44 +0000 (09:52 +0200)
committerCarlos Maiolino <cem@kernel.org>
Wed, 10 Jun 2026 10:21:52 +0000 (12:21 +0200)
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: a49b7ff63f98 ("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>
fs/xfs/libxfs/xfs_ag.c
fs/xfs/libxfs/xfs_ag.h
fs/xfs/xfs_fsops.c

index dcd2f93b6a6c7a004b390e1af7d689f12f41107b..0c5f0548021f49a6838600355037aa0d830150ab 100644 (file)
@@ -866,7 +866,7 @@ resv_err:
 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;
 }
index 16a9b43a3c270c32cc5abecf3a43433cdb642f0c..8aa4266c55714d8aa2108a4a33c146184db183e4 100644 (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);
index 8d64d904d73c19849312ff234aa393f12bf8fb50..436857356a0a12fd3bb626b3ac1062f00066bb5b 100644 (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