btrfs: make alloc_extent_buffer() check subpage dirty bitmap
authorQu Wenruo <wqu@suse.com>
Thu, 25 Mar 2021 07:14:41 +0000 (15:14 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Apr 2021 15:25:18 +0000 (17:25 +0200)
In alloc_extent_buffer(), we make sure that the newly allocated page is
never dirty.

This is fine for sector size == PAGE_SIZE case, but for subpage it's
possible that one extent buffer in the page is dirty, thus the whole
page is marked dirty, and could cause false alert.

To support subpage, call btrfs_page_test_dirty() to handle both cases.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index 7ad2169e74872865f0009925aa65a0525dd62eb3..7c195d8dc07beeee4add98417730cc9762554e06 100644 (file)
@@ -5665,7 +5665,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
                btrfs_page_inc_eb_refs(fs_info, p);
                spin_unlock(&mapping->private_lock);
 
-               WARN_ON(PageDirty(p));
+               WARN_ON(btrfs_page_test_dirty(fs_info, p, eb->start, eb->len));
                eb->pages[i] = p;
                if (!PageUptodate(p))
                        uptodate = 0;