diff -ur linux-source-2.6.15-28.57/fs/nfs/file.c linux-source-2.6.15-28.57.1/fs/nfs/file.c --- linux-source-2.6.15-28.57/fs/nfs/file.c 2006-03-03 06:18:38.000000000 +0900 +++ linux-source-2.6.15-28.57.1/fs/nfs/file.c 2007-08-08 17:58:00.000000000 +0900 @@ -316,6 +316,18 @@ return status; } +static int nfs_invalidate_page(struct page *page, unsigned long offset) +{ + BUG_ON(PagePrivate(page)); + return 1; +} + +static int nfs_release_page(struct page *page, gfp_t gfp) +{ + ClearPageUptodate(page); + return 0; +} + struct address_space_operations nfs_file_aops = { .readpage = nfs_readpage, .readpages = nfs_readpages, @@ -324,6 +336,8 @@ .writepages = nfs_writepages, .prepare_write = nfs_prepare_write, .commit_write = nfs_commit_write, + .invalidatepage = nfs_invalidate_page, + .releasepage = nfs_release_page, #ifdef CONFIG_NFS_DIRECTIO .direct_IO = nfs_direct_IO, #endif diff -ur linux-source-2.6.15-28.57/fs/nfs/pagelist.c linux-source-2.6.15-28.57.1/fs/nfs/pagelist.c --- linux-source-2.6.15-28.57/fs/nfs/pagelist.c 2006-03-03 06:18:38.000000000 +0900 +++ linux-source-2.6.15-28.57.1/fs/nfs/pagelist.c 2007-08-08 17:59:59.000000000 +0900 @@ -85,6 +85,7 @@ atomic_set(&req->wb_complete, 0); req->wb_index = page->index; page_cache_get(page); + SetPagePrivate(page); req->wb_offset = offset; req->wb_pgbase = offset; req->wb_bytes = count; @@ -147,8 +148,10 @@ */ void nfs_clear_request(struct nfs_page *req) { - if (req->wb_page) { - page_cache_release(req->wb_page); + struct page *page = req->wb_page; + if (page != NULL) { + ClearPagePrivate(page); + page_cache_release(page); req->wb_page = NULL; } }