diff options
Diffstat (limited to 'mm/fremap.c')
-rw-r--r-- | mm/fremap.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/mm/fremap.c b/mm/fremap.c index fd7f2a17ff3e..224cc1598b35 100644 --- a/mm/fremap.c +++ b/mm/fremap.c | |||
@@ -29,19 +29,20 @@ static inline void zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, | |||
29 | return; | 29 | return; |
30 | if (pte_present(pte)) { | 30 | if (pte_present(pte)) { |
31 | unsigned long pfn = pte_pfn(pte); | 31 | unsigned long pfn = pte_pfn(pte); |
32 | struct page *page; | ||
32 | 33 | ||
33 | flush_cache_page(vma, addr, pfn); | 34 | flush_cache_page(vma, addr, pfn); |
34 | pte = ptep_clear_flush(vma, addr, ptep); | 35 | pte = ptep_clear_flush(vma, addr, ptep); |
35 | if (pfn_valid(pfn)) { | 36 | if (unlikely(!pfn_valid(pfn))) { |
36 | struct page *page = pfn_to_page(pfn); | 37 | print_bad_pte(vma, pte, addr); |
37 | if (!PageReserved(page)) { | 38 | return; |
38 | if (pte_dirty(pte)) | ||
39 | set_page_dirty(page); | ||
40 | page_remove_rmap(page); | ||
41 | page_cache_release(page); | ||
42 | dec_mm_counter(mm, file_rss); | ||
43 | } | ||
44 | } | 39 | } |
40 | page = pfn_to_page(pfn); | ||
41 | if (pte_dirty(pte)) | ||
42 | set_page_dirty(page); | ||
43 | page_remove_rmap(page); | ||
44 | page_cache_release(page); | ||
45 | dec_mm_counter(mm, file_rss); | ||
45 | } else { | 46 | } else { |
46 | if (!pte_file(pte)) | 47 | if (!pte_file(pte)) |
47 | free_swap_and_cache(pte_to_swp_entry(pte)); | 48 | free_swap_and_cache(pte_to_swp_entry(pte)); |
@@ -65,6 +66,8 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
65 | pgd_t *pgd; | 66 | pgd_t *pgd; |
66 | pte_t pte_val; | 67 | pte_t pte_val; |
67 | 68 | ||
69 | BUG_ON(vma->vm_flags & VM_RESERVED); | ||
70 | |||
68 | pgd = pgd_offset(mm, addr); | 71 | pgd = pgd_offset(mm, addr); |
69 | spin_lock(&mm->page_table_lock); | 72 | spin_lock(&mm->page_table_lock); |
70 | 73 | ||
@@ -125,6 +128,8 @@ int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, | |||
125 | pgd_t *pgd; | 128 | pgd_t *pgd; |
126 | pte_t pte_val; | 129 | pte_t pte_val; |
127 | 130 | ||
131 | BUG_ON(vma->vm_flags & VM_RESERVED); | ||
132 | |||
128 | pgd = pgd_offset(mm, addr); | 133 | pgd = pgd_offset(mm, addr); |
129 | spin_lock(&mm->page_table_lock); | 134 | spin_lock(&mm->page_table_lock); |
130 | 135 | ||