mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	xfs: factor xfs_alloc_vextent_this_ag() for _iterate_ags()
The core of the per-ag iteration is effectively doing a "this ag" allocation on one AG at a time. Use the same code to implement the core "this ag" allocation in both xfs_alloc_vextent_this_ag() and xfs_alloc_vextent_iterate_ags(). This means we only call xfs_alloc_ag_vextent() from one place so we can easily collapse the call stack in future patches. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
		
							parent
							
								
									ecd788a924
								
							
						
					
					
						commit
						2edf06a50f
					
				
					 1 changed files with 26 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -3244,6 +3244,28 @@ xfs_alloc_vextent_set_fsbno(
 | 
			
		|||
/*
 | 
			
		||||
 * Allocate within a single AG only.
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
__xfs_alloc_vextent_this_ag(
 | 
			
		||||
	struct xfs_alloc_arg	*args)
 | 
			
		||||
{
 | 
			
		||||
	struct xfs_mount	*mp = args->mp;
 | 
			
		||||
	int			error;
 | 
			
		||||
 | 
			
		||||
	error = xfs_alloc_fix_freelist(args, 0);
 | 
			
		||||
	if (error) {
 | 
			
		||||
		trace_xfs_alloc_vextent_nofix(args);
 | 
			
		||||
		return error;
 | 
			
		||||
	}
 | 
			
		||||
	if (!args->agbp) {
 | 
			
		||||
		/* cannot allocate in this AG at all */
 | 
			
		||||
		trace_xfs_alloc_vextent_noagbp(args);
 | 
			
		||||
		args->agbno = NULLAGBLOCK;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
 | 
			
		||||
	return xfs_alloc_ag_vextent(args);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
xfs_alloc_vextent_this_ag(
 | 
			
		||||
	struct xfs_alloc_arg	*args,
 | 
			
		||||
| 
						 | 
				
			
			@ -3267,21 +3289,9 @@ xfs_alloc_vextent_this_ag(
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	args->pag = xfs_perag_get(mp, args->agno);
 | 
			
		||||
	error = xfs_alloc_fix_freelist(args, 0);
 | 
			
		||||
	if (error) {
 | 
			
		||||
		trace_xfs_alloc_vextent_nofix(args);
 | 
			
		||||
		goto out_error;
 | 
			
		||||
	}
 | 
			
		||||
	if (!args->agbp) {
 | 
			
		||||
		trace_xfs_alloc_vextent_noagbp(args);
 | 
			
		||||
		args->fsbno = NULLFSBLOCK;
 | 
			
		||||
		goto out_error;
 | 
			
		||||
	}
 | 
			
		||||
	args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
 | 
			
		||||
	error = xfs_alloc_ag_vextent(args);
 | 
			
		||||
	error = __xfs_alloc_vextent_this_ag(args);
 | 
			
		||||
 | 
			
		||||
	xfs_alloc_vextent_set_fsbno(args, minimum_agno);
 | 
			
		||||
out_error:
 | 
			
		||||
	xfs_perag_put(args->pag);
 | 
			
		||||
	return error;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3319,24 +3329,16 @@ xfs_alloc_vextent_iterate_ags(
 | 
			
		|||
	args->agno = start_agno;
 | 
			
		||||
	for (;;) {
 | 
			
		||||
		args->pag = xfs_perag_get(mp, args->agno);
 | 
			
		||||
		error = xfs_alloc_fix_freelist(args, flags);
 | 
			
		||||
		error = __xfs_alloc_vextent_this_ag(args);
 | 
			
		||||
		if (error) {
 | 
			
		||||
			trace_xfs_alloc_vextent_nofix(args);
 | 
			
		||||
			args->agbno = NULLAGBLOCK;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		/*
 | 
			
		||||
		 * If we get a buffer back then the allocation will fly.
 | 
			
		||||
		 */
 | 
			
		||||
		if (args->agbp) {
 | 
			
		||||
			error = xfs_alloc_ag_vextent(args);
 | 
			
		||||
		if (args->agbp)
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		trace_xfs_alloc_vextent_loopfailed(args);
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Didn't work, figure out the next iteration.
 | 
			
		||||
		 */
 | 
			
		||||
		if (args->agno == start_agno &&
 | 
			
		||||
		    args->otype == XFS_ALLOCTYPE_START_BNO)
 | 
			
		||||
			args->type = XFS_ALLOCTYPE_THIS_AG;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue