]> git.itanic.dy.fi Git - linux-stable/commitdiff
xfs: reflow the tail end of xfs_bmap_rtalloc
authorChristoph Hellwig <hch@lst.de>
Mon, 18 Dec 2023 04:57:23 +0000 (05:57 +0100)
committerChandan Babu R <chandanbabu@kernel.org>
Fri, 22 Dec 2023 05:48:11 +0000 (11:18 +0530)
Reorder the tail end of xfs_bmap_rtalloc so that the successfully
allocation is in the main path, and the error handling is on a branch.

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 a810482339ada6b09dc13271e9738c54ed7cfdb2..92ff05ce33c71387113f44bcf80af742a1bc0e78 100644 (file)
@@ -1484,39 +1484,39 @@ xfs_bmap_rtalloc(
        raminlen = max_t(xfs_rtxlen_t, 1, xfs_extlen_to_rtxlen(mp, minlen));
        error = xfs_rtallocate_extent(ap->tp, rtx, raminlen, ralen, &ralen,
                        ap->wasdel, prod, &rtx);
-       if (!error) {
-               ap->blkno = xfs_rtx_to_rtb(mp, rtx);
-               ap->length = xfs_rtxlen_to_extlen(mp, ralen);
-               xfs_bmap_alloc_account(ap);
-               return 0;
-       }
-
-       if (error != -ENOSPC)
-               return error;
+       if (error == -ENOSPC) {
+               if (align > mp->m_sb.sb_rextsize) {
+                       /*
+                        * We previously enlarged the request length to try to
+                        * satisfy an extent size hint.  The allocator didn't
+                        * return anything, so reset the parameters to the
+                        * original values and try again without alignment
+                        * criteria.
+                        */
+                       ap->offset = orig_offset;
+                       ap->length = orig_length;
+                       minlen = align = mp->m_sb.sb_rextsize;
+                       goto retry;
+               }
 
-       if (align > mp->m_sb.sb_rextsize) {
-               /*
-                * We previously enlarged the request length to try to satisfy
-                * an extent size hint.  The allocator didn't return anything,
-                * so reset the parameters to the original values and try again
-                * without alignment criteria.
-                */
-               ap->offset = orig_offset;
-               ap->length = orig_length;
-               minlen = align = mp->m_sb.sb_rextsize;
-               goto retry;
-       }
+               if (!ignore_locality && ap->blkno != 0) {
+                       /*
+                        * If we can't allocate near a specific rt extent, try
+                        * again without locality criteria.
+                        */
+                       ignore_locality = true;
+                       goto retry;
+               }
 
-       if (!ignore_locality && ap->blkno != 0) {
-               /*
-                * If we can't allocate near a specific rt extent, try again
-                * without locality criteria.
-                */
-               ignore_locality = true;
-               goto retry;
+               ap->blkno = NULLFSBLOCK;
+               ap->length = 0;
+               return 0;
        }
+       if (error)
+               return error;
 
-       ap->blkno = NULLFSBLOCK;
-       ap->length = 0;
+       ap->blkno = xfs_rtx_to_rtb(mp, rtx);
+       ap->length = xfs_rtxlen_to_extlen(mp, ralen);
+       xfs_bmap_alloc_account(ap);
        return 0;
 }