62 lines
1.7 KiB
Diff
62 lines
1.7 KiB
Diff
|
From eb2c6897f36d560f84ed5124b246f2759c470f11 Mon Sep 17 00:00:00 2001
|
||
|
From: "Darrick J. Wong" <darrick.wong@oracle.com>
|
||
|
Date: Tue, 10 Nov 2020 15:11:09 -0500
|
||
|
Subject: [PATCH] xfs: use the finobt block counts to speed up mount times
|
||
|
|
||
|
Source kernel commit: 1ac35f061af011442eeb731632f6daae991ecf7c
|
||
|
|
||
|
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>
|
||
|
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
|
||
|
---
|
||
|
|
||
|
diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c
|
||
|
index 9db87e9..b1adc80 100644
|
||
|
--- a/libxfs/xfs_ialloc_btree.c
|
||
|
+++ b/libxfs/xfs_ialloc_btree.c
|
||
|
@@ -593,6 +593,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.
|
||
|
*/
|
||
|
@@ -610,7 +632,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;
|
||
|
|