aboutsummaryrefslogtreecommitdiffstats
path: root/mm/truncate.c
diff options
context:
space:
mode:
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/*