diff mbox series

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

Message ID 20240223071506.3968029-9-hch@lst.de (mailing list archive)
State Superseded, archived
Headers show
Series [01/10] xfs: make XFS_TRANS_LOWMODE match the other XFS_TRANS_ definitions | expand

Commit Message

Christoph Hellwig Feb. 23, 2024, 7:15 a.m. UTC
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@lst.de>
---
 fs/xfs/xfs_iomap.c | 42 ++++++++++++++++++++++++++++++------------
 1 file changed, 30 insertions(+), 12 deletions(-)

Comments

Darrick J. Wong Feb. 23, 2024, 5:21 p.m. UTC | #1
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@lst.de>

Looks good,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--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
> 
>
diff mbox series

Patch

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