diff options
| author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-02-24 14:31:04 -0500 |
|---|---|---|
| committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-02-24 14:33:45 -0500 |
| commit | 109d28152b6e9d5de64cd23e3bc08885ccb3d1ef (patch) | |
| tree | b7b8863faa05254781acfb85cc41da3eef467c6b /mm/mmap.c | |
| parent | 168cf9af699e87d5a6f44b684583714ecabb8e71 (diff) | |
| parent | 60b341b778cc2929df16c0a504c91621b3c6a4ad (diff) | |
Merge tag 'v2.6.33' for its firewire changes since last branch point
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'mm/mmap.c')
| -rw-r--r-- | mm/mmap.c | 40 |
1 files changed, 40 insertions, 0 deletions
| @@ -1043,6 +1043,46 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, | |||
| 1043 | } | 1043 | } |
| 1044 | EXPORT_SYMBOL(do_mmap_pgoff); | 1044 | EXPORT_SYMBOL(do_mmap_pgoff); |
| 1045 | 1045 | ||
| 1046 | SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, | ||
| 1047 | unsigned long, prot, unsigned long, flags, | ||
| 1048 | unsigned long, fd, unsigned long, pgoff) | ||
| 1049 | { | ||
| 1050 | struct file *file = NULL; | ||
| 1051 | unsigned long retval = -EBADF; | ||
| 1052 | |||
| 1053 | if (!(flags & MAP_ANONYMOUS)) { | ||
| 1054 | if (unlikely(flags & MAP_HUGETLB)) | ||
| 1055 | return -EINVAL; | ||
| 1056 | file = fget(fd); | ||
| 1057 | if (!file) | ||
| 1058 | goto out; | ||
| 1059 | } else if (flags & MAP_HUGETLB) { | ||
| 1060 | struct user_struct *user = NULL; | ||
| 1061 | /* | ||
| 1062 | * VM_NORESERVE is used because the reservations will be | ||
| 1063 | * taken when vm_ops->mmap() is called | ||
| 1064 | * A dummy user value is used because we are not locking | ||
| 1065 | * memory so no accounting is necessary | ||
| 1066 | */ | ||
| 1067 | len = ALIGN(len, huge_page_size(&default_hstate)); | ||
| 1068 | file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, VM_NORESERVE, | ||
| 1069 | &user, HUGETLB_ANONHUGE_INODE); | ||
| 1070 | if (IS_ERR(file)) | ||
| 1071 | return PTR_ERR(file); | ||
| 1072 | } | ||
| 1073 | |||
| 1074 | flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); | ||
| 1075 | |||
| 1076 | down_write(¤t->mm->mmap_sem); | ||
| 1077 | retval = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); | ||
| 1078 | up_write(¤t->mm->mmap_sem); | ||
| 1079 | |||
| 1080 | if (file) | ||
| 1081 | fput(file); | ||
| 1082 | out: | ||
| 1083 | return retval; | ||
| 1084 | } | ||
| 1085 | |||
| 1046 | /* | 1086 | /* |
| 1047 | * Some shared mappigns will want the pages marked read-only | 1087 | * Some shared mappigns will want the pages marked read-only |
| 1048 | * to track write events. If so, we'll downgrade vm_page_prot | 1088 | * to track write events. If so, we'll downgrade vm_page_prot |
