diff mbox series

[1/2] btrfs: add mapping_set_release_always to inode's mapping

Message ID 443ee47643ddd60d6bd6bfede4a73beec5798695.1741631234.git.rgoldwyn@suse.com (mailing list archive)
State New
Headers show
Series Avoid setting folio->private | expand

Commit Message

Goldwyn Rodrigues March 10, 2025, 7:29 p.m. UTC
From: Goldwyn Rodrigues <rgoldwyn@suse.com>

BTRFS has been setting folio->private in order to get a callback to
release_folio() before a folio is released. This can also be performed
by the AS_RELEASE_ALWAYS flags set in the mapping->flags.
Calling mapping_set_release_always() on inode's address_space during
inode initialization will make unnecessary to setup folio->private for
every folio.

Setting the flag will call release_folio() for every folio
under the mapping without the need of setting folio->private. This will
eventually help btrfs move to iomap since iomap also uses folio->private
for iomap_folio_state.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
---
 fs/btrfs/extent_io.c | 2 +-
 fs/btrfs/file.c      | 2 +-
 fs/btrfs/inode.c     | 3 +++
 3 files changed, 5 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index a78ff093ea37..297b7168a7d6 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -491,7 +491,7 @@  static void begin_folio_read(struct btrfs_fs_info *fs_info, struct folio *folio)
 	if (!btrfs_is_subpage(fs_info, folio->mapping))
 		return;
 
-	ASSERT(folio_test_private(folio));
+	ASSERT(mapping_release_always(folio->mapping));
 	btrfs_folio_set_lock(fs_info, folio, folio_pos(folio), PAGE_SIZE);
 }
 
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 643f101c7340..160e4030ca60 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -833,7 +833,7 @@  static int prepare_uptodate_folio(struct inode *inode, struct folio *folio, u64
 	 * The private flag check is essential for subpage as we need to store
 	 * extra bitmap using folio private.
 	 */
-	if (folio->mapping != inode->i_mapping || !folio_test_private(folio)) {
+	if (folio->mapping != inode->i_mapping || !mapping_release_always(folio->mapping)) {
 		folio_unlock(folio);
 		return -EAGAIN;
 	}
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index e7e6accbaf6c..02ff9c449b35 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -5616,6 +5616,8 @@  static int btrfs_init_locked_inode(struct inode *inode, void *p)
 	btrfs_set_inode_number(BTRFS_I(inode), args->ino);
 	BTRFS_I(inode)->root = btrfs_grab_root(args->root);
 
+	mapping_set_release_always(inode->i_mapping);
+
 	if (args->root && args->root == args->root->fs_info->tree_root &&
 	    args->ino != BTRFS_BTREE_INODE_OBJECTID)
 		set_bit(BTRFS_INODE_FREE_SPACE_INODE,
@@ -6698,6 +6700,7 @@  static int btrfs_create(struct mnt_idmap *idmap, struct inode *dir,
 	inode->i_fop = &btrfs_file_operations;
 	inode->i_op = &btrfs_file_inode_operations;
 	inode->i_mapping->a_ops = &btrfs_aops;
+	mapping_set_release_always(inode->i_mapping);
 	return btrfs_create_common(dir, dentry, inode);
 }