On Thu, May 06, 2021 at 05:20:37PM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > 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@xxxxxxxxxx> > --- > fs/xfs/libxfs/xfs_types.c | 4 ++- > fs/xfs/scrub/bmap.c | 6 +++-- > fs/xfs/xfs_log_recover.c | 55 ++++++++++++++++++--------------------- > fs/xfs/xfs_reflink.c | 9 ++++--- > 4 files changed, 39 insertions(+), 35 deletions(-) > ... > diff --git a/fs/xfs/scrub/bmap.c b/fs/xfs/scrub/bmap.c > index b5ebf1d1b4db..c60a1990d629 100644 > --- a/fs/xfs/scrub/bmap.c > +++ b/fs/xfs/scrub/bmap.c ... > @@ -607,8 +609,8 @@ 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; It looks like this loop is missing xfs_perag_put() early breakout treatment. The rest of the patch LGTM. Brian > if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index fee2a4e80241..1227503d2246 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -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; > > diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c > index f297d68a931b..0e430b0c1b16 100644 > --- a/fs/xfs/xfs_reflink.c > +++ b/fs/xfs/xfs_reflink.c > @@ -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; > -- > 2.31.1 >