OSDN Git Service

btrfs: make grab_extent_buffer_from_page() handle subpage case
authorQu Wenruo <wqu@suse.com>
Tue, 26 Jan 2021 08:33:49 +0000 (16:33 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Feb 2021 21:59:01 +0000 (22:59 +0100)
For subpage case, grab_extent_buffer() can't really get an extent buffer
just from btrfs_subpage.

We have radix tree lock protecting us from inserting the same eb into
the tree.  Thus we don't really need to do the extra hassle, just let
alloc_extent_buffer() handle the existing eb in radix tree.

Now if two ebs are being allocated as the same time, one will fail with
-EEIXST when inserting into the radix tree.

So for grab_extent_buffer(), just always return NULL for subpage case.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
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 e498d49..133ff45 100644 (file)
@@ -5284,10 +5284,19 @@ free_eb:
 }
 #endif
 
-static struct extent_buffer *grab_extent_buffer(struct page *page)
+static struct extent_buffer *grab_extent_buffer(
+               struct btrfs_fs_info *fs_info, struct page *page)
 {
        struct extent_buffer *exists;
 
+       /*
+        * For subpage case, we completely rely on radix tree to ensure we
+        * don't try to insert two ebs for the same bytenr.  So here we always
+        * return NULL and just continue.
+        */
+       if (fs_info->sectorsize < PAGE_SIZE)
+               return NULL;
+
        /* Page not yet attached to an extent buffer */
        if (!PagePrivate(page))
                return NULL;
@@ -5373,7 +5382,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
                }
 
                spin_lock(&mapping->private_lock);
-               exists = grab_extent_buffer(p);
+               exists = grab_extent_buffer(fs_info, p);
                if (exists) {
                        spin_unlock(&mapping->private_lock);
                        unlock_page(p);