From: Qu Wenruo <wqu@suse.com>
To: Christoph Hellwig <hch@infradead.org>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH v3 8/9] btrfs: prepare btrfs_end_repair_bio() for larger data folios
Date: Mon, 7 Apr 2025 16:41:09 +0930 [thread overview]
Message-ID: <ef4c97e8-e39d-4d41-a5dc-95464bc0e5af@suse.com> (raw)
In-Reply-To: <Z_NuL8Ucl0FCZ64A@infradead.org>
在 2025/4/7 15:48, Christoph Hellwig 写道:
> On Mon, Mar 17, 2025 at 05:40:53PM +1030, Qu Wenruo wrote:
>> In above case, the real folio should be folio_b, and offset inside that
>> folio should be:
>>
>> bv_offset - ((&folio_b->page - &folio_a->page) << PAGE_SHIFT).
>>
>> With these changes, now btrfs_end_repair_bio() is able to handle larger
>> folios properly.
>
> Please stop messing with internals like bv_offset and bv_page entirely
> if you can, as that makes the pending conversion of the bio_vec to store
> a physical address much harder.
Well, I know this version is bad and it is already causing bugs when I
enabled large folios.
I have a better solution in the latest version to calculate the offset
inside the folio, but not sure if it still counts as messing with internals:
struct page *real_page = bv->bv_page +
(bv->bv_offset >> PAGE_SHIFT);
struct folio *folio = page_folio(real_page);
return (folio_page_idx(folio, real_page) << PAGE_SHIFT) +
offset_in_page(bv->bv_offset);
The latest version can be found here just for reference, with the corner
case taken into consideration.
https://lore.kernel.org/linux-btrfs/f679cbeedbb0132cc657b4db7a1d3d70ff2261f0.1744005845.git.wqu@suse.com/T/#u
>
> Looking at the code the best way to handle this would be to simply
> split btrfs_repair_io_failure so that there is a helper for the code
> before the bio_init call. btrfs_repair_eb_io_failure (or a new helper
> called by it) then open codes the existing logic using bio_add_folio
> (it could in fact use bio_add_folio_nofail instead), while
> btrfs_end_repair_bio should just copy the existing bio_vec over
> using an assignment or mempcy.
I guess "btrfs_repair_eb_io_failure" here is just a typo, as we're only
talking about data read-repair.
Mind to give some pseudo code example? As I still didn't catch all the
points.
There are quite some direct bv_page/bv_len/bv_offset usage inside
fs/btrfs/bio.c, and to my uneducated eyes it looks like we will need a
way to convert bio_vec to folio+offset anyway, as long as we're still
using bio_vec as btrfs_bio::saved_iter.
Thanks,
Qu
next prev parent reply other threads:[~2025-04-07 7:11 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-17 7:10 [PATCH v3 0/9] btrfs: remove ASSERT()s for folio_order() and folio_test_large() Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 1/9] btrfs: send: remove the again label inside put_file_data() Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 2/9] btrfs: send: prepare put_file_data() for larger data folios Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 3/9] btrfs: prepare btrfs_page_mkwrite() " Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 4/9] btrfs: prepare prepare_one_folio() " Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 5/9] btrfs: prepare end_bbio_data_write() " Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 6/9] btrfs: subpage: prepare " Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 7/9] btrfs: zlib: prepare copy_data_into_buffer() " Qu Wenruo
2025-03-17 7:10 ` [PATCH v3 8/9] btrfs: prepare btrfs_end_repair_bio() " Qu Wenruo
2025-04-03 19:56 ` David Sterba
2025-04-06 23:19 ` Qu Wenruo
2025-04-07 6:18 ` Christoph Hellwig
2025-04-07 7:11 ` Qu Wenruo [this message]
2025-03-17 7:10 ` [PATCH v3 9/9] btrfs: enable larger data folios support for defrag Qu Wenruo
2025-03-17 13:55 ` [PATCH v3 0/9] btrfs: remove ASSERT()s for folio_order() and folio_test_large() David Sterba
2025-03-17 15:13 ` David Sterba
2025-03-31 4:47 ` Qu Wenruo
2025-04-03 19:54 ` David Sterba
2025-04-03 21:45 ` Qu Wenruo
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=ef4c97e8-e39d-4d41-a5dc-95464bc0e5af@suse.com \
--to=wqu@suse.com \
--cc=hch@infradead.org \
--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