From: Hugh Dickins The follow_page write-access case is relying on pte_page before checking pfn_valid: rearrange that - and we don't need three struct page *pages. (I notice mempolicy.c's verify_pages is also relying on pte_page, but I'll leave that to Andi: maybe it ought to be failing on, or skipping over, VM_IO or VM_RESERVED vmas?) Signed-off-by: Hugh Dickins Signed-off-by: Andrew Morton --- 25-akpm/mm/memory.c | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-) diff -puN mm/memory.c~mm-follow_page-invalid-pte_page mm/memory.c --- 25/mm/memory.c~mm-follow_page-invalid-pte_page Wed Jun 2 15:12:23 2004 +++ 25-akpm/mm/memory.c Wed Jun 2 15:12:23 2004 @@ -637,15 +637,11 @@ follow_page(struct mm_struct *mm, unsign if (pte_present(pte)) { if (write && !pte_write(pte)) goto out; - if (write && !pte_dirty(pte)) { - struct page *page = pte_page(pte); - if (!PageDirty(page)) - set_page_dirty(page); - } pfn = pte_pfn(pte); if (pfn_valid(pfn)) { - struct page *page = pfn_to_page(pfn); - + page = pfn_to_page(pfn); + if (write && !pte_dirty(pte) && !PageDirty(page)) + set_page_dirty(page); mark_page_accessed(page); return page; } _