From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Cc: Johannes.Thumshirn@wdc.com, josef@toxicpanda.com
Subject: [PATCH v5 0/5] btrfs: subpage + zoned fixes
Date: Sat, 18 May 2024 14:37:38 +0930 [thread overview]
Message-ID: <cover.1716008374.git.wqu@suse.com> (raw)
[CHANGELOG]
v5:
- Enhance the commit message on why we should not clear page dirty
inside extent_write_locked_range()
- Reorder the patches so that no temporary list based solution for
delalloc ranges
v4:
- Rebased to the latest for-next branch
Thankfully no conflicts at all.
- Include all the previous preparation patches
It turns out I split the preparation into other series and even get
myself confused.
- Use the correct commit message from my local branch
It turns out Josef is totally correct, the problem I described in
"btrfs: do no clera page dirty inside extent_write_locked_range()" is
really confusing, it has direct IO involved and my local branch is
already using a much better commit and I just forgot it.
v3:
- Use the minimal fsstress workload with trace_printk() output to
explain the bug better
v2:
- Update the commit message for the first patch
As there is something wrong with the ASCII art of the memory layout.
[REPO]
https://github.com/adam900710/linux/tree/subpage_delalloc
If running subpage with zoned devices (TCMU emulated HDD, 64K or 16K
page size with 4K sectorsize), btrfs can easily hitting various bugs:
- ASSERT()s related to submitting page range which has no OE coverage
- Various reserved space leakage and some OE never finished
This is caused by two major reasons:
- run_delalloc_cow() is not subpage compatible
There are several different problems involved furthermore.
* extent_write_locked_range() would try to submit dirty pages beyond
the specified subpage range
Thus hit some ASSERT() that a dirty range has no corresponding OE
* extent_write_locked_range() would unlock the whole page meanwhile
we're only triggered for a subpage range
Thus causing unexpected page to be unlocked.
This would be addressed by patch 1~3 by:
* Limited the submission range to follow the subpage ranges
* Make the page unlocking part also subpage compatible, and always
lock all delalloc subpage ranges covering the current page.
- Some dirty range is not submitted thus OE would never finish
This happens due to the mismatch that extent_write_locked_range() can
clear the full page dirty, even if we're only submitting part of the
dirty ranges, causing page dirty flags desync from subpage dirty
flags.
Then later __extent_writepage_io() would skip a non-dirty page, as the
check is only checking the full page dirty flag, not the
subpage bitmaps.
This would be addressed by patch 4~5.
Qu Wenruo (5):
btrfs: make __extent_writepage_io() to write specified range only
btrfs: subpage: introduce helpers to handle subpage delalloc locking
btrfs: lock subpage ranges in one go for writepage_delalloc()
btrfs: do not clear page dirty inside extent_write_locked_range()
btrfs: make extent_write_locked_range() to handle subpage writeback
correctly
fs/btrfs/extent_io.c | 105 +++++++++++++++++++++++++------
fs/btrfs/subpage.c | 144 +++++++++++++++++++++++++++++++++++++++++--
fs/btrfs/subpage.h | 10 ++-
3 files changed, 233 insertions(+), 26 deletions(-)
--
2.45.0
next reply other threads:[~2024-05-18 5:08 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-18 5:07 Qu Wenruo [this message]
2024-05-18 5:07 ` [PATCH v5 1/5] btrfs: make __extent_writepage_io() to write specified range only Qu Wenruo
2024-05-21 7:23 ` Naohiro Aota
2024-05-18 5:07 ` [PATCH v5 2/5] btrfs: subpage: introduce helpers to handle subpage delalloc locking Qu Wenruo
2024-05-21 7:50 ` Naohiro Aota
2024-05-21 7:57 ` Qu Wenruo
2024-05-18 5:07 ` [PATCH v5 3/5] btrfs: lock subpage ranges in one go for writepage_delalloc() Qu Wenruo
2024-05-21 8:11 ` Naohiro Aota
2024-05-21 8:45 ` Qu Wenruo
2024-05-21 11:54 ` Naohiro Aota
2024-05-21 22:16 ` Qu Wenruo
2024-05-22 1:10 ` Naohiro Aota
2024-05-18 5:07 ` [PATCH v5 4/5] btrfs: do not clear page dirty inside extent_write_locked_range() Qu Wenruo
2024-05-18 5:07 ` [PATCH v5 5/5] btrfs: make extent_write_locked_range() to handle subpage writeback correctly Qu Wenruo
2024-05-21 7:13 ` Naohiro Aota
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=cover.1716008374.git.wqu@suse.com \
--to=wqu@suse.com \
--cc=Johannes.Thumshirn@wdc.com \
--cc=josef@toxicpanda.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.