• Qu Wenruo's avatar
    btrfs: make __extent_writepage_io() to write specified range only · 21b5bef2
    Qu Wenruo authored
    Function __extent_writepage_io() is designed to find all dirty ranges of
    a page, and add the dirty ranges to the bio_ctrl for submission.
    It requires all the dirtied ranges to be covered by an ordered extent.
    
    It gets called in two locations, but one call site is not subpage aware:
    
    - __extent_writepage()
      It gets called when writepage_delalloc() returned 0, which means
      writepage_delalloc() has handled delalloc for all subpage sectors
      inside the page.
    
      So this call site is OK.
    
    - extent_write_locked_range()
      This call site is utilized by zoned support, and in this case, we may
      only run delalloc range for a subset of the page, like this: (64K page
      size)
    
      0     16K     32K     48K     64K
      |/////|       |///////|       |
    
      In the above case, if extent_write_locked_range() is only triggered for
      range [0, 16K), __extent_writepage_io() would still try to submit
      the dirty range of [32K, 48K), then it would not find any ordered
      extent for it and triggers various ASSERT()s.
    
    Fix this problem by:
    
    - Introducing @start and @len parameters to specify the range
    
      For the first call site, we just pass the whole page, and the behavior
      is not touched, since run_delalloc_range() for the page should have
      created all ordered extents for the page.
    
      For the second call site, we avoid touching anything beyond the
      range, thus avoiding the dirty range which is not yet covered by any
      delalloc range.
    
    - Making btrfs_folio_assert_not_dirty() subpage aware
      The only caller is inside __extent_writepage_io(), and since that
      caller now accepts a subpage range, we should also check the subpage
      range other than the whole page.
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    21b5bef2
subpage.c 26.5 KB