diff options
Diffstat (limited to 'mm/fremap.c')
-rw-r--r-- | mm/fremap.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/mm/fremap.c b/mm/fremap.c index 7881638e4a12..7d12ca70ef7b 100644 --- a/mm/fremap.c +++ b/mm/fremap.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <asm/cacheflush.h> | 21 | #include <asm/cacheflush.h> |
22 | #include <asm/tlbflush.h> | 22 | #include <asm/tlbflush.h> |
23 | 23 | ||
24 | #include "internal.h" | ||
25 | |||
24 | static void zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, | 26 | static void zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, |
25 | unsigned long addr, pte_t *ptep) | 27 | unsigned long addr, pte_t *ptep) |
26 | { | 28 | { |
@@ -215,15 +217,31 @@ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size, | |||
215 | spin_unlock(&mapping->i_mmap_lock); | 217 | spin_unlock(&mapping->i_mmap_lock); |
216 | } | 218 | } |
217 | 219 | ||
220 | if (vma->vm_flags & VM_LOCKED) { | ||
221 | /* | ||
222 | * drop PG_Mlocked flag for over-mapped range | ||
223 | */ | ||
224 | unsigned int saved_flags = vma->vm_flags; | ||
225 | munlock_vma_pages_range(vma, start, start + size); | ||
226 | vma->vm_flags = saved_flags; | ||
227 | } | ||
228 | |||
218 | mmu_notifier_invalidate_range_start(mm, start, start + size); | 229 | mmu_notifier_invalidate_range_start(mm, start, start + size); |
219 | err = populate_range(mm, vma, start, size, pgoff); | 230 | err = populate_range(mm, vma, start, size, pgoff); |
220 | mmu_notifier_invalidate_range_end(mm, start, start + size); | 231 | mmu_notifier_invalidate_range_end(mm, start, start + size); |
221 | if (!err && !(flags & MAP_NONBLOCK)) { | 232 | if (!err && !(flags & MAP_NONBLOCK)) { |
222 | if (unlikely(has_write_lock)) { | 233 | if (vma->vm_flags & VM_LOCKED) { |
223 | downgrade_write(&mm->mmap_sem); | 234 | /* |
224 | has_write_lock = 0; | 235 | * might be mapping previously unmapped range of file |
236 | */ | ||
237 | mlock_vma_pages_range(vma, start, start + size); | ||
238 | } else { | ||
239 | if (unlikely(has_write_lock)) { | ||
240 | downgrade_write(&mm->mmap_sem); | ||
241 | has_write_lock = 0; | ||
242 | } | ||
243 | make_pages_present(start, start+size); | ||
225 | } | 244 | } |
226 | make_pages_present(start, start+size); | ||
227 | } | 245 | } |
228 | 246 | ||
229 | /* | 247 | /* |
@@ -240,4 +258,3 @@ out: | |||
240 | 258 | ||
241 | return err; | 259 | return err; |
242 | } | 260 | } |
243 | |||