public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@infradead.org>
To: Jan Kara <jack@suse.cz>
Cc: linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
	Christian Brauner <brauner@kernel.org>,
	Al Viro <viro@zeniv.linux.org.uk>,
	linux-ext4@vger.kernel.org, Ted Tso <tytso@mit.edu>,
	"Tigran A. Aivazian" <aivazian.tigran@gmail.com>,
	David Sterba <dsterba@suse.com>,
	OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>,
	Muchun Song <muchun.song@linux.dev>,
	Oscar Salvador <osalvador@suse.de>,
	David Hildenbrand <david@kernel.org>,
	linux-mm@kvack.org, linux-aio@kvack.org,
	Benjamin LaHaise <bcrl@kvack.org>
Subject: Re: [PATCH 31/41] fs: Provide functions for handling mapping_metadata_bhs directly
Date: Mon, 23 Mar 2026 22:51:24 -0700	[thread overview]
Message-ID: <acImXDl7MTsmVK_U@infradead.org> (raw)
In-Reply-To: <20260320134100.20731-72-jack@suse.cz>

On Fri, Mar 20, 2026 at 02:41:26PM +0100, Jan Kara wrote:
> As part of transition toward moving mapping_metadata_bhs to fs-private
> part of the inode, provide functions for operations on this list
> directly instead of going through the inode / mapping.
> 
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>  fs/buffer.c                 | 93 +++++++++++++++++--------------------
>  include/linux/buffer_head.h | 45 ++++++++++++++----
>  2 files changed, 80 insertions(+), 58 deletions(-)
> 
> diff --git a/fs/buffer.c b/fs/buffer.c
> index c70f8027bdd1..43aca5b7969f 100644
> --- a/fs/buffer.c
> +++ b/fs/buffer.c
> @@ -467,31 +467,25 @@ EXPORT_SYMBOL(mark_buffer_async_write);
>   * a successful fsync().  For example, ext2 indirect blocks need to be
>   * written back and waited upon before fsync() returns.
>   *
> - * The functions mark_buffer_dirty_inode(), fsync_inode_buffers(),
> - * mmb_has_buffers() and invalidate_inode_buffers() are provided for the
> - * management of a list of dependent buffers in mapping_metadata_bhs struct.
> + * The functions mmb_mark_buffer_dirty(), mmb_sync_buffers(), mmb_has_buffers()
> + * and mmb_invalidate_buffers() are provided for the management of a list of
> + * dependent buffers in mapping_metadata_bhs struct.
>   *
>   * The locking is a little subtle: The list of buffer heads is protected by
>   * the lock in mapping_metadata_bhs so functions coming from bdev mapping
>   * (such as try_to_free_buffers()) need to safely get to mapping_metadata_bhs
>   * using RCU, grab the lock, verify we didn't race with somebody detaching the
>   * bh / moving it to different inode and only then proceeding.
> - *
> - * FIXME: mark_buffer_dirty_inode() is a data-plane operation.  It should
> - * take an address_space, not an inode.  And it should be called
> - * mark_buffer_dirty_fsync() to clearly define why those buffers are being
> - * queued up.
> - *
> - * FIXME: mark_buffer_dirty_inode() doesn't need to add the buffer to the
> - * list if it is already on a list.  Because if the buffer is on a list,
> - * it *must* already be on the right one.  If not, the filesystem is being
> - * silly.  This will save a ton of locking.  But first we have to ensure
> - * that buffers are taken *off* the old inode's list when they are freed
> - * (presumably in truncate).  That requires careful auditing of all
> - * filesystems (do it inside bforget()).  It could also be done by bringing
> - * b_inode back.
>   */
>  
> +void mmb_init(struct mapping_metadata_bhs *mmb, struct address_space *mapping)
> +{
> +	spin_lock_init(&mmb->lock);
> +	INIT_LIST_HEAD(&mmb->list);
> +	mmb->mapping = mapping;
> +}
> +EXPORT_SYMBOL(mmb_init);
> +
>  static void __remove_assoc_queue(struct mapping_metadata_bhs *mmb,
>  			         struct buffer_head *bh)
>  {
> @@ -533,12 +527,12 @@ bool mmb_has_buffers(struct mapping_metadata_bhs *mmb)
>  EXPORT_SYMBOL_GPL(mmb_has_buffers);
>  
>  /**
> - * sync_mapping_buffers - write out & wait upon a mapping's "associated" buffers
> - * @mapping: the mapping which wants those buffers written
> + * mmb_sync_buffers - write out & wait upon all buffers in a list
> + * @mmb: the list of buffers to write
>   *
> - * Starts I/O against the buffers at mapping->i_metadata_bhs and waits upon
> - * that I/O. Basically, this is a convenience function for fsync().  @mapping
> - * is a file or directory which needs those buffers to be written for a
> + * Starts I/O against the buffers in the given list and waits upon
> + * that I/O. Basically, this is a convenience function for fsync().  @mmb is
> + * for a file or directory which needs those buffers to be written for a
>   * successful fsync().
>   *
>   * We have conflicting pressures: we want to make sure that all
> @@ -553,9 +547,8 @@ EXPORT_SYMBOL_GPL(mmb_has_buffers);
>   * buffer stays on our list until IO completes (at which point it can be
>   * reaped).
>   */
> -int sync_mapping_buffers(struct address_space *mapping)
> +int mmb_sync_buffers(struct mapping_metadata_bhs *mmb)

mmb and buffers in the same name feels a bit redundant.

mmc_sync_all?  mapping_sync_buffers?

> +int generic_mmb_fsync_noflush(struct file *file,
> +			      struct mapping_metadata_bhs *mmb,
> +			      loff_t start, loff_t end, bool datasync)

mmb_fsync?  mapping_buffers_fsync?

> +int generic_mmb_fsync(struct file *file, struct mapping_metadata_bhs *mmb,
> +		      loff_t start, loff_t end, bool datasync)
>  {
>  	struct inode *inode = file->f_mapping->host;
>  	int ret;
>  
> -	ret = generic_buffers_fsync_noflush(file, start, end, datasync);
> +	ret = generic_mmb_fsync_noflush(file, mmb, start, end, datasync);
>  	if (!ret)
>  		ret = blkdev_issue_flush(inode->i_sb->s_bdev);
>  	return ret;
>  }
> -EXPORT_SYMBOL(generic_buffers_fsync);
> +EXPORT_SYMBOL(generic_mmb_fsync);

Same naming, but do we even need this function?  One the
mapping_metadata_bhs has to be passed in, the file system needs a
wrapper anyway, at which point open coding the flush is not really
much of a burden.


  reply	other threads:[~2026-03-24  5:51 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-20 13:40 [PATCH v2 0/41] fs: Move metadata bh tracking from address_space Jan Kara
2026-03-20 13:40 ` [PATCH 01/41] ext4: Use inode_has_buffers() Jan Kara
2026-03-20 13:40 ` [PATCH 02/41] gfs2: Don't zero i_private_data Jan Kara
2026-03-20 13:40 ` [PATCH 03/41] ntfs3: Drop pointless sync_mapping_buffers() and invalidate_inode_buffers() calls Jan Kara
2026-03-20 13:40 ` [PATCH 04/41] ocfs2: Drop pointless sync_mapping_buffers() calls Jan Kara
2026-03-23 10:46   ` Joseph Qi
2026-03-20 13:41 ` [PATCH 05/41] bdev: Drop pointless invalidate_inode_buffers() call Jan Kara
2026-03-20 13:41 ` [PATCH 06/41] ufs: Drop pointless invalidate_mapping_buffers() call Jan Kara
2026-03-20 13:41 ` [PATCH 07/41] exfat: Drop pointless invalidate_inode_buffers() call Jan Kara
2026-03-20 13:41 ` [PATCH 08/41] udf: Switch to generic_buffers_fsync() Jan Kara
2026-03-24  5:38   ` Christoph Hellwig
2026-03-24 12:24     ` Jan Kara
2026-03-20 13:41 ` [PATCH 09/41] minix: " Jan Kara
2026-03-20 13:41 ` [PATCH 10/41] bfs: " Jan Kara
2026-03-20 13:41 ` [PATCH 11/41] fat: Switch to generic_buffers_fsync_noflush() Jan Kara
2026-03-20 13:41 ` [PATCH 12/41] fs: Drop sync_mapping_buffers() from __generic_file_fsync() Jan Kara
2026-03-24  5:40   ` Christoph Hellwig
2026-03-24 12:34     ` Jan Kara
2026-03-24 13:17       ` Christoph Hellwig
2026-03-24 13:36         ` Jan Kara
2026-03-24 15:54           ` Christoph Hellwig
2026-03-25 19:01             ` Jan Kara
2026-03-20 13:41 ` [PATCH 13/41] fat: Sync and invalidate metadata buffers from fat_evict_inode() Jan Kara
2026-03-20 13:41 ` [PATCH 14/41] udf: Sync and invalidate metadata buffers from udf_evict_inode() Jan Kara
2026-03-20 13:41 ` [PATCH 15/41] minix: Sync and invalidate metadata buffers from minix_evict_inode() Jan Kara
2026-03-20 13:41 ` [PATCH 16/41] ext2: Sync and invalidate metadata buffers from ext2_evict_inode() Jan Kara
2026-03-20 13:41 ` [PATCH 17/41] ext4: Sync and invalidate metadata buffers from ext4_evict_inode() Jan Kara
2026-03-20 13:41 ` [PATCH 18/41] bfs: Sync and invalidate metadata buffers from bfs_evict_inode() Jan Kara
2026-03-20 13:41 ` [PATCH 19/41] affs: Sync and invalidate metadata buffers from affs_evict_inode() Jan Kara
2026-03-20 13:41 ` [PATCH 20/41] fs: Ignore inode metadata buffers in inode_lru_isolate() Jan Kara
2026-03-24  5:42   ` Christoph Hellwig
2026-03-24 12:51     ` Jan Kara
2026-03-20 13:41 ` [PATCH 21/41] fs: Stop using i_private_data for metadata bh tracking Jan Kara
2026-03-24  5:42   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 22/41] hugetlbfs: Stop using i_private_data Jan Kara
2026-03-24  5:42   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 23/41] aio: Stop using i_private_data and i_private_lock Jan Kara
2026-03-24  5:43   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 24/41] fs: Remove i_private_data Jan Kara
2026-03-24  5:43   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 25/41] kvm: Use private inode list instead of i_private_list Jan Kara
2026-03-24  5:44   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 26/41] fs: Drop osync_buffers_list() Jan Kara
2026-03-24  5:44   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 27/41] fs: Fold fsync_buffers_list() into sync_mapping_buffers() Jan Kara
2026-03-24  5:44   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 28/41] fs: Move metadata bhs tracking to a separate struct Jan Kara
2026-03-24  5:47   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 29/41] fs: Make bhs point to mapping_metadata_bhs Jan Kara
2026-03-24  5:48   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 30/41] fs: Switch inode_has_buffers() to take mapping_metadata_bhs Jan Kara
2026-03-24  5:48   ` Christoph Hellwig
2026-03-20 13:41 ` [PATCH 31/41] fs: Provide functions for handling mapping_metadata_bhs directly Jan Kara
2026-03-24  5:51   ` Christoph Hellwig [this message]
2026-03-25 19:00     ` Jan Kara
2026-03-20 13:41 ` [PATCH 32/41] ext2: Track metadata bhs in fs-private inode part Jan Kara
2026-03-20 13:41 ` [PATCH 33/41] affs: " Jan Kara
2026-03-20 13:41 ` [PATCH 34/41] bfs: " Jan Kara
2026-03-20 13:41 ` [PATCH 35/41] fat: " Jan Kara
2026-03-20 13:41 ` [PATCH 36/41] udf: " Jan Kara
2026-03-20 13:41 ` [PATCH 37/41] minix: " Jan Kara
2026-03-20 13:41 ` [PATCH 38/41] ext4: " Jan Kara
2026-03-20 13:41 ` [PATCH 39/41] fs: Drop mapping_metadata_bhs from address space Jan Kara
2026-03-20 13:41 ` [PATCH 40/41] fs: Drop i_private_list from address_space Jan Kara
2026-03-20 13:41 ` [PATCH 41/41] fs: Unify generic_file_fsync() with mmb methods Jan Kara
2026-03-24  5:56   ` Christoph Hellwig
2026-03-24 13:28     ` Jan Kara
2026-03-23 10:20 ` [PATCH v2 0/41] fs: Move metadata bh tracking from address_space Christian Brauner

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=acImXDl7MTsmVK_U@infradead.org \
    --to=hch@infradead.org \
    --cc=aivazian.tigran@gmail.com \
    --cc=bcrl@kvack.org \
    --cc=brauner@kernel.org \
    --cc=david@kernel.org \
    --cc=dsterba@suse.com \
    --cc=hirofumi@mail.parknet.co.jp \
    --cc=jack@suse.cz \
    --cc=linux-aio@kvack.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=muchun.song@linux.dev \
    --cc=osalvador@suse.de \
    --cc=tytso@mit.edu \
    --cc=viro@zeniv.linux.org.uk \
    /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