]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: refactor aligning bestlen to prod
authorDarrick J. Wong <djwong@kernel.org>
Fri, 30 Aug 2024 22:37:04 +0000 (15:37 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Sun, 1 Sep 2024 15:58:19 +0000 (08:58 -0700)
There are two places in xfs_rtalloc.c where we want to make sure that a
count of rt extents is aligned with a particular prod(uct) factor.  In
one spot, we actually use rounddown(), albeit unnecessarily if prod < 2.
In the other case, we open-code this rounding inefficiently by promoting
the 32-bit length value to a 64-bit value and then performing a 64-bit
division to figure out the subtraction.

Refactor this into a single helper that uses the correct types and
division method for the type, and skips the division entirely unless
prod is large enough to make a difference.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_rtalloc.c

index 58081ce5247b55f9f09d7ace2ae0f7c9a31a3b52..11c58f12bcb200644cdb732f3a3d75d19123e8e5 100644 (file)
@@ -194,6 +194,17 @@ xfs_rtallocate_range(
        return xfs_rtmodify_range(args, start, len, 0);
 }
 
+/* Reduce @rtxlen until it is a multiple of @prod. */
+static inline xfs_rtxlen_t
+xfs_rtalloc_align_len(
+       xfs_rtxlen_t    rtxlen,
+       xfs_rtxlen_t    prod)
+{
+       if (unlikely(prod > 1))
+               return rounddown(rtxlen, prod);
+       return rtxlen;
+}
+
 /*
  * Make sure we don't run off the end of the rt volume.  Be careful that
  * adjusting maxlen downwards doesn't cause us to fail the alignment checks.
@@ -208,7 +219,7 @@ xfs_rtallocate_clamp_len(
        xfs_rtxlen_t            ret;
 
        ret = min(mp->m_sb.sb_rextents, startrtx + rtxlen) - startrtx;
-       return rounddown(ret, prod);
+       return xfs_rtalloc_align_len(ret, prod);
 }
 
 /*
@@ -292,17 +303,10 @@ xfs_rtallocate_extent_block(
                goto nospace;
 
        /*
-        * If size should be a multiple of prod, make that so.
+        * Ensure bestlen is a multiple of prod, but don't return a too-short
+        * extent.
         */
-       if (prod > 1) {
-               xfs_rtxlen_t    p;      /* amount to trim length by */
-
-               div_u64_rem(bestlen, prod, &p);
-               if (p)
-                       bestlen -= p;
-       }
-
-       /* Don't return a too-short extent. */
+       bestlen = xfs_rtalloc_align_len(bestlen, prod);
        if (bestlen < minlen)
                goto nospace;