• Qu Wenruo's avatar
    btrfs: handle page locking in btrfs_page_end_writer_lock with no writers · 164674a7
    Qu Wenruo authored
    There are several call sites of extent_clear_unlock_delalloc() which get
    @locked_page = NULL.
    So that extent_clear_unlock_delalloc() will try to call
    process_one_page() to unlock every page even the first page is not
    locked by btrfs_page_start_writer_lock().
    
    This will trigger an ASSERT() in btrfs_subpage_end_and_test_writer() as
    previously we require every page passed to
    btrfs_subpage_end_and_test_writer() to be locked by
    btrfs_page_start_writer_lock().
    
    But compression path doesn't go that way.
    
    Thankfully it's not hard to distinguish page locked by lock_page() and
    btrfs_page_start_writer_lock().
    
    So do the check in btrfs_subpage_end_and_test_writer() so now it can
    handle both cases well.
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    164674a7
subpage.c 23.4 KB