public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
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


             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