diff options
author | Anton Altaparmakov <aia21@cantab.net> | 2005-12-05 10:48:41 -0500 |
---|---|---|
committer | Anton Altaparmakov <aia21@cantab.net> | 2005-12-05 10:48:41 -0500 |
commit | 292d4ed32e35df4755052b5002e533348d1648fd (patch) | |
tree | 8522e6bab962696bd25a6c02fb068c674a09b7ee /mm/fremap.c | |
parent | 3c6af7fa787f21f8873a050568ed892312899eb5 (diff) | |
parent | e4f5c82a92c2a546a16af1614114eec19120e40a (diff) |
Merge branch 'master' of /usr/src/ntfs-2.6/
Diffstat (limited to 'mm/fremap.c')
-rw-r--r-- | mm/fremap.c | 46 |
1 files changed, 9 insertions, 37 deletions
diff --git a/mm/fremap.c b/mm/fremap.c index 007cbad933..9f381e58bf 100644 --- a/mm/fremap.c +++ b/mm/fremap.c | |||
@@ -27,24 +27,20 @@ static int zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, | |||
27 | struct page *page = NULL; | 27 | struct page *page = NULL; |
28 | 28 | ||
29 | if (pte_present(pte)) { | 29 | if (pte_present(pte)) { |
30 | unsigned long pfn = pte_pfn(pte); | 30 | flush_cache_page(vma, addr, pte_pfn(pte)); |
31 | flush_cache_page(vma, addr, pfn); | ||
32 | pte = ptep_clear_flush(vma, addr, ptep); | 31 | pte = ptep_clear_flush(vma, addr, ptep); |
33 | if (unlikely(!pfn_valid(pfn))) { | 32 | page = vm_normal_page(vma, addr, pte); |
34 | print_bad_pte(vma, pte, addr); | 33 | if (page) { |
35 | goto out; | 34 | if (pte_dirty(pte)) |
35 | set_page_dirty(page); | ||
36 | page_remove_rmap(page); | ||
37 | page_cache_release(page); | ||
36 | } | 38 | } |
37 | page = pfn_to_page(pfn); | ||
38 | if (pte_dirty(pte)) | ||
39 | set_page_dirty(page); | ||
40 | page_remove_rmap(page); | ||
41 | page_cache_release(page); | ||
42 | } else { | 39 | } else { |
43 | if (!pte_file(pte)) | 40 | if (!pte_file(pte)) |
44 | free_swap_and_cache(pte_to_swp_entry(pte)); | 41 | free_swap_and_cache(pte_to_swp_entry(pte)); |
45 | pte_clear(mm, addr, ptep); | 42 | pte_clear(mm, addr, ptep); |
46 | } | 43 | } |
47 | out: | ||
48 | return !!page; | 44 | return !!page; |
49 | } | 45 | } |
50 | 46 | ||
@@ -59,22 +55,10 @@ int install_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
59 | pgoff_t size; | 55 | pgoff_t size; |
60 | int err = -ENOMEM; | 56 | int err = -ENOMEM; |
61 | pte_t *pte; | 57 | pte_t *pte; |
62 | pmd_t *pmd; | ||
63 | pud_t *pud; | ||
64 | pgd_t *pgd; | ||
65 | pte_t pte_val; | 58 | pte_t pte_val; |
66 | spinlock_t *ptl; | 59 | spinlock_t *ptl; |
67 | 60 | ||
68 | BUG_ON(vma->vm_flags & VM_UNPAGED); | 61 | pte = get_locked_pte(mm, addr, &ptl); |
69 | |||
70 | pgd = pgd_offset(mm, addr); | ||
71 | pud = pud_alloc(mm, pgd, addr); | ||
72 | if (!pud) | ||
73 | goto out; | ||
74 | pmd = pmd_alloc(mm, pud, addr); | ||
75 | if (!pmd) | ||
76 | goto out; | ||
77 | pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | ||
78 | if (!pte) | 62 | if (!pte) |
79 | goto out; | 63 | goto out; |
80 | 64 | ||
@@ -116,22 +100,10 @@ int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma, | |||
116 | { | 100 | { |
117 | int err = -ENOMEM; | 101 | int err = -ENOMEM; |
118 | pte_t *pte; | 102 | pte_t *pte; |
119 | pmd_t *pmd; | ||
120 | pud_t *pud; | ||
121 | pgd_t *pgd; | ||
122 | pte_t pte_val; | 103 | pte_t pte_val; |
123 | spinlock_t *ptl; | 104 | spinlock_t *ptl; |
124 | 105 | ||
125 | BUG_ON(vma->vm_flags & VM_UNPAGED); | 106 | pte = get_locked_pte(mm, addr, &ptl); |
126 | |||
127 | pgd = pgd_offset(mm, addr); | ||
128 | pud = pud_alloc(mm, pgd, addr); | ||
129 | if (!pud) | ||
130 | goto out; | ||
131 | pmd = pmd_alloc(mm, pud, addr); | ||
132 | if (!pmd) | ||
133 | goto out; | ||
134 | pte = pte_alloc_map_lock(mm, pmd, addr, &ptl); | ||
135 | if (!pte) | 107 | if (!pte) |
136 | goto out; | 108 | goto out; |
137 | 109 | ||