From: suzuki The madvise() system call returns -EBADF for areas which does not map to files, only for *behaviour* request MADV_WILLNEED. According to man pages, madvise returns : EBADF - the map exists, but the area maps something that isn’t a file. Fixes bug 2995. Signed-off-by: Suzuki K P Signed-off-by: Andrew Morton --- mm/madvise.c | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff -puN mm/madvise.c~madvise-does-not-always-return-ebadf-on-non-file mm/madvise.c --- 25/mm/madvise.c~madvise-does-not-always-return-ebadf-on-non-file Wed Jul 6 13:50:30 2005 +++ 25-akpm/mm/madvise.c Wed Jul 6 13:51:56 2005 @@ -83,9 +83,6 @@ static long madvise_willneed(struct vm_a { struct file *file = vma->vm_file; - if (!file) - return -EBADF; - if (file->f_mapping->a_ops->get_xip_page) { /* no bad return value, but ignore advice */ return 0; @@ -140,11 +137,16 @@ static long madvise_dontneed(struct vm_a 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) { + struct file *filp = vma->vm_file; long error = -EBADF; + if (!filp) + goto out; + switch (behavior) { case MADV_NORMAL: case MADV_SEQUENTIAL: @@ -165,6 +167,7 @@ static long madvise_vma(struct vm_area_s break; } +out: return error; } _