]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: clean up xfs_rtallocate_extent_exact a bit
authorDarrick J. Wong <djwong@kernel.org>
Fri, 28 Jun 2024 16:40:47 +0000 (09:40 -0700)
committerChristoph Hellwig <hch@lst.de>
Mon, 5 Aug 2024 18:50:01 +0000 (11:50 -0700)
Before we start doing more surgery on the rt allocator, let's clean up
the exact allocator so that it doesn't change its arguments and uses the
helper introduced in the previous patch.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/xfs_rtalloc.c

index ba02229e55cb745bedb326f968d949452782eb55..a5b997a306432a8d4623330a7f6e1c0f2906e44d 100644 (file)
@@ -340,10 +340,10 @@ xfs_rtallocate_extent_exact(
        xfs_rtxlen_t            prod,   /* extent product factor */
        xfs_rtxnum_t            *rtx)   /* out: start rtext allocated */
 {
-       int                     error;
-       xfs_rtxlen_t            i;      /* extent length trimmed due to prod */
-       int                     isfree; /* extent is free */
        xfs_rtxnum_t            next;   /* next rtext to try (dummy) */
+       xfs_rtxlen_t            alloclen; /* candidate length */
+       int                     isfree; /* extent is free */
+       int                     error;
 
        ASSERT(minlen % prod == 0);
        ASSERT(maxlen % prod == 0);
@@ -354,25 +354,26 @@ xfs_rtallocate_extent_exact(
        if (error)
                return error;
 
-       if (!isfree) {
-               /*
-                * If not, allocate what there is, if it's at least minlen.
-                */
-               maxlen = next - start;
-               if (maxlen < minlen)
-                       return -ENOSPC;
-
-               /*
-                * Trim off tail of extent, if prod is specified.
-                */
-               if (prod > 1 && (i = maxlen % prod)) {
-                       maxlen -= i;
-                       if (maxlen < minlen)
-                               return -ENOSPC;
-               }
+       if (isfree) {
+               /* start to maxlen is all free; allocate it. */
+               *len = maxlen;
+               *rtx = start;
+               return 0;
        }
 
-       *len = maxlen;
+       /*
+        * If not, allocate what there is, if it's at least minlen.
+        */
+       alloclen = next - start;
+       if (alloclen < minlen)
+               return -ENOSPC;
+
+       /* Ensure alloclen is a multiple of prod. */
+       alloclen = xfs_rtalloc_align_len(alloclen, prod);
+       if (alloclen < minlen)
+               return -ENOSPC;
+
+       *len = alloclen;
        *rtx = start;
        return 0;
 }