Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51863d7d authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: grab the per-ag structure whenever relevant



Grab and hold the per-AG data across a scrub run whenever relevant.
This helps us avoid repeated trips through rcu and the radix tree
in the repair code.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
parent 05edd888
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -541,6 +541,10 @@ xfs_scrub_ag_free(
		xfs_trans_brelse(sc->tp, sa->agi_bp);
		sa->agi_bp = NULL;
	}
	if (sa->pag) {
		xfs_perag_put(sa->pag);
		sa->pag = NULL;
	}
	sa->agno = NULLAGNUMBER;
}

@@ -568,6 +572,19 @@ xfs_scrub_ag_init(
	return xfs_scrub_ag_btcur_init(sc, sa);
}

/*
 * Grab the per-ag structure if we haven't already gotten it.  Teardown of the
 * xfs_scrub_ag will release it for us.
 */
void
xfs_scrub_perag_get(
	struct xfs_mount	*mp,
	struct xfs_scrub_ag	*sa)
{
	if (!sa->pag)
		sa->pag = xfs_perag_get(mp, sa->agno);
}

/* Per-scrubber setup functions */

/*
+1 −0
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ xfs_scrub_setup_quota(struct xfs_scrub_context *sc, struct xfs_inode *ip)
void xfs_scrub_ag_free(struct xfs_scrub_context *sc, struct xfs_scrub_ag *sa);
int xfs_scrub_ag_init(struct xfs_scrub_context *sc, xfs_agnumber_t agno,
		      struct xfs_scrub_ag *sa);
void xfs_scrub_perag_get(struct xfs_mount *mp, struct xfs_scrub_ag *sa);
int xfs_scrub_ag_read_headers(struct xfs_scrub_context *sc, xfs_agnumber_t agno,
			      struct xfs_buf **agi, struct xfs_buf **agf,
			      struct xfs_buf **agfl);
+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ struct xfs_scrub_meta_ops {
/* Buffer pointers and btree cursors for an entire AG. */
struct xfs_scrub_ag {
	xfs_agnumber_t			agno;
	struct xfs_perag		*pag;

	/* AG btree roots */
	struct xfs_buf			*agf_bp;