On Wed, Dec 18, 2019 at 11:37:28AM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > 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@xxxxxxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/libxfs/xfs_alloc.c | 18 +++++++++++++----- > 1 file changed, 13 insertions(+), 5 deletions(-) > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index c284e10af491..fc93fd88ec89 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2248,24 +2248,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; > } >