diff mbox series

[08/11] shmem: Add shmem_writeout()

Message ID 20250307135414.2987755-9-willy@infradead.org (mailing list archive)
State New
Headers show
Series Remove aops->writepage | expand

Commit Message

Matthew Wilcox March 7, 2025, 1:54 p.m. UTC
This will be the replacement for shmem_writepage().

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
 include/linux/shmem_fs.h |  7 ++++---
 mm/shmem.c               | 20 ++++++++++++++------
 2 files changed, 18 insertions(+), 9 deletions(-)

Comments

Baolin Wang March 8, 2025, 5:31 a.m. UTC | #1
On 2025/3/7 21:54, Matthew Wilcox (Oracle) wrote:
> This will be the replacement for shmem_writepage().
> 
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>

LGTM.
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>

> ---
>   include/linux/shmem_fs.h |  7 ++++---
>   mm/shmem.c               | 20 ++++++++++++++------
>   2 files changed, 18 insertions(+), 9 deletions(-)
> 
> diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
> index 0b273a7b9f01..5f03a39a26f7 100644
> --- a/include/linux/shmem_fs.h
> +++ b/include/linux/shmem_fs.h
> @@ -104,10 +104,11 @@ static inline bool shmem_mapping(struct address_space *mapping)
>   	return false;
>   }
>   #endif /* CONFIG_SHMEM */
> -extern void shmem_unlock_mapping(struct address_space *mapping);
> -extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
> +void shmem_unlock_mapping(struct address_space *mapping);
> +struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
>   					pgoff_t index, gfp_t gfp_mask);
> -extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
> +int shmem_writeout(struct folio *folio, struct writeback_control *wbc);
> +void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
>   int shmem_unuse(unsigned int type);
>   
>   #ifdef CONFIG_TRANSPARENT_HUGEPAGE
> diff --git a/mm/shmem.c b/mm/shmem.c
> index ba162e991285..427b7f70fffb 100644
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -1536,12 +1536,20 @@ int shmem_unuse(unsigned int type)
>   	return error;
>   }
>   
> -/*
> - * Move the page from the page cache to the swap cache.
> - */
>   static int shmem_writepage(struct page *page, struct writeback_control *wbc)
>   {
> -	struct folio *folio = page_folio(page);
> +	return shmem_writeout(page_folio(page), wbc);
> +}
> +
> +/**
> + * shmem_writeout - Write the folio to swap
> + * @folio: The folio to write
> + * @wbc: How writeback is to be done
> + *
> + * Move the folio from the page cache to the swap cache.
> + */
> +int shmem_writeout(struct folio *folio, struct writeback_control *wbc)
> +{
>   	struct address_space *mapping = folio->mapping;
>   	struct inode *inode = mapping->host;
>   	struct shmem_inode_info *info = SHMEM_I(inode);
> @@ -1586,9 +1594,8 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
>   try_split:
>   		/* Ensure the subpages are still dirty */
>   		folio_test_set_dirty(folio);
> -		if (split_huge_page_to_list_to_order(page, wbc->list, 0))
> +		if (split_folio_to_list(folio, wbc->list))
>   			goto redirty;
> -		folio = page_folio(page);
>   		folio_clear_dirty(folio);
>   	}
>   
> @@ -1660,6 +1667,7 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)
>   	folio_unlock(folio);
>   	return 0;
>   }
> +EXPORT_SYMBOL_GPL(shmem_writeout);
>   
>   #if defined(CONFIG_NUMA) && defined(CONFIG_TMPFS)
>   static void shmem_show_mpol(struct seq_file *seq, struct mempolicy *mpol)
diff mbox series

Patch

diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h
index 0b273a7b9f01..5f03a39a26f7 100644
--- a/include/linux/shmem_fs.h
+++ b/include/linux/shmem_fs.h
@@ -104,10 +104,11 @@  static inline bool shmem_mapping(struct address_space *mapping)
 	return false;
 }
 #endif /* CONFIG_SHMEM */
-extern void shmem_unlock_mapping(struct address_space *mapping);
-extern struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
+void shmem_unlock_mapping(struct address_space *mapping);
+struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
 					pgoff_t index, gfp_t gfp_mask);
-extern void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
+int shmem_writeout(struct folio *folio, struct writeback_control *wbc);
+void shmem_truncate_range(struct inode *inode, loff_t start, loff_t end);
 int shmem_unuse(unsigned int type);
 
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
diff --git a/mm/shmem.c b/mm/shmem.c
index ba162e991285..427b7f70fffb 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1536,12 +1536,20 @@  int shmem_unuse(unsigned int type)
 	return error;
 }
 
-/*
- * Move the page from the page cache to the swap cache.
- */
 static int shmem_writepage(struct page *page, struct writeback_control *wbc)
 {
-	struct folio *folio = page_folio(page);
+	return shmem_writeout(page_folio(page), wbc);
+}
+
+/**
+ * shmem_writeout - Write the folio to swap
+ * @folio: The folio to write
+ * @wbc: How writeback is to be done
+ *
+ * Move the folio from the page cache to the swap cache.
+ */
+int shmem_writeout(struct folio *folio, struct writeback_control *wbc)
+{
 	struct address_space *mapping = folio->mapping;
 	struct inode *inode = mapping->host;
 	struct shmem_inode_info *info = SHMEM_I(inode);
@@ -1586,9 +1594,8 @@  static int shmem_writepage(struct page *page, struct writeback_control *wbc)
 try_split:
 		/* Ensure the subpages are still dirty */
 		folio_test_set_dirty(folio);
-		if (split_huge_page_to_list_to_order(page, wbc->list, 0))
+		if (split_folio_to_list(folio, wbc->list))
 			goto redirty;
-		folio = page_folio(page);
 		folio_clear_dirty(folio);
 	}
 
@@ -1660,6 +1667,7 @@  static int shmem_writepage(struct page *page, struct writeback_control *wbc)
 	folio_unlock(folio);
 	return 0;
 }
+EXPORT_SYMBOL_GPL(shmem_writeout);
 
 #if defined(CONFIG_NUMA) && defined(CONFIG_TMPFS)
 static void shmem_show_mpol(struct seq_file *seq, struct mempolicy *mpol)