|
@@ -1358,13 +1358,14 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
|
|
|
|
|
if (!(flags & MAP_ANONYMOUS)) {
|
|
|
audit_mmap_fd(fd, flags);
|
|
|
- if (unlikely(flags & MAP_HUGETLB))
|
|
|
- return -EINVAL;
|
|
|
file = fget(fd);
|
|
|
if (!file)
|
|
|
goto out;
|
|
|
if (is_file_hugepages(file))
|
|
|
len = ALIGN(len, huge_page_size(hstate_file(file)));
|
|
|
+ retval = -EINVAL;
|
|
|
+ if (unlikely(flags & MAP_HUGETLB && !is_file_hugepages(file)))
|
|
|
+ goto out_fput;
|
|
|
} else if (flags & MAP_HUGETLB) {
|
|
|
struct user_struct *user = NULL;
|
|
|
struct hstate *hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) &
|
|
@@ -1391,6 +1392,7 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
|
|
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|
|
|
|
|
|
retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff);
|
|
|
+out_fput:
|
|
|
if (file)
|
|
|
fput(file);
|
|
|
out:
|