btrfs: refactor alloc_extent_buffer() to allocate-then-attach method
authorQu Wenruo <wqu@suse.com>
Wed, 29 Nov 2023 22:32:08 +0000 (09:02 +1030)
committerDavid Sterba <dsterba@suse.com>
Fri, 15 Dec 2023 22:01:04 +0000 (23:01 +0100)
commit09e6cef19c9fc0e10547135476865b5272aa0406
tree5df058d154ee6fa2d7d79d9807aa985ce10bf2d7
parent2b0122aaa800b021e36027d7f29e206f87c761d6
btrfs: refactor alloc_extent_buffer() to allocate-then-attach method

Currently alloc_extent_buffer() utilizes find_or_create_page() to
allocate one page a time for an extent buffer.

This method has the following disadvantages:

- find_or_create_page() is the legacy way of allocating new pages
  With the new folio infrastructure, find_or_create_page() is just
  redirected to filemap_get_folio().

- Lacks the way to support higher order (order >= 1) folios
  As we can not yet let filemap give us a higher order folio.

This patch would change the workflow by the following way:

Old    | new
-----------------------------------+-------------------------------------
                                   | ret = btrfs_alloc_page_array();
for (i = 0; i < num_pages; i++) {  | for (i = 0; i < num_pages; i++) {
    p = find_or_create_page();     |     ret = filemap_add_folio();
    /* Attach page private */      |     /* Reuse page cache if needed */
    /* Reused eb if needed */      |
   |     /* Attach page private and
   |        reuse eb if needed */
   | }

By this we split the page allocation and private attaching into two
parts, allowing future updates to each part more easily, and migrate to
folio interfaces (especially for possible higher order folios).

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/compression.c
fs/btrfs/extent_io.c
fs/btrfs/extent_io.h
fs/btrfs/inode.c
fs/btrfs/raid56.c
fs/btrfs/scrub.c