aboutsummaryrefslogtreecommitdiffstats
path: root/mm/truncate.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/truncate.c')
-rw-r--r--mm/truncate.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/mm/truncate.c b/mm/truncate.c
index d64296be00d3..a95667529135 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -106,9 +106,8 @@ truncate_complete_page(struct address_space *mapping, struct page *page)
106 cancel_dirty_page(page, PAGE_CACHE_SIZE); 106 cancel_dirty_page(page, PAGE_CACHE_SIZE);
107 107
108 clear_page_mlock(page); 108 clear_page_mlock(page);
109 remove_from_page_cache(page);
110 ClearPageMappedToDisk(page); 109 ClearPageMappedToDisk(page);
111 page_cache_release(page); /* pagecache ref */ 110 delete_from_page_cache(page);
112 return 0; 111 return 0;
113} 112}
114 113
@@ -322,11 +321,12 @@ EXPORT_SYMBOL(truncate_inode_pages);
322 * pagetables. 321 * pagetables.
323 */ 322 */
324unsigned long invalidate_mapping_pages(struct address_space *mapping, 323unsigned long invalidate_mapping_pages(struct address_space *mapping,
325 pgoff_t start, pgoff_t end) 324 pgoff_t start, pgoff_t end)
326{ 325{
327 struct pagevec pvec; 326 struct pagevec pvec;
328 pgoff_t next = start; 327 pgoff_t next = start;
329 unsigned long ret = 0; 328 unsigned long ret;
329 unsigned long count = 0;
330 int i; 330 int i;
331 331
332 pagevec_init(&pvec, 0); 332 pagevec_init(&pvec, 0);
@@ -353,9 +353,15 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
353 if (lock_failed) 353 if (lock_failed)
354 continue; 354 continue;
355 355
356 ret += invalidate_inode_page(page); 356 ret = invalidate_inode_page(page);
357
358 unlock_page(page); 357 unlock_page(page);
358 /*
359 * Invalidation is a hint that the page is no longer
360 * of interest and try to speed up its reclaim.
361 */
362 if (!ret)
363 deactivate_page(page);
364 count += ret;
359 if (next > end) 365 if (next > end)
360 break; 366 break;
361 } 367 }
@@ -363,7 +369,7 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
363 mem_cgroup_uncharge_end(); 369 mem_cgroup_uncharge_end();
364 cond_resched(); 370 cond_resched();
365 } 371 }
366 return ret; 372 return count;
367} 373}
368EXPORT_SYMBOL(invalidate_mapping_pages); 374EXPORT_SYMBOL(invalidate_mapping_pages);
369 375
@@ -389,7 +395,7 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page)
389 395
390 clear_page_mlock(page); 396 clear_page_mlock(page);
391 BUG_ON(page_has_private(page)); 397 BUG_ON(page_has_private(page));
392 __remove_from_page_cache(page); 398 __delete_from_page_cache(page);
393 spin_unlock_irq(&mapping->tree_lock); 399 spin_unlock_irq(&mapping->tree_lock);
394 mem_cgroup_uncharge_cache_page(page); 400 mem_cgroup_uncharge_cache_page(page);
395 401