Btrfs assumes block size to be the same as the machine's page size. This would mean that a Btrfs instance created on a 4k page size machine (e.g. x86) will not be mountable on machines with larger page sizes (e.g. PPC64/AARCH64). This patchset aims to resolve this incompatibility. This patchset continues with the work posted previously at https://lwn.net/Articles/646937/. I have reverted the upstream commit "btrfs: fix lockups from btrfs_clear_path_blocking" (f82c458a2c3ffb94b431fc6ad791a79df1b3713e) since this led to soft-lockups when the patch "Btrfs: subpagesize-blocksize: Prevent writes to an extent buffer when PG_writeback flag is set" is applied. The commits for the Btrfs kernel module can be found at https://github.com/chandanr/linux/tree/btrfs/subpagesize-blocksize. The commits for Btrfs-progs can be found at https://github.com/chandanr/btrfs-progs/tree/btrfs/subpagesize-blocksize. Changes from V11: 1. Addressed the review comments provided by Liu Bo for version V11. 2. Fixed file defragmentation code to work in subpagesize-blocksize scenario. 3. Many "hard to reproduce" bugs were fixed. fstests run status: 1. On x86_64, all the tests (i.e. both generic and btrfs specific tests) pass - With 2k and 4k data blocksize combinations. - With and without nodatacow option. 2. On ppc64, generic tests were run with 4k data block size and 16k metadata block size. generic/300 fails because of an issue with the fio tool. The failure is seen even when running the test for other filesystems (i.e. ext4 and xfs). The following is a list of known TODO items which will be implemented in future revisions of this patchset: 1. Currently, We read one metadata block at a time. Pages mapping multiple extent buffers are currently marked with PG_Uptodate flag only when all the extent buffers of the page have EXTENT_UPTODATE flag set. Some of the blocks mapped by the page may not even contain a valid metadata block. Hence such pages can never have PG_Uptodate flag set. 2. Fix btrfs_assert_tree_locked() invocation (inside "#if DEBUG") in btree_set_page_dirty(). Chandan Rajendra (14): Btrfs: subpagesize-blocksize: Fix whole page read. Btrfs: subpagesize-blocksize: Fix whole page write Btrfs: subpagesize-blocksize: Make sure delalloc range intersects with the locked page's range Btrfs: subpagesize-blocksize: Define extent_buffer_head. Btrfs: subpagesize-blocksize: Read tree blocks whose size is < PAGE_SIZE. Btrfs: subpagesize-blocksize: Write only dirty extent buffers belonging to a page Btrfs: subpagesize-blocksize: Allow mounting filesystems where sectorsize != PAGE_SIZE Btrfs: subpagesize-blocksize: Deal with partial ordered extent allocations. Btrfs: subpagesize-blocksize: Explicitly track I/O status of blocks of an ordered extent. Btrfs: subpagesize-blocksize: btrfs_punch_hole: Use EXTENT_UPTODATE bit to check for the presence of block in page cache Btrfs: subpagesize-blocksize: Prevent writes to an extent buffer when PG_writeback flag is set. Revert "btrfs: fix lockups from btrfs_clear_path_blocking" Btrfs: subpagesize-blocksize: Fix file defragmentation code Btrfs: subpagesize-blocksize: extent_clear_unlock_delalloc: Prevent page from being unlocked more than once fs/btrfs/backref.c | 2 +- fs/btrfs/btrfs_inode.h | 2 - fs/btrfs/ctree.c | 37 +- fs/btrfs/ctree.h | 6 +- fs/btrfs/disk-io.c | 161 +++-- fs/btrfs/disk-io.h | 3 + fs/btrfs/extent-tree.c | 17 +- fs/btrfs/extent_io.c | 1608 ++++++++++++++++++++++++++++++------------ fs/btrfs/extent_io.h | 102 ++- fs/btrfs/file.c | 20 +- fs/btrfs/inode.c | 494 +++++++++---- fs/btrfs/ioctl.c | 194 +++-- fs/btrfs/locking.c | 24 +- fs/btrfs/locking.h | 2 - fs/btrfs/ordered-data.c | 19 + fs/btrfs/ordered-data.h | 4 + fs/btrfs/relocation.c | 3 + fs/btrfs/root-tree.c | 2 +- fs/btrfs/volumes.c | 2 +- include/trace/events/btrfs.h | 2 +- 20 files changed, 1907 insertions(+), 797 deletions(-) -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
