]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: pass per-ag references to xfs_free_extent
authorDarrick J. Wong <djwong@kernel.org>
Wed, 12 Apr 2023 01:59:53 +0000 (18:59 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 12 Apr 2023 01:59:53 +0000 (18:59 -0700)
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>
fs/xfs/libxfs/xfs_ag.c
fs/xfs/libxfs/xfs_alloc.c
fs/xfs/libxfs/xfs_alloc.h
fs/xfs/libxfs/xfs_ialloc_btree.c
fs/xfs/libxfs/xfs_refcount_btree.c
fs/xfs/scrub/repair.c
fs/xfs/xfs_extfree_item.c

index 86696a1c6891b779340afcc1a0bb53ac910459e1..ae45f546ed86fdadf16d363b6315813a52284fd7 100644 (file)
@@ -1043,10 +1043,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 203f16c48c19902e607b77250d41114d67205b97..ea9ac2ad9d3660bba7971b7f927959741e30914f 100644 (file)
@@ -3596,7 +3596,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,
@@ -3604,12 +3605,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);
@@ -3618,10 +3616,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)) {
@@ -3635,20 +3632,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 9b28211d5a4c56f5f10cdc0b9d3bc888474d9f03..1d2af50ac95b01d9637ee272cf890b717401935f 100644 (file)
@@ -156,9 +156,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 f3b860970b260839365c875e1c7390f4ea7e8b1a..749e837de98d5ee8695f1ee028b89ad41b86f13f 100644 (file)
@@ -112,8 +112,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 1b71174ec0d6d41e6e4d5a93e6fe31a6f3e5385c..e12058a5f22e075bcac9befd6749b96cfbbe3193 100644 (file)
@@ -598,7 +598,8 @@ xrep_reap_block(
        else if (resv == XFS_AG_RESV_AGFL)
                error = xrep_put_freelist(sc, agbno);
        else
-               error = xfs_free_extent(sc->tp, fsbno, 1, oinfo, resv);
+               error = xfs_free_extent(sc->tp, sc->sa.pag, agbno, 1, oinfo,
+                               resv);
        if (agf_bp != sc->sa.agf_bp)
                xfs_trans_brelse(sc->tp, agf_bp);
        if (error)
index 011b50469301da6bc12053aab4e8e01bae037053..c1aae07467c9cbca6a04f167587142832bc87078 100644 (file)
@@ -350,6 +350,7 @@ xfs_trans_free_extent(
        struct xfs_owner_info           oinfo = { };
        struct xfs_mount                *mp = tp->t_mountp;
        struct xfs_extent               *extp;
+       struct xfs_perag                *pag;
        uint                            next_extent;
        xfs_agnumber_t                  agno = XFS_FSB_TO_AGNO(mp,
                                                        xefi->xefi_startblock);
@@ -366,9 +367,12 @@ xfs_trans_free_extent(
        trace_xfs_bmap_free_deferred(tp->t_mountp, agno, 0, agbno,
                        xefi->xefi_blockcount);
 
-       error = __xfs_free_extent(tp, xefi->xefi_startblock,
-                       xefi->xefi_blockcount, &oinfo, XFS_AG_RESV_NONE,
+       pag = xfs_perag_get(mp, agno);
+       error = __xfs_free_extent(tp, pag, agbno, xefi->xefi_blockcount,
+                       &oinfo, XFS_AG_RESV_NONE,
                        xefi->xefi_flags & XFS_EFI_SKIP_DISCARD);
+       xfs_perag_put(pag);
+
        /*
         * Mark the transaction dirty, even on error. This ensures the
         * transaction is aborted, which: