From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: cem@kernel.org, hans.holmberg@wdc.com, linux-xfs@vger.kernel.org
Subject: Re: [PATCH] xfs: fix overflows when converting from a count of groups to blocks
Date: Mon, 27 Oct 2025 09:07:26 -0700 [thread overview]
Message-ID: <20251027160726.GR3356773@frogsfrogsfrogs> (raw)
In-Reply-To: <20251027140439.812210-1-hch@lst.de>
On Mon, Oct 27, 2025 at 03:04:39PM +0100, Christoph Hellwig wrote:
> Add a xfs_group helper and a xfs_rtgroup wrapper and use that to avoid
> overflows when converting zone/rtg counts to block counts.
>
> Fixes: 0bb2193056b5 ("xfs: add support for zoned space reservations")
> Fixes: 080d01c41d44 ("xfs: implement zoned garbage collection")
Cc: <stable@vger.kernel.org> # v6.15
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/xfs/libxfs/xfs_group.h | 9 +++++++++
> fs/xfs/libxfs/xfs_rtgroup.h | 8 ++++++++
> fs/xfs/xfs_zone_gc.c | 3 +--
> fs/xfs/xfs_zone_space_resv.c | 8 +++-----
> 4 files changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/fs/xfs/libxfs/xfs_group.h b/fs/xfs/libxfs/xfs_group.h
> index 4423932a2313..a6eabe6da4fb 100644
> --- a/fs/xfs/libxfs/xfs_group.h
> +++ b/fs/xfs/libxfs/xfs_group.h
> @@ -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_fsb(
Minor nitpicking: should these functions that return a raw fsblock count
(xfs_rfsblock_t) have a slightly different name?
xfs_groups_to_rfsb() ?
Just so that someone doesn't think the return value is a segmented
fsblock address based on a misreading of the function name...
> + 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)
> diff --git a/fs/xfs/libxfs/xfs_rtgroup.h b/fs/xfs/libxfs/xfs_rtgroup.h
> index d36a6ae0abe5..a34da969bb6b 100644
> --- a/fs/xfs/libxfs/xfs_rtgroup.h
> +++ b/fs/xfs/libxfs/xfs_rtgroup.h
> @@ -365,4 +365,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_rtb(
...especially since we're really not returning an rtblock here.
The additional casting is correct though.
--D
> + struct xfs_mount *mp,
> + uint32_t nr_groups)
> +{
> + return xfs_groups_to_fsb(mp, nr_groups, XG_TYPE_RTG);
> +}
> +
> #endif /* __LIBXFS_RTGROUP_H */
> diff --git a/fs/xfs/xfs_zone_gc.c b/fs/xfs/xfs_zone_gc.c
> index 109877d9a6bf..c43513531200 100644
> --- a/fs/xfs/xfs_zone_gc.c
> +++ b/fs/xfs/xfs_zone_gc.c
> @@ -179,8 +179,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_rtb(mp, mp->m_max_open_zones - XFS_OPEN_GC_ZONES))
> return true;
>
> free = xfs_estimate_freecounter(mp, XC_FREE_RTEXTENTS);
> diff --git a/fs/xfs/xfs_zone_space_resv.c b/fs/xfs/xfs_zone_space_resv.c
> index 9cd38716fd25..3a1a363fc8ea 100644
> --- a/fs/xfs/xfs_zone_space_resv.c
> +++ b/fs/xfs/xfs_zone_space_resv.c
> @@ -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_rtb(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_rtb(mp, XFS_GC_ZONES);
> default:
> ASSERT(0);
> return 0;
> --
> 2.47.3
>
>
next prev parent reply other threads:[~2025-10-27 16:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-27 14:04 [PATCH] xfs: fix overflows when converting from a count of groups to blocks Christoph Hellwig
2025-10-27 16:07 ` Darrick J. Wong [this message]
2025-10-30 6:54 ` Christoph Hellwig
2025-10-30 16:32 ` Darrick J. Wong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251027160726.GR3356773@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=cem@kernel.org \
--cc=hans.holmberg@wdc.com \
--cc=hch@lst.de \
--cc=linux-xfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.