From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org
Subject: [PATCH v5 0/9] btrfs: used compressed_bio structure for read and write
Date: Thu, 29 Jan 2026 13:53:37 +1030 [thread overview]
Message-ID: <cover.1769656714.git.wqu@suse.com> (raw)
[CHANGELOG]
v5:
- Implement an internal compress_bio_last_folio()
Upstream is removing bio_last_bvec_all(), and the recent stable page
bouncing for direct IO is going to make that function no longer
reliable.
Thus we need to implement it locally, with some extra ASSERT()s to
make sure the compressed bio have all folio sizes fixed to
min_folio_size, so that we can use offset_in_folio(folio, bi_size) to
calculate the last position.
- Fix several spelling errors
jut -> just in patch 5 and chaning -> changing in patch 7.
v4:
- Fix a missing kunmap_local() introduced in encoded write changes
Which only affects 32bit systems.
- Fix an incorrect unlikely() usage introduced in encoded write changes
Which will not cause any observable problem but completely flips the
intention.
- Fix an allocation loop bug for bs > ps cases in encoded write changes
The encoded write has migrated to use btrfs_alloc_compr_folio() which
respects the minimal folio size.
This means the old PAGE_SIZE based loop condition must also be
changed.
v3:
- Rebased to the latest for-next branch
There is a minor conflict with the format of parameter list of
get_current_folio().
- Call btrfs_free_compr_folio() during cleanup_compressed_bio()
- Make it more consistent regarding using btrfs_alloc/free_compr_folio()
The old compressed read path is using btrfs_alloc_folio_array() but
freeing them using btrfs_free_compr_folio().
This is fine but never consistent, unify it to use
btrfs_free_compr_folio() for all compressed_bio.
v2:
- Fix an error in error path of of compress_file_range()
If btrfs_compress_bio() returned an error, we should reset @cb to NULL
before doing error handling, or cleanup_compressed_bio() can be called
on an error pointer.
- Fix several bugs in zstd_compress_bio() which causes compression
failure
There are several different bugs in the mostly copy-n-pasted code:
* Uncommon @start and @len usage
The old code allows @start and @len to be modified, which is against
the more common practice nowadays.
* Fix a incorrect input buffer check
Which cause us to incorrectly end the compression early and fallback
to uncompressed write.
I was never a huge fan of the current btrfs_compress_folios() interface:
- Complex and duplicated parameter list
* A folio array to hold all folios
Which means extra error handling.
* A @nr_folios pointer
That pointer is both input and output, representing the number of max
folios, but also the number of compressed folios.
The number of input folios is not really necessary, it's always no
larger than DIV_ROUND_UP(len, PAGE_SIZE) in the first place.
* A @total_in pointer
Again an pointer as both input and output, representing the filemap
range length, and how many bytes are compressed in this run.
However if we failed to compress the full range, all supported
algorithms will return an error, thus fallback to uncompressed path.
Thus there is no need to use it as an output pointer.
* A @total_compressed point
Again an pointer as both input and output, representing the max
number of compressed size, and the final compressed size.
However we do not need it as an input at all, we always error out
if the compressed size is larger than the original size.
- Extra error cleanup handling
We need to cleanup the compressed_folios[] array during error
handling.
Replace the old btrfs_compress_folios() interface with
btrfs_compress_bio(), which has the following benefits:
- Simplified parameter list
* inode
* start
* len
* compress_type
* compress_level
* write_flags
No parameter is sharing input and output members, and all are very
straightforward (except the last write_flags, which is just an extra
bio flag).
- Directly return a compressed_bio structure
With minor modifications, that pointer can be passed to
btrfs_submit_bio().
The caller still needs to do proper round up and fill the proper
disk_bytenr/num_bytes before submission.
And for error handling, simply call cleanup_compressed_bio() then
everything is cleaned up properly (at least I hope so).
- No more extra folios array passing and error handling
Qu Wenruo (9):
btrfs: introduce lzo_compress_bio() helper
btrfs: introduce zstd_compress_bio() helper
btrfs: introduce zlib_compress_bio() helper
btrfs: introduce btrfs_compress_bio() helper
btrfs: switch to btrfs_compress_bio() interface for compressed writes
btrfs: remove the old btrfs_compress_folios() infrastructures
btrfs: get rid of compressed_folios[] usage for compressed read
btrfs: get rid of compressed_folios[] usage for encoded writes
btrfs: get rid of compressed_bio::compressed_folios[]
fs/btrfs/compression.c | 208 ++++++++++++++++------------------
fs/btrfs/compression.h | 40 ++++---
fs/btrfs/inode.c | 251 ++++++++++++++++++++++-------------------
fs/btrfs/lzo.c | 223 ++++++++++++++++++++++++------------
fs/btrfs/zlib.c | 64 ++++++-----
fs/btrfs/zstd.c | 98 ++++++++--------
6 files changed, 482 insertions(+), 402 deletions(-)
--
2.52.0
next reply other threads:[~2026-01-29 3:24 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-29 3:23 Qu Wenruo [this message]
2026-01-29 3:23 ` [PATCH v5 1/9] btrfs: introduce lzo_compress_bio() helper Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 2/9] btrfs: introduce zstd_compress_bio() helper Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 3/9] btrfs: introduce zlib_compress_bio() helper Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 4/9] btrfs: introduce btrfs_compress_bio() helper Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 5/9] btrfs: switch to btrfs_compress_bio() interface for compressed writes Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 6/9] btrfs: remove the old btrfs_compress_folios() infrastructures Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 7/9] btrfs: get rid of compressed_folios[] usage for compressed read Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 8/9] btrfs: get rid of compressed_folios[] usage for encoded writes Qu Wenruo
2026-01-29 3:23 ` [PATCH v5 9/9] btrfs: get rid of compressed_bio::compressed_folios[] Qu Wenruo
2026-02-03 6:35 ` [PATCH v5 0/9] btrfs: used compressed_bio structure for read and write 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=cover.1769656714.git.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox