Index: linux-2.6/include/linux/pagemap.h =================================================================== --- linux-2.6.orig/include/linux/pagemap.h +++ linux-2.6/include/linux/pagemap.h @@ -11,6 +11,7 @@ #include #include #include +#include /* * Bits in mapping->flags. The lower __GFP_BITS_SHIFT bits are the page @@ -58,6 +59,14 @@ static inline struct page *page_cache_ge if (unlikely(!page)) return NULL; +#ifndef CONFIG_SMP + BUG_ON(page_count(page) == 0); + atomic_inc(&page->_count); + BUG_ON(page != *pagep); + BUG_ON(PageCompound(page) && (struct page *)page_private(page) != page); + return page; +#else + if (unlikely(!get_page_unless_zero(page))) return NULL; @@ -96,12 +105,16 @@ static inline struct page *page_cache_ge if (unlikely(page != *pagep)) /* page no longer at *pagep? */ goto bad_page; + BUG_ON(PageCompound(page) && (struct page *)page_private(page) != page); + return page; bad_page: /* Now that we have a reference, we must do a put_page. */ put_page(page); return NULL; +#endif + } static inline struct page *page_cache_alloc(struct address_space *x)