]> git.itanic.dy.fi Git - linux-stable/commitdiff
xfs: reorder the minlen and prod calculations in xfs_bmap_rtalloc
authorChristoph Hellwig <hch@lst.de>
Mon, 18 Dec 2023 04:57:35 +0000 (05:57 +0100)
committerChandan Babu R <chandanbabu@kernel.org>
Fri, 22 Dec 2023 05:48:15 +0000 (11:18 +0530)
xfs_bmap_rtalloc is a bit of a mess in terms of calculating the locally
need variables.  Reorder them a bit so that related code is located
next to each other - the raminlen calculation moves up next to where
the maximum len is calculated, and all the prod calculation is move
into a single place and rearranged so that the real prod calculation
only happens when it actually is needed.

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

index 4b8fc8e510ac85689a2058577db569742a23e494..ff2d7b237ef6493358c5d2fead6051045d50af4b 100644 (file)
@@ -1375,7 +1375,6 @@ xfs_bmap_rtalloc(
 
        align = xfs_get_extsz_hint(ap->ip);
 retry:
-       prod = xfs_extlen_to_rtxlen(mp, align);
        error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev,
                                        align, 1, ap->eof, 0,
                                        ap->conv, &ap->offset, &ap->length);
@@ -1393,13 +1392,6 @@ xfs_bmap_rtalloc(
        if (ap->offset != orig_offset)
                minlen += orig_offset - ap->offset;
 
-       /*
-        * If the offset & length are not perfectly aligned
-        * then kill prod, it will just get us in trouble.
-        */
-       div_u64_rem(ap->offset, align, &mod);
-       if (mod || ap->length % align)
-               prod = 1;
        /*
         * Set ralen to be the actual requested length in rtextents.
         *
@@ -1410,6 +1402,7 @@ xfs_bmap_rtalloc(
         * adjust the starting point to match it.
         */
        ralen = xfs_extlen_to_rtxlen(mp, min(ap->length, XFS_MAX_BMBT_EXTLEN));
+       raminlen = max_t(xfs_rtxlen_t, 1, xfs_extlen_to_rtxlen(mp, minlen));
 
        /*
         * Lock out modifications to both the RT bitmap and summary inodes
@@ -1438,7 +1431,16 @@ xfs_bmap_rtalloc(
                start = 0;
        }
 
-       raminlen = max_t(xfs_rtxlen_t, 1, xfs_extlen_to_rtxlen(mp, minlen));
+       /*
+        * Only bother calculating a real prod factor if offset & length are
+        * perfectly aligned, otherwise it will just get us in trouble.
+        */
+       div_u64_rem(ap->offset, align, &mod);
+       if (mod || ap->length % align)
+               prod = 1;
+       else
+               prod = xfs_extlen_to_rtxlen(mp, align);
+
        error = xfs_rtallocate_extent(ap->tp, start, raminlen, ralen, &ralen,
                        ap->wasdel, prod, &rtx);
        if (error == -ENOSPC) {