]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: add a xfs_groups_to_rfsbs helper
authorChristoph Hellwig <hch@lst.de>
Mon, 3 Nov 2025 10:14:09 +0000 (05:14 -0500)
committerCarlos Maiolino <cem@kernel.org>
Tue, 11 Nov 2025 10:38:05 +0000 (11:38 +0100)
Plus a rtgroup wrapper and use that to avoid overflows when converting
zone/rtg counts to block counts.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
fs/xfs/libxfs/xfs_group.h
fs/xfs/libxfs/xfs_rtgroup.h
fs/xfs/xfs_zone_gc.c
fs/xfs/xfs_zone_space_resv.c

index 4423932a23130010e82f8596247b2a17f47f0d89..4ae638f1c2c519b3a147dd6acfac6368bb79db23 100644 (file)
@@ -98,6 +98,15 @@ xfs_group_max_blocks(
        return xg->xg_mount->m_groups[xg->xg_type].blocks;
 }
 
+static inline xfs_rfsblock_t
+xfs_groups_to_rfsbs(
+       struct xfs_mount        *mp,
+       uint32_t                nr_groups,
+       enum xfs_group_type     type)
+{
+       return (xfs_rfsblock_t)mp->m_groups[type].blocks * nr_groups;
+}
+
 static inline xfs_fsblock_t
 xfs_group_start_fsb(
        struct xfs_group        *xg)
index d4fcf591e63d08c9989439324499fbda8146a722..a94e925ae67cb69bc3682b5f3ab91c91f53ac0d6 100644 (file)
@@ -371,4 +371,12 @@ static inline int xfs_initialize_rtgroups(struct xfs_mount *mp,
 # define xfs_rtgroup_get_geometry(rtg, rgeo)   (-EOPNOTSUPP)
 #endif /* CONFIG_XFS_RT */
 
+static inline xfs_rfsblock_t
+xfs_rtgs_to_rfsbs(
+       struct xfs_mount        *mp,
+       uint32_t                nr_groups)
+{
+       return xfs_groups_to_rfsbs(mp, nr_groups, XG_TYPE_RTG);
+}
+
 #endif /* __LIBXFS_RTGROUP_H */
index 4ade5444553207bf35d2f64e57f76ec402f52e7c..a98939aba7b9605318fa8ec2248fb54c9f43d430 100644 (file)
@@ -181,8 +181,7 @@ xfs_zoned_need_gc(
        available = xfs_estimate_freecounter(mp, XC_FREE_RTAVAILABLE);
 
        if (available <
-           mp->m_groups[XG_TYPE_RTG].blocks *
-           (mp->m_max_open_zones - XFS_OPEN_GC_ZONES))
+           xfs_rtgs_to_rfsbs(mp, mp->m_max_open_zones - XFS_OPEN_GC_ZONES))
                return true;
 
        free = xfs_estimate_freecounter(mp, XC_FREE_RTEXTENTS);
index 9cd38716fd25f60e008582cda0c2b610e0c24bf0..0e54e557a585e3b608bacfaf26417cd2ac4e26d1 100644 (file)
@@ -54,12 +54,10 @@ xfs_zoned_default_resblks(
 {
        switch (ctr) {
        case XC_FREE_RTEXTENTS:
-               return (uint64_t)XFS_RESERVED_ZONES *
-                       mp->m_groups[XG_TYPE_RTG].blocks +
-                       mp->m_sb.sb_rtreserved;
+               return xfs_rtgs_to_rfsbs(mp, XFS_RESERVED_ZONES) +
+                               mp->m_sb.sb_rtreserved;
        case XC_FREE_RTAVAILABLE:
-               return (uint64_t)XFS_GC_ZONES *
-                       mp->m_groups[XG_TYPE_RTG].blocks;
+               return xfs_rtgs_to_rfsbs(mp, XFS_GC_ZONES);
        default:
                ASSERT(0);
                return 0;