diff --git a/mm/mmap.c b/mm/mmap.c index 772140c..f2f03df 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1114,6 +1114,8 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, } EXPORT_SYMBOL(do_mmap_pgoff); +DEFINE_MUTEX(mmap_sem_mutex); + SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, unsigned long, prot, unsigned long, flags, unsigned long, fd, unsigned long, pgoff) @@ -1145,9 +1147,11 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); + mutex_lock(&mmap_sem_mutex); down_write(¤t->mm->mmap_sem); retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); up_write(¤t->mm->mmap_sem); + mutex_unlock(&mmap_sem_mutex); if (file) fput(file); @@ -2149,9 +2153,11 @@ SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len) profile_munmap(addr); + mutex_lock(&mmap_sem_mutex); down_write(&mm->mmap_sem); ret = do_munmap(mm, addr, len); up_write(&mm->mmap_sem); + mutex_unlock(&mmap_sem_mutex); return ret; }