[PATCH 38/48] truncate: Add invalidate_complete_folio2()
From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Date: 2021-12-08 04:24:16
Also in:
linux-fsdevel
Subsystem:
memory management, memory management - core, page cache, the rest · Maintainers:
Andrew Morton, David Hildenbrand, Matthew Wilcox, Linus Torvalds
Convert invalidate_complete_page2() to invalidate_complete_folio2(). Use filemap_free_folio() to free the page instead of calling ->freepage manually. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- mm/filemap.c | 3 +-- mm/internal.h | 1 + mm/truncate.c | 23 ++++++++++------------- 3 files changed, 12 insertions(+), 15 deletions(-)
diff --git a/mm/filemap.c b/mm/filemap.c
index 7a418f0012e5..fb3cdb7aeffc 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c@@ -229,8 +229,7 @@ void __filemap_remove_folio(struct folio *folio, void *shadow) page_cache_delete(mapping, folio, shadow); } -static void filemap_free_folio(struct address_space *mapping, - struct folio *folio) +void filemap_free_folio(struct address_space *mapping, struct folio *folio) { void (*freepage)(struct page *);
diff --git a/mm/internal.h b/mm/internal.h
index b05515d3b07b..d3c7b35934ed 100644
--- a/mm/internal.h
+++ b/mm/internal.h@@ -113,6 +113,7 @@ static inline void force_page_cache_readahead(struct address_space *mapping, unsigned find_lock_entries(struct address_space *mapping, pgoff_t start, pgoff_t end, struct pagevec *pvec, pgoff_t *indices); +void filemap_free_folio(struct address_space *mapping, struct folio *folio); int truncate_inode_folio(struct address_space *mapping, struct folio *folio); /**
diff --git a/mm/truncate.c b/mm/truncate.c
index ef6980b240e2..5370094641d6 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c@@ -571,31 +571,29 @@ void invalidate_mapping_pagevec(struct address_space *mapping, * shrink_page_list() has a temp ref on them, or because they're transiently * sitting in the lru_cache_add() pagevecs. */ -static int -invalidate_complete_page2(struct address_space *mapping, struct page *page) +static int invalidate_complete_folio2(struct address_space *mapping, + struct folio *folio) { - if (page->mapping != mapping) + if (folio->mapping != mapping) return 0; - if (page_has_private(page) && !try_to_release_page(page, GFP_KERNEL)) + if (folio_has_private(folio) && + !filemap_release_folio(folio, GFP_KERNEL)) return 0; spin_lock(&mapping->host->i_lock); xa_lock_irq(&mapping->i_pages); - if (PageDirty(page)) + if (folio_test_dirty(folio)) goto failed; - BUG_ON(page_has_private(page)); - __delete_from_page_cache(page, NULL); + BUG_ON(folio_has_private(folio)); + __filemap_remove_folio(folio, NULL); xa_unlock_irq(&mapping->i_pages); if (mapping_shrinkable(mapping)) inode_add_lru(mapping->host); spin_unlock(&mapping->host->i_lock); - if (mapping->a_ops->freepage) - mapping->a_ops->freepage(page); - - put_page(page); /* pagecache ref */ + filemap_free_folio(mapping, folio); return 1; failed: xa_unlock_irq(&mapping->i_pages);
@@ -679,8 +677,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping, ret2 = do_launder_page(mapping, &folio->page); if (ret2 == 0) { - if (!invalidate_complete_page2(mapping, - &folio->page)) + if (!invalidate_complete_folio2(mapping, folio)) ret2 = -EBUSY; } if (ret2 < 0)
--
2.33.0