From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH v5 00/18] btrfs: add read-only support for subpage sector size
Date: Tue, 26 Jan 2021 16:33:44 +0800 [thread overview]
Message-ID: <20210126083402.142577-1-wqu@suse.com> (raw)
Patches can be fetched from github:
https://github.com/adam900710/linux/tree/subpage
Currently the branch also contains partial RW data support (still some
ordered extent and data csum mismatch problems)
Great thanks to David/Nikolay/Josef for their effort reviewing and
merging the preparation patches into misc-next.
=== What works ===
Just from the patchset:
- Data read
Both regular and compressed data, with csum check.
- Metadata read
This means, with these patchset, 64K page systems can at least mount
btrfs with 4K sector size read-only.
This should provide the ability to migrate data at least.
While on the github branch, there are already experimental RW supports,
there are still ordered extent related bugs for me to fix.
Thus only the RO part is sent for review and testing.
=== Patchset structure ===
Patch 01~02: Preparation patches which don't have functional change
Patch 03~12: Subpage metadata allocation and freeing
Patch 13~15: Subpage metadata read path
Patch 16~17: Subpage data read path
Patch 18: Enable subpage RO support
=== Changelog ===
v1:
- Separate the main implementation from previous huge patchset
Huge patchset doesn't make much sense.
- Use bitmap implementation
Now page::private will be a pointer to btrfs_subpage structure, which
contains bitmaps for various page status.
v2:
- Use page::private as btrfs_subpage for extra info
This replace old extent io tree based solution, which reduces latency
and don't require memory allocation for its operations.
- Cherry-pick new preparation patches from RW development
Those new preparation patches improves the readability by their own.
v3:
- Make dummy extent buffer to follow the same subpage accessors
Fsstress exposed several ASSERT() for dummy extent buffers.
It turns out we need to make dummy extent buffer to own the same
btrfs_subpage structure to make eb accessors to work properly
- Two new small __process_pages_contig() related preparation patches
One to make __process_pages_contig() to enhance the error handling
path for locked_page, one to merge one macro.
- Extent buffers refs count update
Except try_release_extent_buffer(), all other eb uses will try to
increase the ref count of the eb.
For try_release_extent_buffer(), the eb refs check will happen inside
the rcu critical section to avoid eb being freed.
- Comment updates
Addressing the comments from the mail list.
v4:
- Get rid of btrfs_subpage::tree_block_bitmap
This is to reduce lock complexity (no need to bother extra subpage
lock for metadata, all locks are existing locks)
Now eb looking up mostly depends on radix tree, with small help from
btrfs_subpage::under_alloc.
Now I haven't experieneced metadata related problems any more during
my local fsstress tests.
- Fix a race where metadata page dirty bit can race
Fixed in the metadata RW patchset though.
- Rebased to latest misc-next branch
With 4 patches removed, as they are already in misc-next.
v5:
- Use the updated version from David as base
Most comment/commit message update should be kept as is.
- A new separate patch to move UNMAPPED bit set timing
- New comment on why we need to prealloc subpage inside a loop
Mostly for further 16K page size support, where we can have
eb across multiple pages.
- Remove one patch which is too RW specific
Since it introduces functional change which only makes sense for RW
support, it's not a good idea to include it in RO support.
- Error handling fixes
Great thanks to Josef.
- Refactor btrfs_subpage allocation/freeing
Now we have btrfs_alloc_subpage() and btrfs_free_subpage() helpers to
do all the allocation/freeing.
It's pretty easy to convert to kmem_cache using above helpers.
(already internally tested using kmem_cache without problem, in fact
it's all the problems found in kmem_cache test leads to the new
interface)
- Use btrfs_subpage::eb_refs to replace old under_alloc
This makes checking whether the page has any eb left much easier.
Qu Wenruo (18):
btrfs: merge PAGE_CLEAR_DIRTY and PAGE_SET_WRITEBACK to
PAGE_START_WRITEBACK
btrfs: set UNMAPPED bit early in btrfs_clone_extent_buffer() for
subpage support
btrfs: introduce the skeleton of btrfs_subpage structure
btrfs: make attach_extent_buffer_page() handle subpage case
btrfs: make grab_extent_buffer_from_page() handle subpage case
btrfs: support subpage for extent buffer page release
btrfs: attach private to dummy extent buffer pages
btrfs: introduce helpers for subpage uptodate status
btrfs: introduce helpers for subpage error status
btrfs: support subpage in set/clear_extent_buffer_uptodate()
btrfs: support subpage in btrfs_clone_extent_buffer
btrfs: support subpage in try_release_extent_buffer()
btrfs: introduce read_extent_buffer_subpage()
btrfs: support subpage in endio_readpage_update_page_status()
btrfs: introduce subpage metadata validation check
btrfs: introduce btrfs_subpage for data inodes
btrfs: integrate page status update for data read path into
begin/end_page_read()
btrfs: allow RO mount of 4K sector size fs on 64K page system
fs/btrfs/Makefile | 3 +-
fs/btrfs/compression.c | 10 +-
fs/btrfs/disk-io.c | 81 +++++-
fs/btrfs/extent_io.c | 485 ++++++++++++++++++++++++++++++++----
fs/btrfs/extent_io.h | 15 +-
fs/btrfs/file.c | 24 +-
fs/btrfs/free-space-cache.c | 15 +-
fs/btrfs/inode.c | 42 ++--
fs/btrfs/ioctl.c | 8 +-
fs/btrfs/reflink.c | 5 +-
fs/btrfs/relocation.c | 11 +-
fs/btrfs/subpage.c | 278 +++++++++++++++++++++
fs/btrfs/subpage.h | 92 +++++++
fs/btrfs/super.c | 8 +-
14 files changed, 964 insertions(+), 113 deletions(-)
create mode 100644 fs/btrfs/subpage.c
create mode 100644 fs/btrfs/subpage.h
--
2.30.0
next reply other threads:[~2021-01-26 18:36 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-26 8:33 Qu Wenruo [this message]
2021-01-26 8:33 ` [PATCH v5 01/18] btrfs: merge PAGE_CLEAR_DIRTY and PAGE_SET_WRITEBACK to PAGE_START_WRITEBACK Qu Wenruo
2021-01-27 15:56 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 02/18] btrfs: set UNMAPPED bit early in btrfs_clone_extent_buffer() for subpage support Qu Wenruo
2021-01-27 15:56 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 03/18] btrfs: introduce the skeleton of btrfs_subpage structure Qu Wenruo
2021-01-26 8:33 ` [PATCH v5 04/18] btrfs: make attach_extent_buffer_page() handle subpage case Qu Wenruo
2021-01-27 16:01 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 05/18] btrfs: make grab_extent_buffer_from_page() " Qu Wenruo
2021-01-27 16:20 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 06/18] btrfs: support subpage for extent buffer page release Qu Wenruo
2021-01-27 16:21 ` Josef Bacik
2021-02-01 15:32 ` David Sterba
2021-01-26 8:33 ` [PATCH v5 07/18] btrfs: attach private to dummy extent buffer pages Qu Wenruo
2021-01-27 16:21 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 08/18] btrfs: introduce helpers for subpage uptodate status Qu Wenruo
2021-01-27 16:34 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 09/18] btrfs: introduce helpers for subpage error status Qu Wenruo
2021-01-27 16:34 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 10/18] btrfs: support subpage in set/clear_extent_buffer_uptodate() Qu Wenruo
2021-01-27 16:35 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 11/18] btrfs: support subpage in btrfs_clone_extent_buffer Qu Wenruo
2021-01-27 16:35 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 12/18] btrfs: support subpage in try_release_extent_buffer() Qu Wenruo
2021-01-27 16:37 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 13/18] btrfs: introduce read_extent_buffer_subpage() Qu Wenruo
2021-01-27 16:39 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 14/18] btrfs: support subpage in endio_readpage_update_page_status() Qu Wenruo
2021-01-27 16:42 ` Josef Bacik
2021-01-26 8:33 ` [PATCH v5 15/18] btrfs: introduce subpage metadata validation check Qu Wenruo
2021-01-27 16:47 ` Josef Bacik
2021-01-26 8:34 ` [PATCH v5 16/18] btrfs: introduce btrfs_subpage for data inodes Qu Wenruo
2021-01-27 16:56 ` Josef Bacik
2021-02-01 15:42 ` David Sterba
2021-01-26 8:34 ` [PATCH v5 17/18] btrfs: integrate page status update for data read path into begin/end_page_read() Qu Wenruo
2021-01-27 17:13 ` Josef Bacik
2021-02-01 15:47 ` David Sterba
2021-01-26 8:34 ` [PATCH v5 18/18] btrfs: allow RO mount of 4K sector size fs on 64K page system Qu Wenruo
2021-01-27 17:13 ` Josef Bacik
2021-02-01 15:49 ` David Sterba
2021-01-27 16:17 ` [PATCH v5 00/18] btrfs: add read-only support for subpage sector size Josef Bacik
2021-01-28 0:30 ` Qu Wenruo
2021-01-28 10:34 ` David Sterba
2021-01-28 10:51 ` Qu Wenruo
2021-02-01 14:50 ` David Sterba
2021-02-01 15:55 ` David Sterba
2021-02-02 9:21 ` [bug report] Unable to handle kernel paging request Anand Jain
2021-02-02 10:23 ` Qu Wenruo
2021-02-02 11:28 ` Anand Jain
2021-02-02 13:37 ` Anand Jain
2021-02-04 5:13 ` Qu Wenruo
2021-02-03 13:20 ` [PATCH v5 00/18] btrfs: add read-only support for subpage sector size David Sterba
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210126083402.142577-1-wqu@suse.com \
--to=wqu@suse.com \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.