Skip to content

Commit eb36c58

Browse files
author
Al Viro
committed
new helper: vm_mmap_pgoff()
take it to mm/util.c, convert vm_mmap() to use of that one and take it to mm/util.c as well, convert both sys_mmap_pgoff() to use of vm_mmap_pgoff() Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent dc98250 commit eb36c58

File tree

4 files changed

+36
-57
lines changed

4 files changed

+36
-57
lines changed

mm/internal.h

+4
Original file line numberDiff line numberDiff line change
@@ -342,3 +342,7 @@ extern u64 hwpoison_filter_flags_mask;
342342
extern u64 hwpoison_filter_flags_value;
343343
extern u64 hwpoison_filter_memcg;
344344
extern u32 hwpoison_filter_enable;
345+
346+
extern unsigned long vm_mmap_pgoff(struct file *, unsigned long,
347+
unsigned long, unsigned long,
348+
unsigned long, unsigned long);

mm/mmap.c

+1-29
Original file line numberDiff line numberDiff line change
@@ -1102,28 +1102,6 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
11021102
return mmap_region(file, addr, len, flags, vm_flags, pgoff);
11031103
}
11041104

1105-
unsigned long vm_mmap(struct file *file, unsigned long addr,
1106-
unsigned long len, unsigned long prot,
1107-
unsigned long flag, unsigned long offset)
1108-
{
1109-
unsigned long ret;
1110-
struct mm_struct *mm = current->mm;
1111-
1112-
if (unlikely(offset + PAGE_ALIGN(len) < offset))
1113-
return -EINVAL;
1114-
if (unlikely(offset & ~PAGE_MASK))
1115-
return -EINVAL;
1116-
1117-
ret = security_mmap_file(file, prot, flag);
1118-
if (!ret) {
1119-
down_write(&mm->mmap_sem);
1120-
ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
1121-
up_write(&mm->mmap_sem);
1122-
}
1123-
return ret;
1124-
}
1125-
EXPORT_SYMBOL(vm_mmap);
1126-
11271105
SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
11281106
unsigned long, prot, unsigned long, flags,
11291107
unsigned long, fd, unsigned long, pgoff)
@@ -1155,13 +1133,7 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
11551133

11561134
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
11571135

1158-
retval = security_mmap_file(file, prot, flags);
1159-
if (!retval) {
1160-
down_write(&current->mm->mmap_sem);
1161-
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
1162-
up_write(&current->mm->mmap_sem);
1163-
}
1164-
1136+
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
11651137
if (file)
11661138
fput(file);
11671139
out:

mm/nommu.c

+1-28
Original file line numberDiff line numberDiff line change
@@ -1470,28 +1470,6 @@ unsigned long do_mmap_pgoff(struct file *file,
14701470
return -ENOMEM;
14711471
}
14721472

1473-
unsigned long vm_mmap(struct file *file, unsigned long addr,
1474-
unsigned long len, unsigned long prot,
1475-
unsigned long flag, unsigned long offset)
1476-
{
1477-
unsigned long ret;
1478-
struct mm_struct *mm = current->mm;
1479-
1480-
if (unlikely(offset + PAGE_ALIGN(len) < offset))
1481-
return -EINVAL;
1482-
if (unlikely(offset & ~PAGE_MASK))
1483-
return -EINVAL;
1484-
1485-
ret = security_mmap_file(file, prot, flag);
1486-
if (!ret) {
1487-
down_write(&mm->mmap_sem);
1488-
ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
1489-
up_write(&mm->mmap_sem);
1490-
}
1491-
return ret;
1492-
}
1493-
EXPORT_SYMBOL(vm_mmap);
1494-
14951473
SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
14961474
unsigned long, prot, unsigned long, flags,
14971475
unsigned long, fd, unsigned long, pgoff)
@@ -1508,12 +1486,7 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
15081486

15091487
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
15101488

1511-
ret = security_mmap_file(file, prot, flags);
1512-
if (!ret) {
1513-
down_write(&current->mm->mmap_sem);
1514-
retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
1515-
up_write(&current->mm->mmap_sem);
1516-
}
1489+
ret = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
15171490

15181491
if (file)
15191492
fput(file);

mm/util.c

+30
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <linux/export.h>
55
#include <linux/err.h>
66
#include <linux/sched.h>
7+
#include <linux/security.h>
78
#include <asm/uaccess.h>
89

910
#include "internal.h"
@@ -341,6 +342,35 @@ int __attribute__((weak)) get_user_pages_fast(unsigned long start,
341342
}
342343
EXPORT_SYMBOL_GPL(get_user_pages_fast);
343344

345+
unsigned long vm_mmap_pgoff(struct file *file, unsigned long addr,
346+
unsigned long len, unsigned long prot,
347+
unsigned long flag, unsigned long pgoff)
348+
{
349+
unsigned long ret;
350+
struct mm_struct *mm = current->mm;
351+
352+
ret = security_mmap_file(file, prot, flag);
353+
if (!ret) {
354+
down_write(&mm->mmap_sem);
355+
ret = do_mmap_pgoff(file, addr, len, prot, flag, pgoff);
356+
up_write(&mm->mmap_sem);
357+
}
358+
return ret;
359+
}
360+
361+
unsigned long vm_mmap(struct file *file, unsigned long addr,
362+
unsigned long len, unsigned long prot,
363+
unsigned long flag, unsigned long offset)
364+
{
365+
if (unlikely(offset + PAGE_ALIGN(len) < offset))
366+
return -EINVAL;
367+
if (unlikely(offset & ~PAGE_MASK))
368+
return -EINVAL;
369+
370+
return vm_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT);
371+
}
372+
EXPORT_SYMBOL(vm_mmap);
373+
344374
/* Tracepoints definitions. */
345375
EXPORT_TRACEPOINT_SYMBOL(kmalloc);
346376
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);

0 commit comments

Comments
 (0)