diff options
Diffstat (limited to 'fs/xfs/libxfs/xfs_alloc.c')
| -rw-r--r-- | fs/xfs/libxfs/xfs_alloc.c | 18 | 
1 files 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;  }  | 
