For when forcealign is enabled, we want the alignment mask to cover an
aligned extent, similar to rtvol.
Signed-off-by: John Garry <[email protected]>
---
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);
--
2.31.1
On 01/05/2024 00:35, Dave Chinner wrote:
>> 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;
ok, but I still have a doubt about non-power-of-2 forcealign extsize
support.
Thanks,
John
On Wed, May 01, 2024 at 11:48:59AM +0100, John Garry wrote:
> On 01/05/2024 00:35, Dave Chinner wrote:
> > > 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;
>
> ok, but I still have a doubt about non-power-of-2 forcealign extsize
> support.
The trouble is, non-power-of-2 extent size hints are supported for
regular and realtime files for funny cases like trying to align
allocations to RAID stripes. I think it would be hard to drop support
for this, given that means that old filesystems can't ever get upgraded
to forcealign.
--D
> Thanks,
> John
>