diff options
Diffstat (limited to 'mm/truncate.c')
-rw-r--r-- | mm/truncate.c | 22 |
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 | */ |
324 | unsigned long invalidate_mapping_pages(struct address_space *mapping, | 323 | unsigned 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 | } |
368 | EXPORT_SYMBOL(invalidate_mapping_pages); | 374 | EXPORT_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 | ||