From: Andrew Morton Use page_mapping(), not page->mapping. Cc: Peter Zijlstra Cc: Nick Piggin Cc: Hugh Dickins Cc: Christoph Lameter Signed-off-by: Andrew Morton --- mm/rmap.c | 12 +++++------- 1 files changed, 5 insertions(+), 7 deletions(-) diff -puN mm/rmap.c~tracking-dirty-pages-in-shared-mappings-v4-fix3 mm/rmap.c --- devel/mm/rmap.c~tracking-dirty-pages-in-shared-mappings-v4-fix3 2006-05-11 08:09:39.000000000 -0700 +++ devel-akpm/mm/rmap.c 2006-05-11 08:09:39.000000000 -0700 @@ -465,9 +465,8 @@ out: return ret; } -static int page_wrprotect_file(struct page *page) +static int page_wrprotect_file(struct address_space *mapping, struct page *page) { - struct address_space *mapping = page->mapping; pgoff_t pgoff = page->index << (PAGE_CACHE_SHIFT - PAGE_SHIFT); struct vm_area_struct *vma; struct prio_tree_iter iter; @@ -476,12 +475,10 @@ static int page_wrprotect_file(struct pa BUG_ON(PageAnon(page)); spin_lock(&mapping->i_mmap_lock); - vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { if (VM_SharedWritable(vma)) ret += page_wrprotect_one(page, vma); } - spin_unlock(&mapping->i_mmap_lock); return ret; } @@ -492,9 +489,10 @@ int page_wrprotect(struct page *page) BUG_ON(!PageLocked(page)); - if (page_mapped(page) && page->mapping) { - if (!PageAnon(page)) - ret = page_wrprotect_file(page); + if (page_mapped(page)) { + struct address_space *mapping = page_mapping(page); + if (mapping) + ret = page_wrprotect_file(mapping, page); } return ret; _