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

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
...@@ -694,6 +694,28 @@ xfs_inobt_count_blocks( ...@@ -694,6 +694,28 @@ xfs_inobt_count_blocks(
return error; 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. * Figure out how many blocks to reserve and how many are used by this btree.
*/ */
...@@ -711,7 +733,11 @@ xfs_finobt_calc_reserves( ...@@ -711,7 +733,11 @@ xfs_finobt_calc_reserves(
if (!xfs_sb_version_hasfinobt(&mp->m_sb)) if (!xfs_sb_version_hasfinobt(&mp->m_sb))
return 0; 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) if (error)
return error; return error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment