]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: pass per-ag references to xfs_free_extent
authorDarrick J. Wong <djwong@kernel.org>
Fri, 26 May 2023 13:38:11 +0000 (15:38 +0200)
committerCarlos Maiolino <cem@kernel.org>
Fri, 9 Jun 2023 08:27:50 +0000 (10:27 +0200)
Source kernel commit: b2ccab3199aa7cea9154d80ea2585312c5f6eba0

Pass a reference to the per-AG structure to xfs_free_extent.  Most
callers already have one, so we can eliminate unnecessary lookups.  The
one exception to this is the EFI code, which the next patch will fix.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
libxfs/defer_item.c
libxfs/xfs_ag.c
libxfs/xfs_alloc.c
libxfs/xfs_alloc.h
libxfs/xfs_ialloc_btree.c
libxfs/xfs_refcount_btree.c
repair/phase5.c

index 3dbcf11634eb19a80da6761a96768d494c728489..2ce3b1cc8af7d0de32c766399405c678606634e7 100644 (file)
@@ -81,6 +81,9 @@ xfs_extent_free_finish_item(
 {
        struct xfs_owner_info           oinfo = { };
        struct xfs_extent_free_item     *xefi;
+       struct xfs_perag                *pag;
+       xfs_agnumber_t                  agno;
+       xfs_agblock_t                   agbno;
        int                             error;
 
        xefi = container_of(item, struct xfs_extent_free_item, xefi_list);
@@ -89,8 +92,14 @@ xfs_extent_free_finish_item(
                oinfo.oi_flags |= XFS_OWNER_INFO_ATTR_FORK;
        if (xefi->xefi_flags & XFS_EFI_BMBT_BLOCK)
                oinfo.oi_flags |= XFS_OWNER_INFO_BMBT_BLOCK;
-       error = xfs_free_extent(tp, xefi->xefi_startblock,
-               xefi->xefi_blockcount, &oinfo, XFS_AG_RESV_NONE);
+
+       agno = XFS_FSB_TO_AGNO(tp->t_mountp, xefi->xefi_startblock);
+       agbno = XFS_FSB_TO_AGBNO(tp->t_mountp, xefi->xefi_startblock);
+       pag = xfs_perag_get(tp->t_mountp, agno);
+       error = xfs_free_extent(tp, pag, agbno, xefi->xefi_blockcount, &oinfo,
+                       XFS_AG_RESV_NONE);
+       xfs_perag_put(pag);
+
        kmem_cache_free(xfs_extfree_item_cache, xefi);
        return error;
 }
index 224ee005ca8fa1a226b4077e765f353a133acf8e..e7801a67e4c9fc4f3560fce42ba995315d1d4268 100644 (file)
@@ -1041,10 +1041,8 @@ xfs_ag_extend_space(
        if (error)
                return error;
 
-       error = xfs_free_extent(tp, XFS_AGB_TO_FSB(pag->pag_mount, pag->pag_agno,
-                                       be32_to_cpu(agf->agf_length) - len),
-                               len, &XFS_RMAP_OINFO_SKIP_UPDATE,
-                               XFS_AG_RESV_NONE);
+       error = xfs_free_extent(tp, pag, be32_to_cpu(agf->agf_length) - len,
+                       len, &XFS_RMAP_OINFO_SKIP_UPDATE, XFS_AG_RESV_NONE);
        if (error)
                return error;
 
index 61dad140c5a4fc4202a1093eda2793c740c23896..e8eaa92ae9a36ba3add7ced4d1360d2aacf32040 100644 (file)
@@ -3592,7 +3592,8 @@ xfs_free_extent_fix_freelist(
 int
 __xfs_free_extent(
        struct xfs_trans                *tp,
-       xfs_fsblock_t                   bno,
+       struct xfs_perag                *pag,
+       xfs_agblock_t                   agbno,
        xfs_extlen_t                    len,
        const struct xfs_owner_info     *oinfo,
        enum xfs_ag_resv_type           type,
@@ -3600,12 +3601,9 @@ __xfs_free_extent(
 {
        struct xfs_mount                *mp = tp->t_mountp;
        struct xfs_buf                  *agbp;
-       xfs_agnumber_t                  agno = XFS_FSB_TO_AGNO(mp, bno);
-       xfs_agblock_t                   agbno = XFS_FSB_TO_AGBNO(mp, bno);
        struct xfs_agf                  *agf;
        int                             error;
        unsigned int                    busy_flags = 0;
-       struct xfs_perag                *pag;
 
        ASSERT(len != 0);
        ASSERT(type != XFS_AG_RESV_AGFL);
@@ -3614,10 +3612,9 @@ __xfs_free_extent(
                        XFS_ERRTAG_FREE_EXTENT))
                return -EIO;
 
-       pag = xfs_perag_get(mp, agno);
        error = xfs_free_extent_fix_freelist(tp, pag, &agbp);
        if (error)
-               goto err;
+               return error;
        agf = agbp->b_addr;
 
        if (XFS_IS_CORRUPT(mp, agbno >= mp->m_sb.sb_agblocks)) {
@@ -3631,20 +3628,18 @@ __xfs_free_extent(
                goto err_release;
        }
 
-       error = xfs_free_ag_extent(tp, agbp, agno, agbno, len, oinfo, type);
+       error = xfs_free_ag_extent(tp, agbp, pag->pag_agno, agbno, len, oinfo,
+                       type);
        if (error)
                goto err_release;
 
        if (skip_discard)
                busy_flags |= XFS_EXTENT_BUSY_SKIP_DISCARD;
        xfs_extent_busy_insert(tp, pag, agbno, len, busy_flags);
-       xfs_perag_put(pag);
        return 0;
 
 err_release:
        xfs_trans_brelse(tp, agbp);
-err:
-       xfs_perag_put(pag);
        return error;
 }
 
index 2b246d74c18901051e3ae97c84e18ab3674ed1c4..e12d86e3aeeca1f8f87534061e860ed276b9e531 100644 (file)
@@ -141,7 +141,8 @@ int xfs_alloc_vextent_first_ag(struct xfs_alloc_arg *args,
 int                            /* error */
 __xfs_free_extent(
        struct xfs_trans        *tp,    /* transaction pointer */
-       xfs_fsblock_t           bno,    /* starting block number of extent */
+       struct xfs_perag        *pag,
+       xfs_agblock_t           agbno,
        xfs_extlen_t            len,    /* length of extent */
        const struct xfs_owner_info     *oinfo, /* extent owner */
        enum xfs_ag_resv_type   type,   /* block reservation type */
@@ -150,12 +151,13 @@ __xfs_free_extent(
 static inline int
 xfs_free_extent(
        struct xfs_trans        *tp,
-       xfs_fsblock_t           bno,
+       struct xfs_perag        *pag,
+       xfs_agblock_t           agbno,
        xfs_extlen_t            len,
        const struct xfs_owner_info     *oinfo,
        enum xfs_ag_resv_type   type)
 {
-       return __xfs_free_extent(tp, bno, len, oinfo, type, false);
+       return __xfs_free_extent(tp, pag, agbno, len, oinfo, type, false);
 }
 
 int                            /* error */
index 2f3d1e8d043d2001f585e2fea8235e375d076ade..3865a74621caa0d6995ac211d175f1aa869184b7 100644 (file)
@@ -155,9 +155,12 @@ __xfs_inobt_free_block(
        struct xfs_buf          *bp,
        enum xfs_ag_resv_type   resv)
 {
+       xfs_fsblock_t           fsbno;
+
        xfs_inobt_mod_blockcount(cur, -1);
-       return xfs_free_extent(cur->bc_tp,
-                       XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp)), 1,
+       fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp));
+       return xfs_free_extent(cur->bc_tp, cur->bc_ag.pag,
+                       XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1,
                        &XFS_RMAP_OINFO_INOBT, resv);
 }
 
index 2fbf2e2a72f3600fb9a449e9e22f70490bc7ffb6..eb56e07db7f2a155ae00c5974ab03d1d9d86a3a8 100644 (file)
@@ -111,8 +111,9 @@ xfs_refcountbt_free_block(
                        XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1);
        be32_add_cpu(&agf->agf_refcount_blocks, -1);
        xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS);
-       error = xfs_free_extent(cur->bc_tp, fsbno, 1, &XFS_RMAP_OINFO_REFC,
-                       XFS_AG_RESV_METADATA);
+       error = xfs_free_extent(cur->bc_tp, cur->bc_ag.pag,
+                       XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1,
+                       &XFS_RMAP_OINFO_REFC, XFS_AG_RESV_METADATA);
        if (error)
                return error;
 
index 0d14c354ff33cae772c5afe1c072b0ac0c17bf13..d6b8168ea776fc4a564bc638a28067262698a22f 100644 (file)
@@ -598,14 +598,22 @@ inject_lost_extent(
 {
        struct xfs_mount        *mp = arg;
        struct xfs_trans        *tp;
+       struct xfs_perag        *pag;
+       xfs_agnumber_t          agno;
+       xfs_agblock_t           agbno;
        int                     error;
 
        error = -libxfs_trans_alloc_rollable(mp, 16, &tp);
        if (error)
                return error;
 
-       error = -libxfs_free_extent(tp, start, length,
+       agno = XFS_FSB_TO_AGNO(mp, start);
+       agbno = XFS_FSB_TO_AGBNO(mp, start);
+       pag = libxfs_perag_get(mp, agno);
+       error = -libxfs_free_extent(tp, pag, agbno, length,
                        &XFS_RMAP_OINFO_ANY_OWNER, XFS_AG_RESV_NONE);
+       libxfs_perag_put(pag);
+
        if (error)
                return error;