Commit 1ac35f06 authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: use the finobt block counts to speed up mount times



Now that we have reliable finobt block counts, use them to speed up the
per-AG block reservation calculations at mount time.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
parent 2a39946c
Loading
Loading
Loading
Loading
+27 −1
Original line number Diff line number Diff line
@@ -694,6 +694,28 @@ xfs_inobt_count_blocks(
	return error;
}

/* Read finobt block count from AGI header. */
static int
xfs_finobt_read_blocks(
	struct xfs_mount	*mp,
	struct xfs_trans	*tp,
	xfs_agnumber_t		agno,
	xfs_extlen_t		*tree_blocks)
{
	struct xfs_buf		*agbp;
	struct xfs_agi		*agi;
	int			error;

	error = xfs_ialloc_read_agi(mp, tp, agno, &agbp);
	if (error)
		return error;

	agi = agbp->b_addr;
	*tree_blocks = be32_to_cpu(agi->agi_fblocks);
	xfs_trans_brelse(tp, agbp);
	return 0;
}

/*
 * Figure out how many blocks to reserve and how many are used by this btree.
 */
@@ -711,7 +733,11 @@ xfs_finobt_calc_reserves(
	if (!xfs_sb_version_hasfinobt(&mp->m_sb))
		return 0;

	error = xfs_inobt_count_blocks(mp, tp, agno, XFS_BTNUM_FINO, &tree_len);
	if (xfs_sb_version_hasinobtcounts(&mp->m_sb))
		error = xfs_finobt_read_blocks(mp, tp, agno, &tree_len);
	else
		error = xfs_inobt_count_blocks(mp, tp, agno, XFS_BTNUM_FINO,
				&tree_len);
	if (error)
		return error;