diff options
Diffstat (limited to 'mm/mmap.c')
| -rw-r--r-- | mm/mmap.c | 59 | 
1 files changed, 50 insertions, 9 deletions
diff --git a/mm/mmap.c b/mm/mmap.c index a7bf6a31c9f..848ef52d960 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -240,6 +240,8 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)  	return next;  } +static unsigned long do_brk(unsigned long addr, unsigned long len); +  SYSCALL_DEFINE1(brk, unsigned long, brk)  {  	unsigned long rlim, retval; @@ -951,7 +953,7 @@ static inline unsigned long round_hint_to_min(unsigned long hint)   * The caller must hold down_write(¤t->mm->mmap_sem).   */ -unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, +static unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,  			unsigned long len, unsigned long prot,  			unsigned long flags, unsigned long pgoff)  { @@ -1087,7 +1089,32 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,  	return mmap_region(file, addr, len, flags, vm_flags, pgoff);  } -EXPORT_SYMBOL(do_mmap_pgoff); + +unsigned long do_mmap(struct file *file, unsigned long addr, +	unsigned long len, unsigned long prot, +	unsigned long flag, unsigned long offset) +{ +	if (unlikely(offset + PAGE_ALIGN(len) < offset)) +		return -EINVAL; +	if (unlikely(offset & ~PAGE_MASK)) +		return -EINVAL; +	return do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); +} +EXPORT_SYMBOL(do_mmap); + +unsigned long vm_mmap(struct file *file, unsigned long addr, +	unsigned long len, unsigned long prot, +	unsigned long flag, unsigned long offset) +{ +	unsigned long ret; +	struct mm_struct *mm = current->mm; + +	down_write(&mm->mmap_sem); +	ret = do_mmap(file, addr, len, prot, flag, offset); +	up_write(&mm->mmap_sem); +	return ret; +} +EXPORT_SYMBOL(vm_mmap);  SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,  		unsigned long, prot, unsigned long, flags, @@ -2105,21 +2132,25 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)  	return 0;  } -  EXPORT_SYMBOL(do_munmap); -SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) +int vm_munmap(unsigned long start, size_t len)  {  	int ret;  	struct mm_struct *mm = current->mm; -	profile_munmap(addr); -  	down_write(&mm->mmap_sem); -	ret = do_munmap(mm, addr, len); +	ret = do_munmap(mm, start, len);  	up_write(&mm->mmap_sem);  	return ret;  } +EXPORT_SYMBOL(vm_munmap); + +SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) +{ +	profile_munmap(addr); +	return vm_munmap(addr, len); +}  static inline void verify_mm_writelocked(struct mm_struct *mm)  { @@ -2136,7 +2167,7 @@ static inline void verify_mm_writelocked(struct mm_struct *mm)   *  anonymous maps.  eventually we may be able to do some   *  brk-specific accounting here.   */ -unsigned long do_brk(unsigned long addr, unsigned long len) +static unsigned long do_brk(unsigned long addr, unsigned long len)  {  	struct mm_struct * mm = current->mm;  	struct vm_area_struct * vma, * prev; @@ -2232,7 +2263,17 @@ out:  	return addr;  } -EXPORT_SYMBOL(do_brk); +unsigned long vm_brk(unsigned long addr, unsigned long len) +{ +	struct mm_struct *mm = current->mm; +	unsigned long ret; + +	down_write(&mm->mmap_sem); +	ret = do_brk(addr, len); +	up_write(&mm->mmap_sem); +	return ret; +} +EXPORT_SYMBOL(vm_brk);  /* Release all mmaps. */  void exit_mmap(struct mm_struct *mm)  |