path: root/mm/filemap.c
diff options
authorDan Magenheimer <>2011-05-26 10:01:43 -0600
committerDan Magenheimer <>2011-05-26 10:01:43 -0600
commitc515e1fd361c2a08a9c2eb139396ec30a4f477dc (patch)
treecb1a27f27f065400fc79dc287594843e169d74ab /mm/filemap.c
parent077b1f83a69d94f2918630a882d74939baca0bce (diff)
mm/fs: add hooks to support cleancache
This fourth patch of eight in this cleancache series provides the core hooks in VFS for: initializing cleancache per filesystem; capturing clean pages reclaimed by page cache; attempting to get pages from cleancache before filesystem read; and ensuring coherency between pagecache, disk, and cleancache. Note that the placement of these hooks was stable from 2.6.18 to 2.6.38; a minor semantic change was required due to a patchset in 2.6.39. All hooks become no-ops if CONFIG_CLEANCACHE is unset, or become a check of a boolean global if CONFIG_CLEANCACHE is set but no cleancache "backend" has claimed cleancache_ops. Details and a FAQ can be found in Documentation/vm/cleancache.txt [v8: adapt to new remove_from_page_cache function] Signed-off-by: Chris Mason <> Signed-off-by: Dan Magenheimer <> Reviewed-by: Jeremy Fitzhardinge <> Reviewed-by: Konrad Rzeszutek Wilk <> Cc: Andrew Morton <> Cc: Al Viro <> Cc: Matthew Wilcox <> Cc: Nick Piggin <> Cc: Mel Gorman <> Cc: Rik Van Riel <> Cc: Jan Beulich <> Cc: Andreas Dilger <> Cc: Ted Ts'o <> Cc: Mark Fasheh <> Cc: Joel Becker <> Cc: Nitin Gupta <>
Diffstat (limited to 'mm/filemap.c')
1 files changed, 11 insertions, 0 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index c641edf553a9..ec6fa2d7e200 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -34,6 +34,7 @@
#include <linux/hardirq.h> /* for BUG_ON(!in_atomic()) only */
#include <linux/memcontrol.h>
#include <linux/mm_inline.h> /* for page_is_file_cache() */
+#include <linux/cleancache.h>
#include "internal.h"
@@ -118,6 +119,16 @@ void __delete_from_page_cache(struct page *page)
struct address_space *mapping = page->mapping;
+ /*
+ * if we're uptodate, flush out into the cleancache, otherwise
+ * invalidate any existing cleancache entries. We can't leave
+ * stale data around in the cleancache once our page is gone
+ */
+ if (PageUptodate(page) && PageMappedToDisk(page))
+ cleancache_put_page(page);
+ else
+ cleancache_flush_page(mapping, page);
radix_tree_delete(&mapping->page_tree, page->index);
page->mapping = NULL;