aboutsummaryrefslogtreecommitdiffstats
path: root/mm/truncate.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2017-11-15 20:37:15 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2017-11-15 21:21:06 -0500
commit9f4e41f4717832e34cca153ced62b4a1d7e26c0e (patch)
tree7ae9a21d93fd73e10be9a2a23ef9ac91cea2055d /mm/truncate.c
parent736304f3245f39392895ff3392e1325d3e49e7d2 (diff)
mm: refactor truncate_complete_page()
Move call of delete_from_page_cache() and page->mapping check out of truncate_complete_page() into the single caller - truncate_inode_page(). Also move page_mapped() check into truncate_complete_page(). That way it will be easier to batch operations. Also rename truncate_complete_page() to truncate_cleanup_page(). Link: http://lkml.kernel.org/r/20171010151937.26984-3-jack@suse.cz Signed-off-by: Jan Kara <jack@suse.cz> Acked-by: Mel Gorman <mgorman@suse.de> Reviewed-by: Andi Kleen <ak@linux.intel.com> Cc: Dave Chinner <david@fromorbit.com> Cc: Dave Hansen <dave.hansen@intel.com> Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/truncate.c')
-rw-r--r--mm/truncate.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/mm/truncate.c b/mm/truncate.c
index 2330223841fb..383a530d511e 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -134,11 +134,17 @@ void do_invalidatepage(struct page *page, unsigned int offset,
134 * its lock, b) when a concurrent invalidate_mapping_pages got there first and 134 * its lock, b) when a concurrent invalidate_mapping_pages got there first and
135 * c) when tmpfs swizzles a page between a tmpfs inode and swapper_space. 135 * c) when tmpfs swizzles a page between a tmpfs inode and swapper_space.
136 */ 136 */
137static int 137static void
138truncate_complete_page(struct address_space *mapping, struct page *page) 138truncate_cleanup_page(struct address_space *mapping, struct page *page)
139{ 139{
140 if (page->mapping != mapping) 140 if (page_mapped(page)) {
141 return -EIO; 141 loff_t holelen;
142
143 holelen = PageTransHuge(page) ? HPAGE_PMD_SIZE : PAGE_SIZE;
144 unmap_mapping_range(mapping,
145 (loff_t)page->index << PAGE_SHIFT,
146 holelen, 0);
147 }
142 148
143 if (page_has_private(page)) 149 if (page_has_private(page))
144 do_invalidatepage(page, 0, PAGE_SIZE); 150 do_invalidatepage(page, 0, PAGE_SIZE);
@@ -150,8 +156,6 @@ truncate_complete_page(struct address_space *mapping, struct page *page)
150 */ 156 */
151 cancel_dirty_page(page); 157 cancel_dirty_page(page);
152 ClearPageMappedToDisk(page); 158 ClearPageMappedToDisk(page);
153 delete_from_page_cache(page);
154 return 0;
155} 159}
156 160
157/* 161/*
@@ -180,16 +184,14 @@ invalidate_complete_page(struct address_space *mapping, struct page *page)
180 184
181int truncate_inode_page(struct address_space *mapping, struct page *page) 185int truncate_inode_page(struct address_space *mapping, struct page *page)
182{ 186{
183 loff_t holelen;
184 VM_BUG_ON_PAGE(PageTail(page), page); 187 VM_BUG_ON_PAGE(PageTail(page), page);
185 188
186 holelen = PageTransHuge(page) ? HPAGE_PMD_SIZE : PAGE_SIZE; 189 if (page->mapping != mapping)
187 if (page_mapped(page)) { 190 return -EIO;
188 unmap_mapping_range(mapping, 191
189 (loff_t)page->index << PAGE_SHIFT, 192 truncate_cleanup_page(mapping, page);
190 holelen, 0); 193 delete_from_page_cache(page);
191 } 194 return 0;
192 return truncate_complete_page(mapping, page);
193} 195}
194 196
195/* 197/*