Re: [PATCH 5/5] btrfs: stop running all delayed refs during snapshot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 13.03.20 г. 23:12 ч., Josef Bacik wrote:
> This was added a very long time ago to work around issues with delayed
> refs and with qgroups.  Both of these issues have since been properly
> fixed, so all this does is cause a lot of lock contention with anybody
> else who is running delayed refs.

Oh I see, the changelog for this and the previous patch got switched, no ?
> 
> Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx>
> ---
>  fs/btrfs/transaction.c | 23 ++++++++++++-----------
>  1 file changed, 12 insertions(+), 11 deletions(-)
> 
> diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
> index c3b3b524b8c3..8d34d7e0adb6 100644
> --- a/fs/btrfs/transaction.c
> +++ b/fs/btrfs/transaction.c
> @@ -1184,10 +1184,6 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans)
>  	btrfs_tree_unlock(eb);
>  	free_extent_buffer(eb);
>  
> -	if (ret)
> -		return ret;
> -
> -	ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
>  	if (ret)
>  		return ret;
>  
> @@ -1205,10 +1201,6 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans)
>  	if (ret)
>  		return ret;
>  
> -	/* run_qgroups might have added some more refs */
> -	ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
> -	if (ret)
> -		return ret;
>  again:
>  	while (!list_empty(&fs_info->dirty_cowonly_roots)) {
>  		struct btrfs_root *root;
> @@ -1223,15 +1215,24 @@ static noinline int commit_cowonly_roots(struct btrfs_trans_handle *trans)
>  		ret = update_cowonly_root(trans, root);
>  		if (ret)
>  			return ret;
> -		ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
> -		if (ret)
> -			return ret;
>  	}
>  
> +	/* Now flush any delayed refs generated by updating all of the roots. */
> +	ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
> +	if (ret)
> +		return ret;
> +
>  	while (!list_empty(dirty_bgs) || !list_empty(io_bgs)) {
>  		ret = btrfs_write_dirty_block_groups(trans);
>  		if (ret)
>  			return ret;
> +
> +		/*
> +		 * We're writing the dirty block groups, which could generate
> +		 * delayed refs, which could generate more dirty block groups,
> +		 * so we want to keep this flushing in this loop to make sure
> +		 * everything gets run.
> +		 */
>  		ret = btrfs_run_delayed_refs(trans, (unsigned long)-1);
>  		if (ret)
>  			return ret;
> 



[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux