xfs: convert raw ag walks to use for_each_perag
authorDave Chinner <dchinner@redhat.com>
Wed, 2 Jun 2021 00:48:24 +0000 (10:48 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 2 Jun 2021 00:48:24 +0000 (10:48 +1000)
Convert the raw walks to an iterator, pulling the current AG out of
pag->pag_agno instead of the loop iterator variable.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_types.c
fs/xfs/scrub/bmap.c
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_reflink.c

index 04801362e1a73d5f1783700f67884be9085242cb..e8f4abee78927c8518b94a874afb83ea8ddb68c9 100644 (file)
@@ -11,6 +11,7 @@
 #include "xfs_trans_resv.h"
 #include "xfs_bit.h"
 #include "xfs_mount.h"
+#include "xfs_ag.h"
 
 /* Find the size of the AG, in blocks. */
 inline xfs_agblock_t
@@ -222,12 +223,13 @@ xfs_icount_range(
        unsigned long long      *max)
 {
        unsigned long long      nr_inos = 0;
+       struct xfs_perag        *pag;
        xfs_agnumber_t          agno;
 
        /* root, rtbitmap, rtsum all live in the first chunk */
        *min = XFS_INODES_PER_CHUNK;
 
-       for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
+       for_each_perag(mp, agno, pag) {
                xfs_agino_t     first, last;
 
                xfs_agino_range(mp, agno, &first, &last);
index b5ebf1d1b4db45d29000d736186172648283de62..e457c086887f49841434b9ff2f80f3bad7dfb23c 100644 (file)
@@ -22,6 +22,7 @@
 #include "scrub/scrub.h"
 #include "scrub/common.h"
 #include "scrub/btree.h"
+#include "xfs_ag.h"
 
 /* Set us up with an inode's bmap. */
 int
@@ -575,6 +576,7 @@ xchk_bmap_check_rmaps(
        int                     whichfork)
 {
        struct xfs_ifork        *ifp = XFS_IFORK_PTR(sc->ip, whichfork);
+       struct xfs_perag        *pag;
        xfs_agnumber_t          agno;
        bool                    zero_size;
        int                     error;
@@ -607,15 +609,16 @@ xchk_bmap_check_rmaps(
            (zero_size || ifp->if_nextents > 0))
                return 0;
 
-       for (agno = 0; agno < sc->mp->m_sb.sb_agcount; agno++) {
-               error = xchk_bmap_check_ag_rmaps(sc, whichfork, agno);
+       for_each_perag(sc->mp, agno, pag) {
+               error = xchk_bmap_check_ag_rmaps(sc, whichfork, pag->pag_agno);
                if (error)
-                       return error;
+                       break;
                if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
                        break;
        }
-
-       return 0;
+       if (pag)
+               xfs_perag_put(pag);
+       return error;
 }
 
 /*
index fee2a4e802411a8fa5f084859de5d1067e310011..1227503d22463cc2b45bcdd859129bdbf38ee4ee 100644 (file)
@@ -2742,21 +2742,17 @@ STATIC void
 xlog_recover_process_iunlinks(
        struct xlog     *log)
 {
-       xfs_mount_t     *mp;
-       xfs_agnumber_t  agno;
-       xfs_agi_t       *agi;
-       struct xfs_buf  *agibp;
-       xfs_agino_t     agino;
-       int             bucket;
-       int             error;
-
-       mp = log->l_mp;
+       struct xfs_mount        *mp = log->l_mp;
+       struct xfs_perag        *pag;
+       xfs_agnumber_t          agno;
+       struct xfs_agi          *agi;
+       struct xfs_buf          *agibp;
+       xfs_agino_t             agino;
+       int                     bucket;
+       int                     error;
 
-       for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
-               /*
-                * Find the agi for this ag.
-                */
-               error = xfs_read_agi(mp, NULL, agno, &agibp);
+       for_each_perag(mp, agno, pag) {
+               error = xfs_read_agi(mp, NULL, pag->pag_agno, &agibp);
                if (error) {
                        /*
                         * AGI is b0rked. Don't process it.
@@ -2782,7 +2778,7 @@ xlog_recover_process_iunlinks(
                        agino = be32_to_cpu(agi->agi_unlinked[bucket]);
                        while (agino != NULLAGINO) {
                                agino = xlog_recover_process_one_iunlink(mp,
-                                                       agno, agino, bucket);
+                                               pag->pag_agno, agino, bucket);
                                cond_resched();
                        }
                }
@@ -3494,27 +3490,28 @@ xlog_recover_cancel(
  */
 STATIC void
 xlog_recover_check_summary(
-       struct xlog     *log)
+       struct xlog             *log)
 {
-       xfs_mount_t     *mp;
-       struct xfs_buf  *agfbp;
-       struct xfs_buf  *agibp;
-       xfs_agnumber_t  agno;
-       uint64_t        freeblks;
-       uint64_t        itotal;
-       uint64_t        ifree;
-       int             error;
+       struct xfs_mount        *mp = log->l_mp;
+       struct xfs_perag        *pag;
+       struct xfs_buf          *agfbp;
+       struct xfs_buf          *agibp;
+       xfs_agnumber_t          agno;
+       uint64_t                freeblks;
+       uint64_t                itotal;
+       uint64_t                ifree;
+       int                     error;
 
        mp = log->l_mp;
 
        freeblks = 0LL;
        itotal = 0LL;
        ifree = 0LL;
-       for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
-               error = xfs_read_agf(mp, NULL, agno, 0, &agfbp);
+       for_each_perag(mp, agno, pag) {
+               error = xfs_read_agf(mp, NULL, pag->pag_agno, 0, &agfbp);
                if (error) {
                        xfs_alert(mp, "%s agf read failed agno %d error %d",
-                                               __func__, agno, error);
+                                               __func__, pag->pag_agno, error);
                } else {
                        struct xfs_agf  *agfp = agfbp->b_addr;
 
@@ -3523,10 +3520,10 @@ xlog_recover_check_summary(
                        xfs_buf_relse(agfbp);
                }
 
-               error = xfs_read_agi(mp, NULL, agno, &agibp);
+               error = xfs_read_agi(mp, NULL, pag->pag_agno, &agibp);
                if (error) {
                        xfs_alert(mp, "%s agi read failed agno %d error %d",
-                                               __func__, agno, error);
+                                               __func__, pag->pag_agno, error);
                } else {
                        struct xfs_agi  *agi = agibp->b_addr;
 
index f297d68a931b3822c4e777d3db2276dafb2998ad..0e430b0c1b166f6f7c74a76cbbab17f19dea3218 100644 (file)
@@ -755,16 +755,19 @@ int
 xfs_reflink_recover_cow(
        struct xfs_mount        *mp)
 {
+       struct xfs_perag        *pag;
        xfs_agnumber_t          agno;
        int                     error = 0;
 
        if (!xfs_sb_version_hasreflink(&mp->m_sb))
                return 0;
 
-       for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
-               error = xfs_refcount_recover_cow_leftovers(mp, agno);
-               if (error)
+       for_each_perag(mp, agno, pag) {
+               error = xfs_refcount_recover_cow_leftovers(mp, pag->pag_agno);
+               if (error) {
+                       xfs_perag_put(pag);
                        break;
+               }
        }
 
        return error;