• Qu Wenruo's avatar
    btrfs: rework page locking in __extent_writepage() · e55a0de1
    Qu Wenruo authored
    Pages passed to __extent_writepage() are always locked, but they may be
    locked by different functions.
    
    There are two types of locked page for __extent_writepage():
    
    - Page locked by plain lock_page()
      It should not have any subpage::writers count.
      Can be unlocked by unlock_page().
      This is the most common locked page for __extent_writepage() called
      inside extent_write_cache_pages() or extent_write_full_page().
      Rarer cases include the @locked_page from extent_write_locked_range().
    
    - Page locked by lock_delalloc_pages()
      There is only one caller, all pages except @locked_page for
      extent_write_locked_range().
      In this case, we have to call subpage helper to handle the case.
    
    So here we introduce a helper, btrfs_page_unlock_writer(), to allow
    __extent_writepage() to unlock different locked pages.
    
    And since for all other callers of __extent_writepage() their pages are
    ensured to be locked by lock_page(), also add an extra check for
    epd::extent_locked to unlock such pages directly.
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    e55a0de1
extent_io.c 195 KB