On Fri, May 03, 2024 at 02:03:37PM +0000, John Garry wrote: > The RT extent range must be considered in the xfs_flush_unmap_range() call > to stabilize the boundary. > > This code change is originally from Dave Chinner. > > Signed-off-by: John Garry <john.g.garry@xxxxxxxxxx> > --- > fs/xfs/xfs_bmap_util.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index da67c52d5f94..2775bb32489e 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -896,8 +896,8 @@ xfs_prepare_shift( > struct xfs_inode *ip, > loff_t offset) > { > - struct xfs_mount *mp = ip->i_mount; > int error; > + unsigned int rounding; > > /* > * Trim eofblocks to avoid shifting uninitialized post-eof preallocation > @@ -914,11 +914,13 @@ xfs_prepare_shift( > * with the full range of the operation. If we don't, a COW writeback > * completion could race with an insert, front merge with the start > * extent (after split) during the shift and corrupt the file. Start > - * with the block just prior to the start to stabilize the boundary. > + * with the aligned block just prior to the start to stabilize the "...with the allocation unit just prior to the start..." > + * boundary. > */ > - offset = round_down(offset, mp->m_sb.sb_blocksize); > + rounding = xfs_inode_alloc_unitsize(ip); > + offset = round_down(offset, rounding); Again, round_down requires the divisor to be a power of two. --D > if (offset) > - offset -= mp->m_sb.sb_blocksize; > + offset -= rounding; > > /* > * Writeback and invalidate cache for the remainder of the file as we're > -- > 2.31.1 > >