diff options
Diffstat (limited to 'mm/truncate.c')
-rw-r--r-- | mm/truncate.c | 30 |
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 | */ |
137 | static int | 137 | static void |
138 | truncate_complete_page(struct address_space *mapping, struct page *page) | 138 | truncate_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 | ||
181 | int truncate_inode_page(struct address_space *mapping, struct page *page) | 185 | int 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 | /* |