diff options
Diffstat (limited to 'mm/madvise.c')
| -rw-r--r-- | mm/madvise.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/mm/madvise.c b/mm/madvise.c index ae0ae3ea299a..af3d573b0141 100644 --- a/mm/madvise.c +++ b/mm/madvise.c | |||
| @@ -22,16 +22,23 @@ static long madvise_behavior(struct vm_area_struct * vma, | |||
| 22 | struct mm_struct * mm = vma->vm_mm; | 22 | struct mm_struct * mm = vma->vm_mm; |
| 23 | int error = 0; | 23 | int error = 0; |
| 24 | pgoff_t pgoff; | 24 | pgoff_t pgoff; |
| 25 | int new_flags = vma->vm_flags & ~VM_READHINTMASK; | 25 | int new_flags = vma->vm_flags; |
| 26 | 26 | ||
| 27 | switch (behavior) { | 27 | switch (behavior) { |
| 28 | case MADV_NORMAL: | ||
| 29 | new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ; | ||
| 30 | break; | ||
| 28 | case MADV_SEQUENTIAL: | 31 | case MADV_SEQUENTIAL: |
| 29 | new_flags |= VM_SEQ_READ; | 32 | new_flags = (new_flags & ~VM_RAND_READ) | VM_SEQ_READ; |
| 30 | break; | 33 | break; |
| 31 | case MADV_RANDOM: | 34 | case MADV_RANDOM: |
| 32 | new_flags |= VM_RAND_READ; | 35 | new_flags = (new_flags & ~VM_SEQ_READ) | VM_RAND_READ; |
| 33 | break; | 36 | break; |
| 34 | default: | 37 | case MADV_DONTFORK: |
| 38 | new_flags |= VM_DONTCOPY; | ||
| 39 | break; | ||
| 40 | case MADV_DOFORK: | ||
| 41 | new_flags &= ~VM_DONTCOPY; | ||
| 35 | break; | 42 | break; |
| 36 | } | 43 | } |
| 37 | 44 | ||
| @@ -177,6 +184,12 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, | |||
| 177 | long error; | 184 | long error; |
| 178 | 185 | ||
| 179 | switch (behavior) { | 186 | switch (behavior) { |
| 187 | case MADV_DOFORK: | ||
| 188 | if (vma->vm_flags & VM_IO) { | ||
| 189 | error = -EINVAL; | ||
| 190 | break; | ||
| 191 | } | ||
| 192 | case MADV_DONTFORK: | ||
| 180 | case MADV_NORMAL: | 193 | case MADV_NORMAL: |
| 181 | case MADV_SEQUENTIAL: | 194 | case MADV_SEQUENTIAL: |
| 182 | case MADV_RANDOM: | 195 | case MADV_RANDOM: |
