]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: fix the zoned RT growfs check for zone alignment
authorChristoph Hellwig <hch@lst.de>
Tue, 16 Dec 2025 17:30:09 +0000 (18:30 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 Jan 2026 11:57:22 +0000 (12:57 +0100)
commit dc68c0f601691010dd5ae53442f8523f41a53131 upstream.

The grofs code for zoned RT subvolums already tries to check for zone
alignment, but gets it wrong by using the old instead of the new mount
structure.

Fixes: 01b71e64bb87 ("xfs: support growfs on zoned file systems")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Cc: stable@vger.kernel.org # v6.15
Signed-off-by: Carlos Maiolino <cem@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/xfs_rtalloc.c

index 6907e871fa1511a70145d09db5bf65b5ec9b8714..e063f4f2f2e6175c7583e24d0f8a61efbfb32dcc 100644 (file)
@@ -1255,12 +1255,10 @@ xfs_growfs_check_rtgeom(
        min_logfsbs = min_t(xfs_extlen_t, xfs_log_calc_minimum_size(nmp),
                        nmp->m_rsumblocks * 2);
 
-       kfree(nmp);
-
        trace_xfs_growfs_check_rtgeom(mp, min_logfsbs);
 
        if (min_logfsbs > mp->m_sb.sb_logblocks)
-               return -EINVAL;
+               goto out_inval;
 
        if (xfs_has_zoned(mp)) {
                uint32_t        gblocks = mp->m_groups[XG_TYPE_RTG].blocks;
@@ -1268,16 +1266,20 @@ xfs_growfs_check_rtgeom(
 
                if (rextsize != 1)
                        return -EINVAL;
-               div_u64_rem(mp->m_sb.sb_rblocks, gblocks, &rem);
+               div_u64_rem(nmp->m_sb.sb_rblocks, gblocks, &rem);
                if (rem) {
                        xfs_warn(mp,
 "new RT volume size (%lld) not aligned to RT group size (%d)",
-                               mp->m_sb.sb_rblocks, gblocks);
-                       return -EINVAL;
+                               nmp->m_sb.sb_rblocks, gblocks);
+                       goto out_inval;
                }
        }
 
+       kfree(nmp);
        return 0;
+out_inval:
+       kfree(nmp);
+       return -EINVAL;
 }
 
 /*