Re: [PATCH 05/22] xfs: convert raw ag walks to use for_each_perag

Brian Foster
2021-05-10T13:40:43Z

On Thu, May 06, 2021 at 05:20:37PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> 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>
> ---
> 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
>