diff options
Diffstat (limited to 'mm/mprotect.c')
-rw-r--r-- | mm/mprotect.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/mm/mprotect.c b/mm/mprotect.c index 56454fc07..4752806de 100644 --- a/mm/mprotect.c +++ b/mm/mprotect.c @@ -72,11 +72,13 @@ static void change_protection(unsigned long start, unsigned long end, pgprot_t n flush_cache_range(current->mm, beg, end); if (start >= end) BUG(); + spin_lock(¤t->mm->page_table_lock); do { change_pmd_range(dir, start, end - start, newprot); start = (start + PGDIR_SIZE) & PGDIR_MASK; dir++; } while (start && (start < end)); + spin_unlock(¤t->mm->page_table_lock); flush_tlb_range(current->mm, beg, end); return; } @@ -109,7 +111,7 @@ static inline int mprotect_fixup_start(struct vm_area_struct * vma, if (n->vm_ops && n->vm_ops->open) n->vm_ops->open(n); vmlist_modify_lock(vma->vm_mm); - vma->vm_offset += end - vma->vm_start; + vma->vm_pgoff += (end - vma->vm_start) >> PAGE_SHIFT; vma->vm_start = end; insert_vm_struct(current->mm, n); vmlist_modify_unlock(vma->vm_mm); @@ -127,7 +129,7 @@ static inline int mprotect_fixup_end(struct vm_area_struct * vma, return -ENOMEM; *n = *vma; n->vm_start = start; - n->vm_offset += n->vm_start - vma->vm_start; + n->vm_pgoff += (n->vm_start - vma->vm_start) >> PAGE_SHIFT; n->vm_flags = newflags; n->vm_page_prot = prot; if (n->vm_file) @@ -159,7 +161,7 @@ static inline int mprotect_fixup_middle(struct vm_area_struct * vma, *right = *vma; left->vm_end = start; right->vm_start = end; - right->vm_offset += right->vm_start - left->vm_start; + right->vm_pgoff += (right->vm_start - left->vm_start) >> PAGE_SHIFT; if (vma->vm_file) atomic_add(2,&vma->vm_file->f_count); if (vma->vm_ops && vma->vm_ops->open) { @@ -167,7 +169,7 @@ static inline int mprotect_fixup_middle(struct vm_area_struct * vma, vma->vm_ops->open(right); } vmlist_modify_lock(vma->vm_mm); - vma->vm_offset += start - vma->vm_start; + vma->vm_pgoff += (start - vma->vm_start) >> PAGE_SHIFT; vma->vm_start = start; vma->vm_end = end; vma->vm_flags = newflags; |