2006-05-26 12:04:49

by Wu Fengguang

[permalink] [raw]
Subject: [PATCH 04/33] mm: introduce probe_pages()

Introduce a pair of functions to probe the existence of file page.
- int __probe_page(mapping, offset)
- int probe_page(mapping, offset)

Signed-off-by: Wu Fengguang <[email protected]>
---


--- linux.orig/include/linux/pagemap.h
+++ linux/include/linux/pagemap.h
@@ -68,6 +68,8 @@ static inline struct page *page_cache_al

typedef int filler_t(void *, struct page *);

+extern int __probe_page(struct address_space *mapping, pgoff_t offset);
+extern int probe_page(struct address_space *mapping, pgoff_t offset);
extern struct page * find_get_page(struct address_space *mapping,
unsigned long index);
extern struct page * find_lock_page(struct address_space *mapping,
--- linux.orig/mm/filemap.c
+++ linux/mm/filemap.c
@@ -548,6 +548,28 @@ void fastcall __lock_page(struct page *p
EXPORT_SYMBOL(__lock_page);

/*
+ * Probing page existence.
+ */
+int __probe_page(struct address_space *mapping, pgoff_t offset)
+{
+ return !! radix_tree_lookup(&mapping->page_tree, offset);
+}
+
+/*
+ * Here we just do not bother to grab the page, it's meaningless anyway.
+ */
+int probe_page(struct address_space *mapping, pgoff_t offset)
+{
+ int exists;
+
+ read_lock_irq(&mapping->tree_lock);
+ exists = __probe_page(mapping, offset);
+ read_unlock_irq(&mapping->tree_lock);
+
+ return exists;
+}
+
+/*
* a rather lightweight function, finding and getting a reference to a
* hashed page atomically.
*/

--