This huge patchset can be fetched from github:
https://github.com/adam900710/linux/tree/subpage

=== Current stage ===
The tests on x86 pass without new failure, and generic test group on
arm64 with 64K page size passes except known failure and defrag group.

Although full fstests run needs to disable the warning message in
mkfs.btrfs, or it will cause too many false alerts.
The patch for mkfs.btrfs to use new sysfs interface to avoid such
behavior is under way.

But considering how slow my ARM boards are, I haven't run that many
loops.
So extra test will always help.

=== Limitation ===
There are several limitations introduced just for subpage:
- No compressed write support
  Read is no problem, but compression write path has more things left to
  be modified.
  Thus for current patchset, no matter what inode attribute or mount
  option is, no new compressed extent can be created for subpage case.

- No sector-sized defrag support
  Currently defrag is still done in PAGE_SIZE, meaning if there is a
  hole in a 64K page, we still write a full 64K back to disk.
  This causes more disk space usage.

- No inline extent will be created
  This is mostly due to the fact that filemap_fdatawrite_range() will
  trigger more write than the range specified.
  In fallocate calls, this behavior can make us to writeback which can
  be inlined, before we enlarge the isize, causing inline extent being
  created along with regular extents.

- No sector size base repair for read-time data repair
  Btrfs supports repair for corrupted data at read time.
  But for current subpage repair, the unit is bvec, which can var from
  4K to 64K.
  If one data extent is only 4K sized, then we can do the repair in 4K size.
  But if the extent size grows, then the repair size grows until it
  reaches 64K.
  This behavior can be later enhanced by introducing a bitmap for
  corrupted blocks.

=== Patchset structure ===

Patch 01~04:    The missing patches for metadata write path
                My bad, during previous submission I forgot them.
                No code change, just re-send.
Patch 05~08:    Cleanups and small refactors.
Patch 09~13:    Code refactors around btrfs_invalidate() and endio
                This is one critical part for subpage.
                Although this part has no subpage related code yet, just
                pure refactor.
Patch 14~15:    Refactor around __precess_pages_contig() for incoming
                subpage support.
--- Above are all refactors/cleanups ---
Patch 16~31:    The main part of subpage support
Patch 32~39:    Subpage code corner case fixes
--- Above is the main part of the subpage support ---
Patch 40:       Refactor submit_extent_page() for incoming subpage
                support.
                This refactor would also reduce the overhead for X86, as
                it removed the per-page boundary check, making the check
                only executed once for one bio.
Patch 41:       Make submit_extent_page() able to split large page to
                two bios. A subpage specific requirement.
Patch 42:       Enable subpage data write path.


Qu Wenruo (42):
  btrfs: introduce end_bio_subpage_eb_writepage() function
  btrfs: introduce write_one_subpage_eb() function
  btrfs: make lock_extent_buffer_for_io() to be subpage compatible
  btrfs: introduce submit_eb_subpage() to submit a subpage metadata page
  btrfs: remove the unused parameter @len for btrfs_bio_fits_in_stripe()
  btrfs: allow btrfs_bio_fits_in_stripe() to accept bio without any page
  btrfs: use u32 for length related members of btrfs_ordered_extent
  btrfs: pass btrfs_inode into btrfs_writepage_endio_finish_ordered()
  btrfs: refactor how we finish ordered extent io for endio functions
  btrfs: update the comments in btrfs_invalidatepage()
  btrfs: refactor btrfs_invalidatepage()
  btrfs: make Private2 lifespan more consistent
  btrfs: rename PagePrivate2 to PageOrdered inside btrfs
  btrfs: pass bytenr directly to __process_pages_contig()
  btrfs: refactor the page status update into process_one_page()
  btrfs: provide btrfs_page_clamp_*() helpers
  btrfs: only require sector size alignment for
    end_bio_extent_writepage()
  btrfs: make btrfs_dirty_pages() to be subpage compatible
  btrfs: make __process_pages_contig() to handle subpage
    dirty/error/writeback status
  btrfs: make end_bio_extent_writepage() to be subpage compatible
  btrfs: make process_one_page() to handle subpage locking
  btrfs: introduce helpers for subpage ordered status
  btrfs: make page Ordered bit to be subpage compatible
  btrfs: update locked page dirty/writeback/error bits in
    __process_pages_contig
  btrfs: prevent extent_clear_unlock_delalloc() to unlock page not
    locked by __process_pages_contig()
  btrfs: make btrfs_set_range_writeback() subpage compatible
  btrfs: make __extent_writepage_io() only submit dirty range for
    subpage
  btrfs: add extra assert for submit_extent_page()
  btrfs: make btrfs_truncate_block() to be subpage compatible
  btrfs: make btrfs_page_mkwrite() to be subpage compatible
  btrfs: reflink: make copy_inline_to_page() to be subpage compatible
  btrfs: fix the filemap_range_has_page() call in
    btrfs_punch_hole_lock_range()
  btrfs: don't clear page extent mapped if we're not invalidating the
    full page
  btrfs: extract relocation page read and dirty part into its own
    function
  btrfs: make relocate_one_page() to handle subpage case
  btrfs: fix wild subpage writeback which does not have ordered extent.
  btrfs: disable inline extent creation for subpage
  btrfs: skip validation for subpage read repair
  btrfs: make free space cache size consistent across different
    PAGE_SIZE
  btrfs: refactor submit_extent_page() to make bio and its flag tracing
    easier
  btrfs: allow submit_extent_page() to do bio split for subpage
  btrfs: allow read-write for 4K sectorsize on 64K page size systems

 fs/btrfs/block-group.c       |   18 +-
 fs/btrfs/compression.c       |    4 +-
 fs/btrfs/ctree.h             |   18 +-
 fs/btrfs/disk-io.c           |   13 +-
 fs/btrfs/extent_io.c         | 1053 +++++++++++++++++++++++++---------
 fs/btrfs/extent_io.h         |   15 +-
 fs/btrfs/file.c              |   19 +-
 fs/btrfs/inode.c             |  402 ++++++-------
 fs/btrfs/ioctl.c             |    7 +
 fs/btrfs/ordered-data.c      |  195 +++++--
 fs/btrfs/ordered-data.h      |   31 +-
 fs/btrfs/reflink.c           |   14 +-
 fs/btrfs/relocation.c        |  249 ++++----
 fs/btrfs/subpage.c           |  151 ++++-
 fs/btrfs/subpage.h           |   31 +
 fs/btrfs/super.c             |    7 -
 fs/btrfs/sysfs.c             |    5 +
 fs/btrfs/volumes.c           |    5 +-
 fs/btrfs/volumes.h           |    2 +-
 include/trace/events/btrfs.h |   19 +-
 20 files changed, 1553 insertions(+), 705 deletions(-)

-- 
2.31.1

Reply via email to