projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
USB: aircable: Use usb_endpoint_* functions
[powerpc.git]
/
mm
/
madvise.c
diff --git
a/mm/madvise.c
b/mm/madvise.c
index
ae0ae3e
..
4e19615
100644
(file)
--- a/
mm/madvise.c
+++ b/
mm/madvise.c
@@
-22,16
+22,23
@@
static long madvise_behavior(struct vm_area_struct * vma,
struct mm_struct * mm = vma->vm_mm;
int error = 0;
pgoff_t pgoff;
struct mm_struct * mm = vma->vm_mm;
int error = 0;
pgoff_t pgoff;
- int new_flags = vma->vm_flags
& ~VM_READHINTMASK
;
+ int new_flags = vma->vm_flags;
switch (behavior) {
switch (behavior) {
+ case MADV_NORMAL:
+ new_flags = new_flags & ~VM_RAND_READ & ~VM_SEQ_READ;
+ break;
case MADV_SEQUENTIAL:
case MADV_SEQUENTIAL:
- new_flags
|=
VM_SEQ_READ;
+ new_flags
= (new_flags & ~VM_RAND_READ) |
VM_SEQ_READ;
break;
case MADV_RANDOM:
break;
case MADV_RANDOM:
- new_flags
|=
VM_RAND_READ;
+ new_flags
= (new_flags & ~VM_SEQ_READ) |
VM_RAND_READ;
break;
break;
- default:
+ case MADV_DONTFORK:
+ new_flags |= VM_DONTCOPY;
+ break;
+ case MADV_DOFORK:
+ new_flags &= ~VM_DONTCOPY;
break;
}
break;
}
@@
-161,6
+168,9
@@
static long madvise_remove(struct vm_area_struct *vma,
return -EINVAL;
}
return -EINVAL;
}
+ if ((vma->vm_flags & (VM_SHARED|VM_WRITE)) != (VM_SHARED|VM_WRITE))
+ return -EACCES;
+
mapping = vma->vm_file->f_mapping;
offset = (loff_t)(start - vma->vm_start)
mapping = vma->vm_file->f_mapping;
offset = (loff_t)(start - vma->vm_start)
@@
-177,6
+187,12
@@
madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
long error;
switch (behavior) {
long error;
switch (behavior) {
+ case MADV_DOFORK:
+ if (vma->vm_flags & VM_IO) {
+ error = -EINVAL;
+ break;
+ }
+ case MADV_DONTFORK:
case MADV_NORMAL:
case MADV_SEQUENTIAL:
case MADV_RANDOM:
case MADV_NORMAL:
case MADV_SEQUENTIAL:
case MADV_RANDOM: