public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/9] btrfs: used compressed_bio structure for read and write
@ 2026-01-26  3:24 Qu Wenruo
  2026-01-26  3:24 ` [PATCH 1/9] btrfs: introduce lzo_compress_bio() helper Qu Wenruo
                   ` (9 more replies)
  0 siblings, 10 replies; 13+ messages in thread
From: Qu Wenruo @ 2026-01-26  3:24 UTC (permalink / raw)
  To: linux-btrfs

[CHANGELOG]
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 | 205 +++++++++++++++++--------------------
 fs/btrfs/compression.h |  40 ++++----
 fs/btrfs/inode.c       | 219 ++++++++++++++++++++--------------------
 fs/btrfs/lzo.c         | 223 +++++++++++++++++++++++++++--------------
 fs/btrfs/zlib.c        |  64 ++++++------
 fs/btrfs/zstd.c        |  98 +++++++++---------
 6 files changed, 450 insertions(+), 399 deletions(-)

-- 
2.52.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-01-26 20:52 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-26  3:24 [PATCH v2 0/9] btrfs: used compressed_bio structure for read and write Qu Wenruo
2026-01-26  3:24 ` [PATCH 1/9] btrfs: introduce lzo_compress_bio() helper Qu Wenruo
2026-01-26  3:24 ` [PATCH 2/9] btrfs: introduce zstd_compress_bio() helper Qu Wenruo
2026-01-26  3:24 ` [PATCH 3/9] btrfs: introduce zlib_compress_bio() helper Qu Wenruo
2026-01-26  3:24 ` [PATCH 4/9] btrfs: introduce btrfs_compress_bio() helper Qu Wenruo
2026-01-26 19:36   ` Boris Burkov
2026-01-26 20:51     ` Qu Wenruo
2026-01-26  3:24 ` [PATCH 5/9] btrfs: switch to btrfs_compress_bio() interface for compressed writes Qu Wenruo
2026-01-26  3:24 ` [PATCH 6/9] btrfs: remove the old btrfs_compress_folios() infrastructures Qu Wenruo
2026-01-26  3:24 ` [PATCH 7/9] btrfs: get rid of compressed_folios[] usage for compressed read Qu Wenruo
2026-01-26  3:24 ` [PATCH 8/9] btrfs: get rid of compressed_folios[] usage for encoded writes Qu Wenruo
2026-01-26  3:24 ` [PATCH 9/9] btrfs: get rid of compressed_bio::compressed_folios[] Qu Wenruo
2026-01-26 19:41 ` [PATCH v2 0/9] btrfs: used compressed_bio structure for read and write Boris Burkov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox