diff options
author | Hendrik Brueckner <brueckner@linux.vnet.ibm.com> | 2013-02-11 08:29:49 -0500 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2013-02-14 09:55:22 -0500 |
commit | 486c0a0bc80d370471b21662bf03f04fbb37cdc6 (patch) | |
tree | 29b538296d454871ba0b4dd9802e0e154eb2102b | |
parent | a4e69245bd7793a620ed67442c00fa1f2dd56891 (diff) |
s390/mm: Fix crst upgrade of mmap with MAP_FIXED
Right now the page table upgrade does not happen if the end address
of a fixed mapping is greater than TASK_SIZE.
Enhance s390_mmap_check() to handle MAP_FIXED mappings correctly.
Signed-off-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r-- | arch/s390/include/asm/mman.h | 4 | ||||
-rw-r--r-- | arch/s390/mm/mmap.c | 9 |
2 files changed, 8 insertions, 5 deletions
diff --git a/arch/s390/include/asm/mman.h b/arch/s390/include/asm/mman.h index 0e47a576d666..9977e08df5bd 100644 --- a/arch/s390/include/asm/mman.h +++ b/arch/s390/include/asm/mman.h | |||
@@ -9,7 +9,7 @@ | |||
9 | #include <uapi/asm/mman.h> | 9 | #include <uapi/asm/mman.h> |
10 | 10 | ||
11 | #if !defined(__ASSEMBLY__) && defined(CONFIG_64BIT) | 11 | #if !defined(__ASSEMBLY__) && defined(CONFIG_64BIT) |
12 | int s390_mmap_check(unsigned long addr, unsigned long len); | 12 | int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags); |
13 | #define arch_mmap_check(addr,len,flags) s390_mmap_check(addr,len) | 13 | #define arch_mmap_check(addr, len, flags) s390_mmap_check(addr, len, flags) |
14 | #endif | 14 | #endif |
15 | #endif /* __S390_MMAN_H__ */ | 15 | #endif /* __S390_MMAN_H__ */ |
diff --git a/arch/s390/mm/mmap.c b/arch/s390/mm/mmap.c index c59a5efa58b1..06bafec00278 100644 --- a/arch/s390/mm/mmap.c +++ b/arch/s390/mm/mmap.c | |||
@@ -101,12 +101,15 @@ void arch_pick_mmap_layout(struct mm_struct *mm) | |||
101 | 101 | ||
102 | #else | 102 | #else |
103 | 103 | ||
104 | int s390_mmap_check(unsigned long addr, unsigned long len) | 104 | int s390_mmap_check(unsigned long addr, unsigned long len, unsigned long flags) |
105 | { | 105 | { |
106 | int rc; | 106 | int rc; |
107 | 107 | ||
108 | if (!is_compat_task() && | 108 | if (is_compat_task() || (TASK_SIZE >= (1UL << 53))) |
109 | len >= TASK_SIZE && TASK_SIZE < (1UL << 53)) { | 109 | return 0; |
110 | if (!(flags & MAP_FIXED)) | ||
111 | addr = 0; | ||
112 | if ((addr + len) >= TASK_SIZE) { | ||
110 | rc = crst_table_upgrade(current->mm, 1UL << 53); | 113 | rc = crst_table_upgrade(current->mm, 1UL << 53); |
111 | if (rc) | 114 | if (rc) |
112 | return rc; | 115 | return rc; |