X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=mm%2Fmadvise.c;h=20e075d1c64c9c64674e5fc418c6643418931661;hb=974f7bc5781d3fc16e32d8908c6e48592e767dd2;hp=e3108054733c2530fd28114b4814e27eda106ac0;hpb=da04b128cf0d74dd4cab270c53d9264e70f9203e;p=mv-sheeva.git diff --git a/mm/madvise.c b/mm/madvise.c index e3108054733..20e075d1c64 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -37,7 +37,7 @@ static long madvise_behavior(struct vm_area_struct * vma, if (new_flags == vma->vm_flags) { *prev = vma; - goto success; + goto out; } pgoff = vma->vm_pgoff + ((start - vma->vm_start) >> PAGE_SHIFT); @@ -62,16 +62,15 @@ static long madvise_behavior(struct vm_area_struct * vma, goto out; } +success: /* * vm_flags is protected by the mmap_sem held in write mode. */ - VM_ClearReadHint(vma); vma->vm_flags = new_flags; out: if (error == -ENOMEM) error = -EAGAIN; -success: return error; } @@ -87,6 +86,11 @@ static long madvise_willneed(struct vm_area_struct * vma, if (!file) return -EBADF; + if (file->f_mapping->a_ops->get_xip_page) { + /* no bad return value, but ignore advice */ + return 0; + } + *prev = vma; start = ((start - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; if (end > vma->vm_end) @@ -136,10 +140,11 @@ static long madvise_dontneed(struct vm_area_struct * vma, return 0; } -static long madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, - unsigned long start, unsigned long end, int behavior) +static long +madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev, + unsigned long start, unsigned long end, int behavior) { - long error = -EBADF; + long error; switch (behavior) { case MADV_NORMAL: @@ -160,7 +165,6 @@ static long madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev error = -EINVAL; break; } - return error; } @@ -230,8 +234,9 @@ asmlinkage long sys_madvise(unsigned long start, size_t len_in, int behavior) * - different from the way of handling in mlock etc. */ vma = find_vma_prev(current->mm, start, &prev); - if (!vma && prev) - vma = prev->vm_next; + if (vma && start > vma->vm_start) + prev = vma; + for (;;) { /* Still start < end. */ error = -ENOMEM;