Re: [PATCH v3 10/21] xfs: Update xfs_is_falloc_aligned() mask for forcealign

From: Dave Chinner
Date: Tue Apr 30 2024 - 19:35:35 EST


On Mon, Apr 29, 2024 at 05:47:35PM +0000, John Garry wrote:
> For when forcealign is enabled, we want the alignment mask to cover an
> aligned extent, similar to rtvol.
>
> Signed-off-by: John Garry <john.g.garry@xxxxxxxxxx>
> ---
> fs/xfs/xfs_file.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
> index 632653e00906..e81e01e6b22b 100644
> --- a/fs/xfs/xfs_file.c
> +++ b/fs/xfs/xfs_file.c
> @@ -61,7 +61,10 @@ xfs_is_falloc_aligned(
> }
> mask = XFS_FSB_TO_B(mp, mp->m_sb.sb_rextsize) - 1;
> } else {
> - mask = mp->m_sb.sb_blocksize - 1;
> + if (xfs_inode_has_forcealign(ip) && ip->i_extsize > 1)
> + mask = (mp->m_sb.sb_blocksize * ip->i_extsize) - 1;
> + else
> + mask = mp->m_sb.sb_blocksize - 1;
> }
>
> return !((pos | len) & mask);

I think this whole function needs to be rewritten so that
non-power-of-2 extent sizes are supported on both devices properly.

xfs_extlen_t fsbs = 1;
u64 bytes;
u32 mod;

if (xfs_inode_has_forcealign(ip))
fsbs = ip->i_extsize;
else if (XFS_IS_REALTIME_INODE(ip))
fsbs = mp->m_sb.sb_rextsize;

bytes = XFS_FSB_TO_B(mp, fsbs);
if (is_power_of_2(fsbs))
return !((pos | len) & (bytes - 1));

div_u64_rem(pos, bytes, &mod);
if (mod)
return false;
div_u64_rem(len, bytes, &mod);
return mod == 0;

-Dave.
--
Dave Chinner
david@xxxxxxxxxxxxx