xfs: call xfs_bmap_exact_minlen_extent_alloc from xfs_bmap_btalloc
authorChristoph Hellwig <hch@lst.de>
Wed, 18 Sep 2024 05:30:09 +0000 (07:30 +0200)
committerCarlos Maiolino <cem@kernel.org>
Mon, 7 Oct 2024 06:00:11 +0000 (08:00 +0200)
xfs_bmap_exact_minlen_extent_alloc duplicates the args setup in
xfs_bmap_btalloc.  Switch to call it from xfs_bmap_btalloc after
doing the basic setup.

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

index 5263b66..756faae 100644 (file)
@@ -3479,28 +3479,17 @@ xfs_bmap_process_allocated_extent(
 
 static int
 xfs_bmap_exact_minlen_extent_alloc(
-       struct xfs_bmalloca     *ap)
+       struct xfs_bmalloca     *ap,
+       struct xfs_alloc_arg    *args)
 {
-       struct xfs_mount        *mp = ap->ip->i_mount;
-       struct xfs_alloc_arg    args = { .tp = ap->tp, .mp = mp };
-       xfs_fileoff_t           orig_offset;
-       xfs_extlen_t            orig_length;
-       int                     error;
-
-       ASSERT(ap->length);
-
        if (ap->minlen != 1) {
-               ap->blkno = NULLFSBLOCK;
-               ap->length = 0;
+               args->fsbno = NULLFSBLOCK;
                return 0;
        }
 
-       orig_offset = ap->offset;
-       orig_length = ap->length;
-
-       args.alloc_minlen_only = 1;
-
-       xfs_bmap_compute_alignments(ap, &args);
+       args->alloc_minlen_only = 1;
+       args->minlen = args->maxlen = ap->minlen;
+       args->total = ap->total;
 
        /*
         * Unlike the longest extent available in an AG, we don't track
@@ -3510,33 +3499,9 @@ xfs_bmap_exact_minlen_extent_alloc(
         * we need not be concerned about a drop in performance in
         * "debug only" code paths.
         */
-       ap->blkno = XFS_AGB_TO_FSB(mp, 0, 0);
+       ap->blkno = XFS_AGB_TO_FSB(ap->ip->i_mount, 0, 0);
 
-       args.oinfo = XFS_RMAP_OINFO_SKIP_UPDATE;
-       args.minlen = args.maxlen = ap->minlen;
-       args.total = ap->total;
-
-       args.alignment = 1;
-       args.minalignslop = 0;
-
-       args.minleft = ap->minleft;
-       args.wasdel = ap->wasdel;
-       args.resv = XFS_AG_RESV_NONE;
-       args.datatype = ap->datatype;
-
-       error = xfs_alloc_vextent_first_ag(&args, ap->blkno);
-       if (error)
-               return error;
-
-       if (args.fsbno != NULLFSBLOCK) {
-               xfs_bmap_process_allocated_extent(ap, &args, orig_offset,
-                       orig_length);
-       } else {
-               ap->blkno = NULLFSBLOCK;
-               ap->length = 0;
-       }
-
-       return 0;
+       return xfs_alloc_vextent_first_ag(args, ap->blkno);
 }
 
 /*
@@ -3795,8 +3760,11 @@ xfs_bmap_btalloc(
        /* Trim the allocation back to the maximum an AG can fit. */
        args.maxlen = min(ap->length, mp->m_ag_max_usable);
 
-       if ((ap->datatype & XFS_ALLOC_USERDATA) &&
-           xfs_inode_is_filestream(ap->ip))
+       if (unlikely(XFS_TEST_ERROR(false, mp,
+                       XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT)))
+               error = xfs_bmap_exact_minlen_extent_alloc(ap, &args);
+       else if ((ap->datatype & XFS_ALLOC_USERDATA) &&
+                       xfs_inode_is_filestream(ap->ip))
                error = xfs_bmap_btalloc_filestreams(ap, &args, stripe_align);
        else
                error = xfs_bmap_btalloc_best_length(ap, &args, stripe_align);
@@ -4211,9 +4179,6 @@ xfs_bmapi_allocate(
        if ((bma->datatype & XFS_ALLOC_USERDATA) &&
            XFS_IS_REALTIME_INODE(bma->ip))
                error = xfs_bmap_rtalloc(bma);
-       else if (unlikely(XFS_TEST_ERROR(false, mp,
-                       XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT)))
-               error = xfs_bmap_exact_minlen_extent_alloc(bma);
        else
                error = xfs_bmap_btalloc(bma);
        if (error)