diff options
Diffstat (limited to 'fs/xfs/xfs_alloc.c')
| -rw-r--r-- | fs/xfs/xfs_alloc.c | 26 | 
1 files changed, 21 insertions, 5 deletions
diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 028e44e58ea..2cf944eb796 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -1872,6 +1872,25 @@ xfs_alloc_compute_maxlevels(  }  /* + * Find the length of the longest extent in an AG. + */ +xfs_extlen_t +xfs_alloc_longest_free_extent( +	struct xfs_mount	*mp, +	struct xfs_perag	*pag) +{ +	xfs_extlen_t		need, delta = 0; + +	need = XFS_MIN_FREELIST_PAG(pag, mp); +	if (need > pag->pagf_flcount) +		delta = need - pag->pagf_flcount; + +	if (pag->pagf_longest > delta) +		return pag->pagf_longest - delta; +	return pag->pagf_flcount > 0 || pag->pagf_longest > 0; +} + +/*   * Decide whether to use this allocation group for this allocation.   * If so, fix up the btree freelist's size.   */ @@ -1923,15 +1942,12 @@ xfs_alloc_fix_freelist(  	}  	if (!(flags & XFS_ALLOC_FLAG_FREEING)) { -		need = XFS_MIN_FREELIST_PAG(pag, mp); -		delta = need > pag->pagf_flcount ? need - pag->pagf_flcount : 0;  		/*  		 * If it looks like there isn't a long enough extent, or enough  		 * total blocks, reject it.  		 */ -		longest = (pag->pagf_longest > delta) ? -			(pag->pagf_longest - delta) : -			(pag->pagf_flcount > 0 || pag->pagf_longest > 0); +		need = XFS_MIN_FREELIST_PAG(pag, mp); +		longest = xfs_alloc_longest_free_extent(mp, pag);  		if ((args->minlen + args->alignment + args->minalignslop - 1) >  				longest ||  		    ((int)(pag->pagf_freeblks + pag->pagf_flcount -  |