mirror of https://gitee.com/openkylin/linux.git
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: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
parent
2a39946c98
commit
1ac35f061a
|
@ -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(
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue