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