On Fri, Feb 23, 2024 at 08:15:04AM +0100, Christoph Hellwig wrote: > Add a check for files on the RT subvolume and use m_frextents instead > of m_fdblocks to adjust the preallocation size. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Looks good, Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/xfs/xfs_iomap.c | 42 ++++++++++++++++++++++++++++++------------ > 1 file changed, 30 insertions(+), 12 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 18c8f168b1532d..e6abe56d1f1f23 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -27,6 +27,7 @@ > #include "xfs_dquot_item.h" > #include "xfs_dquot.h" > #include "xfs_reflink.h" > +#include "xfs_rtbitmap.h" > > #define XFS_ALLOC_ALIGN(mp, off) \ > (((off) >> mp->m_allocsize_log) << mp->m_allocsize_log) > @@ -398,6 +399,29 @@ xfs_quota_calc_throttle( > } > } > > +static int64_t > +xfs_iomap_freesp( > + struct percpu_counter *counter, > + uint64_t low_space[XFS_LOWSP_MAX], > + int *shift) > +{ > + int64_t freesp; > + > + freesp = percpu_counter_read_positive(counter); > + if (freesp < low_space[XFS_LOWSP_5_PCNT]) { > + *shift = 2; > + if (freesp < low_space[XFS_LOWSP_4_PCNT]) > + (*shift)++; > + if (freesp < low_space[XFS_LOWSP_3_PCNT]) > + (*shift)++; > + if (freesp < low_space[XFS_LOWSP_2_PCNT]) > + (*shift)++; > + if (freesp < low_space[XFS_LOWSP_1_PCNT]) > + (*shift)++; > + } > + return freesp; > +} > + > /* > * If we don't have a user specified preallocation size, dynamically increase > * the preallocation size as the size of the file grows. Cap the maximum size > @@ -480,18 +504,12 @@ xfs_iomap_prealloc_size( > alloc_blocks = XFS_FILEOFF_MIN(roundup_pow_of_two(XFS_MAX_BMBT_EXTLEN), > alloc_blocks); > > - freesp = percpu_counter_read_positive(&mp->m_fdblocks); > - if (freesp < mp->m_low_space[XFS_LOWSP_5_PCNT]) { > - shift = 2; > - if (freesp < mp->m_low_space[XFS_LOWSP_4_PCNT]) > - shift++; > - if (freesp < mp->m_low_space[XFS_LOWSP_3_PCNT]) > - shift++; > - if (freesp < mp->m_low_space[XFS_LOWSP_2_PCNT]) > - shift++; > - if (freesp < mp->m_low_space[XFS_LOWSP_1_PCNT]) > - shift++; > - } > + if (unlikely(XFS_IS_REALTIME_INODE(ip))) > + freesp = xfs_rtx_to_rtb(mp, xfs_iomap_freesp(&mp->m_frextents, > + mp->m_low_rtexts, &shift)); > + else > + freesp = xfs_iomap_freesp(&mp->m_fdblocks, mp->m_low_space, > + &shift); > > /* > * Check each quota to cap the prealloc size, provide a shift value to > -- > 2.39.2 > >