[PATCH] xfs: pull up stack_switch check into xfs_bmapi_write

Mark Tinguely tinguely at sgi.com
Thu Jan 17 12:50:55 CST 2013


On 01/17/13 12:11, Brian Foster wrote:
> The stack_switch check currently occurs in __xfs_bmapi_allocate,
> which means the stack switch only occurs when xfs_bmapi_allocate()
> is called in a loop. Pull the check up before the loop in
> xfs_bmapi_write() such that the first iteration of the loop has
> consistent behavior.
>
> Signed-off-by: Brian Foster<bfoster at redhat.com>
> ---
>
> I was reading through this code and confused myself over whether the stack
> switch ever actually occurs. Eric and Ben pointed out on irc (simultaneously,
> I might add) the surrounding loop that I had missed, but it wasn't clear whether
> the behavior to enable the stack switch after the first iteration was
> intentional or not. I'm throwing this out there to either fix the issue or seek
> out an explanation for the existing behavior. Thanks!
>
> Brian
>
>   fs/xfs/xfs_bmap.c |    6 +++---
>   1 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
> index c507720..491f35e 100644
> --- a/fs/xfs/xfs_bmap.c
> +++ b/fs/xfs/xfs_bmap.c
> @@ -4676,9 +4676,6 @@ __xfs_bmapi_allocate(
>   			return error;
>   	}
>
> -	if (bma->flags&  XFS_BMAPI_STACK_SWITCH)
> -		bma->stack_switch = 1;
> -
>   	error = xfs_bmap_alloc(bma);
>   	if (error)
>   		return error;
> @@ -4952,6 +4949,9 @@ xfs_bmapi_write(
>   	bma.flist = flist;
>   	bma.firstblock = firstblock;
>
> +	if (flags&  XFS_BMAPI_STACK_SWITCH)
> +		bma.stack_switch = 1;
> +
>   	while (bno<  end&&  n<  *nmap) {
>   		inhole = eof || bma.got.br_startoff>  bno;
>   		wasdelay = !inhole&&  isnullstartblock(bma.got.br_startblock);


Might want to read the Sep 2012 OSS archives, for example the below 
thread and the spin off threads.

  http://oss.sgi.com/archives/xfs/2012-09/msg00254.html

My original patch was in xfs_bmapi_write() and it was moved to its 
current location.

You can force the code by restricting to only one allocation worker and 
there were 2 xfstests (76? and 139? come to mind) that quickly triggered 
the event.

--Mark.



More information about the xfs mailing list