xfs: pass perag to xfs_ialloc_read_agi()
authorDave Chinner <dchinner@redhat.com>
Thu, 7 Jul 2022 09:07:24 +0000 (19:07 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 7 Jul 2022 09:07:24 +0000 (19:07 +1000)
xfs_ialloc_read_agi() initialises the perag if it hasn't been done
yet, so it makes sense to pass it the perag rather than pull a
reference from the buffer. This allows callers to be per-ag centric
rather than passing mount/agno pairs everywhere.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_ag.c
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/libxfs/xfs_ialloc.h
fs/xfs/libxfs/xfs_ialloc_btree.c
fs/xfs/scrub/common.c
fs/xfs/scrub/fscounters.c
fs/xfs/scrub/repair.c

index c203dc883f5d53c9961f7f913d320f67021fd898..a16c985940d35efd1f15b7ff4bbd2e378c0c3d50 100644 (file)
@@ -128,11 +128,13 @@ xfs_initialize_perag_data(
                if (error)
                        return error;
 
-               error = xfs_ialloc_read_agi(mp, NULL, index, NULL);
-               if (error)
+               pag = xfs_perag_get(mp, index);
+               error = xfs_ialloc_read_agi(pag, NULL, NULL);
+               if (error) {
+                       xfs_perag_put(pag);
                        return error;
+               }
 
-               pag = xfs_perag_get(mp, index);
                ifree += pag->pagi_freecount;
                ialloc += pag->pagi_count;
                bfree += pag->pagf_freeblks;
@@ -784,7 +786,7 @@ xfs_ag_shrink_space(
        int                     error, err2;
 
        ASSERT(pag->pag_agno == mp->m_sb.sb_agcount - 1);
-       error = xfs_ialloc_read_agi(mp, *tpp, pag->pag_agno, &agibp);
+       error = xfs_ialloc_read_agi(pag, *tpp, &agibp);
        if (error)
                return error;
 
@@ -817,7 +819,7 @@ xfs_ag_shrink_space(
         * Disable perag reservations so it doesn't cause the allocation request
         * to fail. We'll reestablish reservation before we return.
         */
-       error = xfs_ag_resv_free(agibp->b_pag);
+       error = xfs_ag_resv_free(pag);
        if (error)
                return error;
 
@@ -846,7 +848,7 @@ xfs_ag_shrink_space(
        be32_add_cpu(&agi->agi_length, -delta);
        be32_add_cpu(&agf->agf_length, -delta);
 
-       err2 = xfs_ag_resv_init(agibp->b_pag, *tpp);
+       err2 = xfs_ag_resv_init(pag, *tpp);
        if (err2) {
                be32_add_cpu(&agi->agi_length, delta);
                be32_add_cpu(&agf->agf_length, delta);
@@ -870,8 +872,9 @@ xfs_ag_shrink_space(
        xfs_ialloc_log_agi(*tpp, agibp, XFS_AGI_LENGTH);
        xfs_alloc_log_agf(*tpp, agfbp, XFS_AGF_LENGTH);
        return 0;
+
 resv_init_out:
-       err2 = xfs_ag_resv_init(agibp->b_pag, *tpp);
+       err2 = xfs_ag_resv_init(pag, *tpp);
        if (!err2)
                return error;
 resv_err:
@@ -896,7 +899,7 @@ xfs_ag_extend_space(
 
        ASSERT(pag->pag_agno == pag->pag_mount->m_sb.sb_agcount - 1);
 
-       error = xfs_ialloc_read_agi(pag->pag_mount, tp, pag->pag_agno, &bp);
+       error = xfs_ialloc_read_agi(pag, tp, &bp);
        if (error)
                return error;
 
@@ -947,8 +950,7 @@ xfs_ag_get_geometry(
        int                     error;
 
        /* Lock the AG headers. */
-       error = xfs_ialloc_read_agi(pag->pag_mount, NULL, pag->pag_agno,
-                       &agi_bp);
+       error = xfs_ialloc_read_agi(pag, NULL, &agi_bp);
        if (error)
                return error;
        error = xfs_alloc_read_agf(pag->pag_mount, NULL, pag->pag_agno, 0,
index cefac2a1ba0c66288622dde6037b7a9f8c14e92a..a7259404377dee866cf289f1a412df5a272e3f7e 100644 (file)
@@ -1610,7 +1610,7 @@ xfs_dialloc_good_ag(
                return false;
 
        if (!pag->pagi_init) {
-               error = xfs_ialloc_read_agi(mp, tp, pag->pag_agno, NULL);
+               error = xfs_ialloc_read_agi(pag, tp, NULL);
                if (error)
                        return false;
        }
@@ -1679,7 +1679,7 @@ xfs_dialloc_try_ag(
         * Then read in the AGI buffer and recheck with the AGI buffer
         * lock held.
         */
-       error = xfs_ialloc_read_agi(pag->pag_mount, *tpp, pag->pag_agno, &agbp);
+       error = xfs_ialloc_read_agi(pag, *tpp, &agbp);
        if (error)
                return error;
 
@@ -2169,7 +2169,7 @@ xfs_difree(
        /*
         * Get the allocation group header.
         */
-       error = xfs_ialloc_read_agi(mp, tp, pag->pag_agno, &agbp);
+       error = xfs_ialloc_read_agi(pag, tp, &agbp);
        if (error) {
                xfs_warn(mp, "%s: xfs_ialloc_read_agi() returned error %d.",
                        __func__, error);
@@ -2215,7 +2215,7 @@ xfs_imap_lookup(
        int                     error;
        int                     i;
 
-       error = xfs_ialloc_read_agi(mp, tp, pag->pag_agno, &agbp);
+       error = xfs_ialloc_read_agi(pag, tp, &agbp);
        if (error) {
                xfs_alert(mp,
                        "%s: xfs_ialloc_read_agi() returned error %d, agno %d",
@@ -2599,24 +2599,21 @@ xfs_read_agi(
  */
 int
 xfs_ialloc_read_agi(
-       struct xfs_mount        *mp,    /* file system mount structure */
-       struct xfs_trans        *tp,    /* transaction pointer */
-       xfs_agnumber_t          agno,   /* allocation group number */
+       struct xfs_perag        *pag,
+       struct xfs_trans        *tp,
        struct xfs_buf          **agibpp)
 {
        struct xfs_buf          *agibp;
-       struct xfs_agi          *agi;   /* allocation group header */
-       struct xfs_perag        *pag;   /* per allocation group data */
+       struct xfs_agi          *agi;
        int                     error;
 
-       trace_xfs_ialloc_read_agi(mp, agno);
+       trace_xfs_ialloc_read_agi(pag->pag_mount, pag->pag_agno);
 
-       error = xfs_read_agi(mp, tp, agno, &agibp);
+       error = xfs_read_agi(pag->pag_mount, tp, pag->pag_agno, &agibp);
        if (error)
                return error;
 
        agi = agibp->b_addr;
-       pag = agibp->b_pag;
        if (!pag->pagi_init) {
                pag->pagi_freecount = be32_to_cpu(agi->agi_freecount);
                pag->pagi_count = be32_to_cpu(agi->agi_count);
@@ -2628,7 +2625,7 @@ xfs_ialloc_read_agi(
         * we are in the middle of a forced shutdown.
         */
        ASSERT(pag->pagi_freecount == be32_to_cpu(agi->agi_freecount) ||
-               xfs_is_shutdown(mp));
+               xfs_is_shutdown(pag->pag_mount));
        if (agibpp)
                *agibpp = agibp;
        else
index 1ff42bf1e4b33c1c2d301e52549d59131a9cd30a..72cb33170d9fe35e8f1dafc87e1feeb1cd3790c6 100644 (file)
@@ -66,11 +66,8 @@ xfs_ialloc_log_agi(
  * Read in the allocation group header (inode allocation section)
  */
 int                                    /* error */
-xfs_ialloc_read_agi(
-       struct xfs_mount *mp,           /* file system mount structure */
-       struct xfs_trans *tp,           /* transaction pointer */
-       xfs_agnumber_t  agno,           /* allocation group number */
-       struct xfs_buf  **bpp);         /* allocation group hdr buf */
+xfs_ialloc_read_agi(struct xfs_perag *pag, struct xfs_trans *tp,
+               struct xfs_buf **agibpp);
 
 /*
  * Lookup a record by ino in the btree given by cur.
index b2ad2fdc40f52cae9b9b8759487e43a021baa33e..aa4367a0a0deb773e797aade0a6e0c61fdf913a2 100644 (file)
@@ -722,7 +722,7 @@ xfs_inobt_cur(
        ASSERT(*agi_bpp == NULL);
        ASSERT(*curpp == NULL);
 
-       error = xfs_ialloc_read_agi(mp, tp, pag->pag_agno, agi_bpp);
+       error = xfs_ialloc_read_agi(pag, tp, agi_bpp);
        if (error)
                return error;
 
@@ -757,16 +757,15 @@ xfs_inobt_count_blocks(
 /* Read finobt block count from AGI header. */
 static int
 xfs_finobt_read_blocks(
-       struct xfs_mount        *mp,
-       struct xfs_trans        *tp,
        struct xfs_perag        *pag,
+       struct xfs_trans        *tp,
        xfs_extlen_t            *tree_blocks)
 {
        struct xfs_buf          *agbp;
        struct xfs_agi          *agi;
        int                     error;
 
-       error = xfs_ialloc_read_agi(mp, tp, pag->pag_agno, &agbp);
+       error = xfs_ialloc_read_agi(pag, tp, &agbp);
        if (error)
                return error;
 
@@ -794,7 +793,7 @@ xfs_finobt_calc_reserves(
                return 0;
 
        if (xfs_has_inobtcounts(mp))
-               error = xfs_finobt_read_blocks(mp, tp, pag, &tree_len);
+               error = xfs_finobt_read_blocks(pag, tp, &tree_len);
        else
                error = xfs_inobt_count_blocks(mp, tp, pag, XFS_BTNUM_FINO,
                                &tree_len);
index 97b54ac3075f1979e6f8c6c84daac83361d3c7b2..62997791694a58d31c44e7741174a947bb88d034 100644 (file)
@@ -416,7 +416,7 @@ xchk_ag_read_headers(
        if (!sa->pag)
                return -ENOENT;
 
-       error = xfs_ialloc_read_agi(mp, sc->tp, agno, &sa->agi_bp);
+       error = xfs_ialloc_read_agi(sa->pag, sc->tp, &sa->agi_bp);
        if (error && want_ag_read_header_failure(sc, XFS_SCRUB_TYPE_AGI))
                return error;
 
index 48a6cbdf95d0850a9e6e00a95142f94ae2609647..bd06a184c81c58d5c4b4839f321938722a927c66 100644 (file)
@@ -78,7 +78,7 @@ xchk_fscount_warmup(
                        continue;
 
                /* Lock both AG headers. */
-               error = xfs_ialloc_read_agi(mp, sc->tp, agno, &agi_bp);
+               error = xfs_ialloc_read_agi(pag, sc->tp, &agi_bp);
                if (error)
                        break;
                error = xfs_alloc_read_agf(mp, sc->tp, agno, 0, &agf_bp);
index 1e7b6b209ee89aee1b553272904a295ec0adf85c..14acf1df3dd3e6ea9987d92fb1554d4216d2b481 100644 (file)
@@ -199,7 +199,7 @@ xrep_calc_ag_resblks(
                icount = pag->pagi_count;
        } else {
                /* Try to get the actual counters from disk. */
-               error = xfs_ialloc_read_agi(mp, NULL, sm->sm_agno, &bp);
+               error = xfs_ialloc_read_agi(pag, NULL, &bp);
                if (!error) {
                        icount = pag->pagi_count;
                        xfs_buf_relse(bp);