xfs: look at m_frextents in xfs_iomap_prealloc_size for RT allocations
authorChristoph Hellwig <hch@lst.de>
Mon, 22 Apr 2024 11:20:16 +0000 (13:20 +0200)
committerChandan Babu R <chandanbabu@kernel.org>
Mon, 22 Apr 2024 12:30:49 +0000 (18:00 +0530)
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>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
fs/xfs/xfs_iomap.c

index 4087af7f3c9f3f39bf9ab078e2b7946cfe4a7187..bba5a0d87d03867e1455f0c045750384ccaf15de 100644 (file)
@@ -28,6 +28,7 @@
 #include "xfs_dquot.h"
 #include "xfs_reflink.h"
 #include "xfs_health.h"
+#include "xfs_rtbitmap.h"
 
 #define XFS_ALLOC_ALIGN(mp, off) \
        (((off) >> mp->m_allocsize_log) << mp->m_allocsize_log)
@@ -404,6 +405,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
@@ -486,18 +510,13 @@ 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