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