]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: refactor agfl length computation function
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 22 Jan 2020 16:29:46 +0000 (11:29 -0500)
committerEric Sandeen <sandeen@redhat.com>
Wed, 22 Jan 2020 16:29:46 +0000 (11:29 -0500)
Source kernel commit: 1cac233cfe71f21e069705a4930c18e48d897be6

Refactor xfs_alloc_min_freelist to accept a NULL @pag argument, in which
case it returns the largest possible minimum length.  This will be used
in an upcoming patch to compute the length of the AGFL at mkfs 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_alloc.c

index b7741fe917a40396fe26b2a0316c6de647f9ece2..1d25d14f98b39a472d798e93f9c1d7ac7d801fa6 100644 (file)
@@ -2243,24 +2243,32 @@ xfs_alloc_longest_free_extent(
        return pag->pagf_flcount > 0 || pag->pagf_longest > 0;
 }
 
+/*
+ * Compute the minimum length of the AGFL in the given AG.  If @pag is NULL,
+ * return the largest possible minimum length.
+ */
 unsigned int
 xfs_alloc_min_freelist(
        struct xfs_mount        *mp,
        struct xfs_perag        *pag)
 {
+       /* AG btrees have at least 1 level. */
+       static const uint8_t    fake_levels[XFS_BTNUM_AGF] = {1, 1, 1};
+       const uint8_t           *levels = pag ? pag->pagf_levels : fake_levels;
        unsigned int            min_free;
 
+       ASSERT(mp->m_ag_maxlevels > 0);
+
        /* space needed by-bno freespace btree */
-       min_free = min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_BNOi] + 1,
+       min_free = min_t(unsigned int, levels[XFS_BTNUM_BNOi] + 1,
                                       mp->m_ag_maxlevels);
        /* space needed by-size freespace btree */
-       min_free += min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_CNTi] + 1,
+       min_free += min_t(unsigned int, levels[XFS_BTNUM_CNTi] + 1,
                                       mp->m_ag_maxlevels);
        /* space needed reverse mapping used space btree */
        if (xfs_sb_version_hasrmapbt(&mp->m_sb))
-               min_free += min_t(unsigned int,
-                                 pag->pagf_levels[XFS_BTNUM_RMAPi] + 1,
-                                 mp->m_rmap_maxlevels);
+               min_free += min_t(unsigned int, levels[XFS_BTNUM_RMAPi] + 1,
+                                               mp->m_rmap_maxlevels);
 
        return min_free;
 }