]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: use the finobt block counts to speed up mount times
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 10 Nov 2020 20:11:09 +0000 (15:11 -0500)
committerEric Sandeen <sandeen@sandeen.net>
Tue, 10 Nov 2020 20:11:09 +0000 (15:11 -0500)
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>
libxfs/xfs_ialloc_btree.c

index 3ed87d1c725139dd09964d060aa6b849446d31ca..1edf69ffa96b76b40e570d7e0966a287d80482d0 100644 (file)
@@ -693,6 +693,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.
  */
@@ -710,7 +732,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;