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