|
@@ -280,9 +280,24 @@ SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len,
|
|
|
unsigned long retval = -EBADF;
|
|
|
|
|
|
if (!(flags & MAP_ANONYMOUS)) {
|
|
|
+ if (unlikely(flags & MAP_HUGETLB))
|
|
|
+ return -EINVAL;
|
|
|
file = fget(fd);
|
|
|
if (!file)
|
|
|
goto out;
|
|
|
+ } else if (flags & MAP_HUGETLB) {
|
|
|
+ struct user_struct *user = NULL;
|
|
|
+ /*
|
|
|
+ * VM_NORESERVE is used because the reservations will be
|
|
|
+ * taken when vm_ops->mmap() is called
|
|
|
+ * A dummy user value is used because we are not locking
|
|
|
+ * memory so no accounting is necessary
|
|
|
+ */
|
|
|
+ len = ALIGN(len, huge_page_size(&default_hstate));
|
|
|
+ file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, VM_NORESERVE,
|
|
|
+ &user, HUGETLB_ANONHUGE_INODE);
|
|
|
+ if (IS_ERR(file))
|
|
|
+ return PTR_ERR(file);
|
|
|
}
|
|
|
|
|
|
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
|