aboutsummaryrefslogtreecommitdiffstats
path: root/mm/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/util.c')
-rw-r--r--mm/util.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/mm/util.c b/mm/util.c
index 8a1b3a1fb595..03b237746850 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -289,7 +289,7 @@ EXPORT_SYMBOL_GPL(get_user_pages_fast);
289 289
290unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr, 290unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
291 unsigned long len, unsigned long prot, 291 unsigned long len, unsigned long prot,
292 unsigned long flag, unsigned long pgoff) 292 unsigned long flag, unsigned long pgoff, bool killable)
293{ 293{
294 unsigned long ret; 294 unsigned long ret;
295 struct mm_struct *mm = current->mm; 295 struct mm_struct *mm = current->mm;
@@ -297,7 +297,12 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
297 297
298 ret = security_mmap_file(file, prot, flag); 298 ret = security_mmap_file(file, prot, flag);
299 if (!ret) { 299 if (!ret) {
300 down_write(&mm->mmap_sem); 300 if (killable) {
301 if (down_write_killable(&mm->mmap_sem))
302 return -EINTR;
303 } else {
304 down_write(&mm->mmap_sem);
305 }
301 ret = do_mmap_pgoff(file, addr, len, prot, flag, pgoff, 306 ret = do_mmap_pgoff(file, addr, len, prot, flag, pgoff,
302 &populate); 307 &populate);
303 up_write(&mm->mmap_sem); 308 up_write(&mm->mmap_sem);
@@ -307,6 +312,7 @@ unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
307 return ret; 312 return ret;
308} 313}
309 314
315/* XXX are all callers checking an error */
310unsigned long vm_mmap(struct file *file, unsigned long addr, 316unsigned long vm_mmap(struct file *file, unsigned long addr,
311 unsigned long len, unsigned long prot, 317 unsigned long len, unsigned long prot,
312 unsigned long flag, unsigned long offset) 318 unsigned long flag, unsigned long offset)
@@ -316,7 +322,7 @@ unsigned long vm_mmap(struct file *file, unsigned long addr,
316 if (unlikely(offset_in_page(offset))) 322 if (unlikely(offset_in_page(offset)))
317 return -EINVAL; 323 return -EINVAL;
318 324
319 return vm_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); 325 return vm_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT, false);
320} 326}
321EXPORT_SYMBOL(vm_mmap); 327EXPORT_SYMBOL(vm_mmap);
322 328