On Mon, Apr 29, 2024 at 05:47:34PM +0000, John Garry wrote: > For when forcealign is enabled, we want the EOF to be aligned as well, so > do not free EOF blocks. This is doesn't match what the code does. The code is correct - it rounds the range to be trimmed up to the aligned offset beyond EOF and then frees them. The description needs to be updated to reflect this. > > Signed-off-by: John Garry <john.g.garry@xxxxxxxxxx> > --- > fs/xfs/xfs_bmap_util.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 19e11d1da660..f26d1570b9bd 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -542,8 +542,13 @@ xfs_can_free_eofblocks( > * forever. > */ > end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)XFS_ISIZE(ip)); > - if (XFS_IS_REALTIME_INODE(ip) && mp->m_sb.sb_rextsize > 1) > + > + /* Do not free blocks when forcing extent sizes */ > + if (xfs_inode_has_forcealign(ip) && ip->i_extsize > 1) I see this sort of check all through the remaining patches. Given there are significant restrictions on forced alignment, shouldn't this all the details be pushed inside the helper function? e.g. /* * Forced extent alignment is dependent on extent size hints being * set to define the alignment. Alignment is only necessary when the * extent size hint is larger than a single block. * * If reflink is enabled on the file or we are in always_cow mode, * we can't easily do forced alignment. * * We don't support forced alignment on realtime files. * XXX(dgc): why not? */ static inline bool xfs_inode_has_forcealign(struct xfs_inode *ip) { if (!(ip->di_flags & XFS_DIFLAG_EXTSIZE)) return false; if (ip->i_extsize <= 1) return false; if (xfs_is_cow_inode(ip)) return false; if (ip->di_flags & XFS_DIFLAG_REALTIME) return false; return ip->di_flags2 & XFS_DIFLAG2_FORCEALIGN; } -Dave. -- Dave Chinner david@xxxxxxxxxxxxx