Re: [PATCH 2/4] btrfs: wake up async_delalloc_pages waiters after submit

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

 




On 11.06.21 г. 16:53, Josef Bacik wrote:
> We use the async_delalloc_pages mechanism to make sure that we've
> completed our async work before trying to continue our delalloc
> flushing.  The reason for this is we need to see any ordered extents
> that were created by our delalloc flushing.  However we're waking up
> before we do the submit work, which is before we create the ordered
> extents.  This is a pretty wide race window where we could potentially
> think there are no ordered extents and thus exit shrink_delalloc
> prematurely.  Fix this by waking us up after we've done the work to
> create ordered extents.
> 
> cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx>

Reviewed-by: Nikolay Borisov <nborisov@xxxxxxxx>
> ---
>  fs/btrfs/inode.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 6cb73ff59c7c..c37271df2c6d 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -1271,11 +1271,6 @@ static noinline void async_cow_submit(struct btrfs_work *work)
>  	nr_pages = (async_chunk->end - async_chunk->start + PAGE_SIZE) >>
>  		PAGE_SHIFT;
>  
> -	/* atomic_sub_return implies a barrier */
> -	if (atomic_sub_return(nr_pages, &fs_info->async_delalloc_pages) <
> -	    5 * SZ_1M)
> -		cond_wake_up_nomb(&fs_info->async_submit_wait);
> -
>  	/*
>  	 * ->inode could be NULL if async_chunk_start has failed to compress,
>  	 * in which case we don't have anything to submit, yet we need to
> @@ -1284,6 +1279,11 @@ static noinline void async_cow_submit(struct btrfs_work *work)
>  	 */
>  	if (async_chunk->inode)
>  		submit_compressed_extents(async_chunk);
> +
> +	/* atomic_sub_return implies a barrier */
> +	if (atomic_sub_return(nr_pages, &fs_info->async_delalloc_pages) <
> +	    5 * SZ_1M)
> +		cond_wake_up_nomb(&fs_info->async_submit_wait);
>  }
>  
>  static noinline void async_cow_free(struct btrfs_work *work)
> 



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux