Re: [PATCH 08/10] xfs: look at m_frextents in xfs_iomap_prealloc_size for RT allocations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 
> 




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux