Commit 99b13c7f authored by Dave Chinner's avatar Dave Chinner Committed by Dave Chinner
Browse files

xfs: pass perag to xfs_ialloc_read_agi()



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: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent a95fee40
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -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,
+10 −13
Original line number Diff line number Diff line
@@ -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
+2 −5
Original line number Diff line number Diff line
@@ -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.
+4 −5
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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;

Loading