diff options
author | suzuki <suzuki@in.ibm.com> | 2005-07-27 11:43:59 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-27 16:25:54 -0700 |
commit | 165cd40235732644b1856a5ed5e158c9b93f6010 (patch) | |
tree | c68180b6d700953530c8a7852a095f9ac4840345 | |
parent | 4bfdf37830111321e2cd1fe0102dd776ce93194d (diff) | |
download | linux-3.10-165cd40235732644b1856a5ed5e158c9b93f6010.tar.gz linux-3.10-165cd40235732644b1856a5ed5e158c9b93f6010.tar.bz2 linux-3.10-165cd40235732644b1856a5ed5e158c9b93f6010.zip |
[PATCH] madvise() does not always return -EBADF on non-file mapped area
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 <suzuki@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | mm/madvise.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/mm/madvise.c b/mm/madvise.c index 73180a22877..c8c01a12fea 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -83,9 +83,6 @@ static long madvise_willneed(struct vm_area_struct * vma, { 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_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) { + 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_struct *vma, struct vm_area_struct **prev break; } +out: return error; } |