Linux Btrfs filesystem development
 help / color / mirror / Atom feed
* [PATCH v3 0/4] btrfs: removal of on-stack paddrs[], final part
@ 2026-07-14  6:49 Qu Wenruo
  2026-07-14  6:49 ` [PATCH v3 1/4] btrfs: replace btrfs_repair_io_failure() to use bio for page iteration Qu Wenruo
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Qu Wenruo @ 2026-07-14  6:49 UTC (permalink / raw)
  To: linux-btrfs

[CHANGELOG]
v3:
- Rebased to the latest for-next
  There is a fix in RAID56, which can cause conflicts with the last
  patch

- Remove all remaining on-stack paddrs[] usage
  There are two last ones in RAID56, one can be converted to use bio
  interface, the other is not using on-stack paddrs[] array.

  So we can finally remove all on-stack paddrs[] usage.

v2:
- Fix a missing assignment for metadata repair
  The logical should be assigned before passing it to
  btrfs_repair_bbio_failure().

- Move the commit message of error message change to the correct patch
  It's changed in the first patch not the last one.

Since the experimental bs > ps support, several on-stack fixed paddrs[]
arrays are introduced, for assemble mutli-page sized fs blocks.

However that on-stack memory usage is always there for 4K page sized
systems, no matter if the block size of the filesystem.

This series is part 1 of such on-stack paddrs[] cleanup.

The idea is to use bio interface for page iterations, the core idea is
to use a const bvec_iter as the pointer to where the block is.

Then we save a local bevc_iter, and use the local iter to check the next
few pages until we fill a full block.

Furthermore, with the help of bvec_iter, we can remove a lot of
parameters:

- file_offset
- logical
- bio_offset
  All can be generated by using the @iter passed in and the
  bbio->saved_iter to calculate the old @bio_offset.

  @bio_offset is the (iter.bi_sector - saved_iter.bi_sector) <<
  SECTOR_SHIFT.
  As when bvec_iter is advanced, its bi_sector is also increased.

  @logical is simpler, just iter.bi_sector << SECTOR_SHIFT.

  @file_offset is the bbio->file_offset + bio_offset.

This means we no longer need to use on-stack paddrs[] to csum
generation.

With bio interfaces, the iteration of an fs block is as simple as the
following: (I tried to change the page/pg_off/cur_len into a macro just
like btrfs_bio_for_each_block(), but failed)

	u32 cur = 0;

	btrfs_csum_init(&cctx, fs_info->csum_type);
	while (cur < blocksize) {
		struct page *page = bio_iter_page(&bbio->bio, iter);
		const u32 pg_off = bio_iter_offset(&bbio->bio, iter);
		const u32 cur_len = min(bio_iter_len(&bbio->bio, iter), blocksize - cur);
		void *kaddr;

		kaddr = kmap_local_page(page) + pg_off;
		btrfs_csum_update(&cctx, kaddr, cur_len);
		kunmap_local(kaddr);

		bio_advance_iter_single(&bbio->bio, &iter, cur_len);
		cur += cur_len;
	}
	btrfs_csum_final(&cctx, csum);

However there are still some callers left:

- Scrub
  That's already addressed in another series accidentially
  (https://lore.kernel.org/linux-btrfs/cover.1782795330.git.wqu@suse.com/)

  That will be last user of btrfs_check_block_csum().

- RAID56
  That will be only location left without a bio.
  In that case we can easily craft a local helper to do csum generation
  without using on-stack paddrs[].

Qu Wenruo (4):
  btrfs: replace btrfs_repair_io_failure() to use bio for page iteration
  btrfs: enhance btrfs_data_csum_ok() to use bio for page iteration
  btrfs: use a shared helper to calculate data checksum for a bio
  btrfs: remove on-stack paddrs[] array usage

 fs/btrfs/bio.c         | 140 +++++++++++++++++++----------------------
 fs/btrfs/bio.h         |   5 +-
 fs/btrfs/btrfs_inode.h |  12 ++--
 fs/btrfs/disk-io.c     |  25 +++++---
 fs/btrfs/file-item.c   |  20 ++----
 fs/btrfs/inode.c       | 114 +++++++++++----------------------
 fs/btrfs/raid56.c      |  47 ++++++++------
 7 files changed, 159 insertions(+), 204 deletions(-)

-- 
2.54.0


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

end of thread, other threads:[~2026-07-14  6:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-14  6:49 [PATCH v3 0/4] btrfs: removal of on-stack paddrs[], final part Qu Wenruo
2026-07-14  6:49 ` [PATCH v3 1/4] btrfs: replace btrfs_repair_io_failure() to use bio for page iteration Qu Wenruo
2026-07-14  6:49 ` [PATCH v3 2/4] btrfs: enhance btrfs_data_csum_ok() " Qu Wenruo
2026-07-14  6:49 ` [PATCH v3 3/4] btrfs: use a shared helper to calculate data checksum for a bio Qu Wenruo
2026-07-14  6:49 ` [PATCH v3 4/4] btrfs: remove on-stack paddrs[] array usage Qu Wenruo

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