Blame SOURCES/xfsprogs-5.10.0-xfs-use-the-finobt-block-counts-to-speed-up-mount-ti.patch

5d5cbe
From eb2c6897f36d560f84ed5124b246f2759c470f11 Mon Sep 17 00:00:00 2001
5d5cbe
From: "Darrick J. Wong" <darrick.wong@oracle.com>
5d5cbe
Date: Tue, 10 Nov 2020 15:11:09 -0500
5d5cbe
Subject: [PATCH] xfs: use the finobt block counts to speed up mount times
5d5cbe
5d5cbe
Source kernel commit: 1ac35f061af011442eeb731632f6daae991ecf7c
5d5cbe
5d5cbe
Now that we have reliable finobt block counts, use them to speed up the
5d5cbe
per-AG block reservation calculations at mount time.
5d5cbe
5d5cbe
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
5d5cbe
Reviewed-by: Brian Foster <bfoster@redhat.com>
5d5cbe
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5d5cbe
---
5d5cbe
5d5cbe
diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c
5d5cbe
index 9db87e9..b1adc80 100644
5d5cbe
--- a/libxfs/xfs_ialloc_btree.c
5d5cbe
+++ b/libxfs/xfs_ialloc_btree.c
5d5cbe
@@ -593,6 +593,28 @@ xfs_inobt_count_blocks(
5d5cbe
 	return error;
5d5cbe
 }
5d5cbe
 
5d5cbe
+/* Read finobt block count from AGI header. */
5d5cbe
+static int
5d5cbe
+xfs_finobt_read_blocks(
5d5cbe
+	struct xfs_mount	*mp,
5d5cbe
+	struct xfs_trans	*tp,
5d5cbe
+	xfs_agnumber_t		agno,
5d5cbe
+	xfs_extlen_t		*tree_blocks)
5d5cbe
+{
5d5cbe
+	struct xfs_buf		*agbp;
5d5cbe
+	struct xfs_agi		*agi;
5d5cbe
+	int			error;
5d5cbe
+
5d5cbe
+	error = xfs_ialloc_read_agi(mp, tp, agno, &agbp);
5d5cbe
+	if (error)
5d5cbe
+		return error;
5d5cbe
+
5d5cbe
+	agi = agbp->b_addr;
5d5cbe
+	*tree_blocks = be32_to_cpu(agi->agi_fblocks);
5d5cbe
+	xfs_trans_brelse(tp, agbp);
5d5cbe
+	return 0;
5d5cbe
+}
5d5cbe
+
5d5cbe
 /*
5d5cbe
  * Figure out how many blocks to reserve and how many are used by this btree.
5d5cbe
  */
5d5cbe
@@ -610,7 +632,11 @@ xfs_finobt_calc_reserves(
5d5cbe
 	if (!xfs_sb_version_hasfinobt(&mp->m_sb))
5d5cbe
 		return 0;
5d5cbe
 
5d5cbe
-	error = xfs_inobt_count_blocks(mp, tp, agno, XFS_BTNUM_FINO, &tree_len);
5d5cbe
+	if (xfs_sb_version_hasinobtcounts(&mp->m_sb))
5d5cbe
+		error = xfs_finobt_read_blocks(mp, tp, agno, &tree_len);
5d5cbe
+	else
5d5cbe
+		error = xfs_inobt_count_blocks(mp, tp, agno, XFS_BTNUM_FINO,
5d5cbe
+				&tree_len);
5d5cbe
 	if (error)
5d5cbe
 		return error;
5d5cbe