Re: [PATCH v2] fs/buffer: serialize set_buffer_uptodate against concurrent clears
Matthew Wilcox <[email protected]> Fri, 31 Jul 2026 01:45:35 +0100
| Newsgroups | org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On Thu, Jul 30, 2026 at 06:09:24PM -0400, Chris S wrote: > Yes, that works. And appreciate your reply. > I prototyped it, and it survives a journal replay. > > Six sites, with bio_add_virt_nofail() covering the submit side: > > bh_offset() b_page may be NULL > buffer_set_crypto_ctx() NULL guard > __bh_submit() bio_add_virt_nofail() when !b_folio, and > skip wbc_account_cgroup_owner() > jbd2_journal_write_metadata_buffer() > b_folio = NULL, b_data = > jh->b_frozen_data, not folio_set_bh() > jbd2_checksum_data(), jbd2_block_tag_csum_set() both kmap the temp bh > (fs/jbd2/commit.c:705 and :745) > > 4 files, +38/-12. I'll send it as the first patch of the series. Fantastic. Would you care to also include this patch as part of your series? From f7cd3419ce0518ba429ac854282888833bf60147 Mon Sep 17 00:00:00 2001 From: "Matthew Wilcox (Oracle)" <[email protected]> Date: Thu, 30 Jul 2026 20:43:22 -0400 Subject: [PATCH] buffer_head: Remove b_page All users except bh_offset() have been converted to use b_folio instead. Convert bh_offset() and remove b_page. Signed-off-by: Matthew Wilcox (Oracle) <[email protected]> --- include/linux/buffer_head.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 8b23bc9a244c..3881141a3ff1 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -59,10 +59,7 @@ struct address_space; struct buffer_head { unsigned long b_state; /* buffer state bitmap (see above) */ struct buffer_head *b_this_page;/* circular list of page's buffers */ - union { - struct page *b_page; /* the page this bh is mapped to */ - struct folio *b_folio; /* the folio this bh is mapped to */ - }; + struct folio *b_folio; /* the folio this bh is mapped to */ sector_t b_blocknr; /* start block number */ size_t b_size; /* size of mapping */ @@ -172,7 +169,7 @@ static __always_inline int buffer_uptodate(const struct buffer_head *bh) static inline unsigned long bh_offset(const struct buffer_head *bh) { - return (unsigned long)(bh)->b_data & (page_size(bh->b_page) - 1); + return (unsigned long)(bh)->b_data & (folio_size(bh->b_folio) - 1); } /* If we *know* page->private refers to buffer_heads */ -- 2.47.3