• Qu Wenruo's avatar
    btrfs: subpage: make extent_write_locked_range() compatible · 66448b9d
    Qu Wenruo authored
    There are two sites are not subpage compatible yet for
    extent_write_locked_range():
    
    - How @nr_pages are calculated
      For subpage we can have the following range with 64K page size:
    
      0   32K  64K   96K 128K
      |   |////|/////|   |
    
      In that case, although 96K - 32K == 64K, thus it looks like one page
      is enough, but the range spans two pages, not one.
    
      Fix it by doing proper round_up() and round_down() to calculate
      @nr_pages.
    
      Also add some extra ASSERT()s to ensure the range passed in is already
      aligned.
    
    - How the page end is calculated
      Currently we just use cur + PAGE_SIZE - 1 to calculate the page end.
    
      Which can't handle the above range layout, and will trigger ASSERT()
      in btrfs_writepage_endio_finish_ordered(), as the range is no longer
      covered by the page range.
    
      Fix it by taking page end into consideration.
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    66448b9d
extent_io.c 194 KB