On Thu, Jan 03, 2019 at 10:50:01AM +0200, Nikolay Borisov wrote:
> ihold is supposed to be used when the caller already has a reference to
> the inode. In the case of cow_file_range_async this invariants holds,
> since the 3 call chains leading to this function all take a reference:
> 
> btrfs_writepage  <--- does igrab
>  extent_write_full_page
>   __extent_writepage
>    writepage_delalloc
>      btrfs_run_delalloc_range
>       cow_file_range_async
> 
> extent_write_cache_pages <--- does igrab
>  __extent_writepage (same callchain as above)
> 
> and
> 
> submit_compressed_extents <-- already called from async CoW submit path,
>                             which would have done ihold.
>  extent_write_locked_range
>   __extent_writepage

So by the logic the inode reference needs to be taken early, eg. in
btrfs_writepage and all low-level callbacks or helpers are fine with
ihold.

Reviewed-by: David Sterba <[email protected]>

Reply via email to