diff options
-rw-r--r-- | mm/mincore.c | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/mm/mincore.c b/mm/mincore.c index b44d7f875cb6..566b6c2bae5f 100644 --- a/mm/mincore.c +++ b/mm/mincore.c | |||
@@ -49,29 +49,20 @@ static long do_mincore(unsigned long addr, unsigned char *vec, unsigned long pag | |||
49 | struct vm_area_struct *vma = find_vma(current->mm, addr); | 49 | struct vm_area_struct *vma = find_vma(current->mm, addr); |
50 | 50 | ||
51 | /* | 51 | /* |
52 | * find_vma() didn't find anything: the address | 52 | * find_vma() didn't find anything above us, or we're |
53 | * is above everything we have mapped. | 53 | * in an unmapped hole in the address space: ENOMEM. |
54 | */ | 54 | */ |
55 | if (!vma) { | 55 | if (!vma || addr < vma->vm_start) |
56 | memset(vec, 0, pages); | 56 | return -ENOMEM; |
57 | return pages; | ||
58 | } | ||
59 | |||
60 | /* | ||
61 | * find_vma() found something, but we might be | ||
62 | * below it: check for that. | ||
63 | */ | ||
64 | if (addr < vma->vm_start) { | ||
65 | unsigned long gap = (vma->vm_start - addr) >> PAGE_SHIFT; | ||
66 | if (gap > pages) | ||
67 | gap = pages; | ||
68 | memset(vec, 0, gap); | ||
69 | return gap; | ||
70 | } | ||
71 | 57 | ||
72 | /* | 58 | /* |
73 | * Ok, got it. But check whether it's a segment we support | 59 | * Ok, got it. But check whether it's a segment we support |
74 | * mincore() on. Right now, we don't do any anonymous mappings. | 60 | * mincore() on. Right now, we don't do any anonymous mappings. |
61 | * | ||
62 | * FIXME: This is just stupid. And returning ENOMEM is | ||
63 | * stupid too. We should just look at the page tables. But | ||
64 | * this is what we've traditionally done, so we'll just | ||
65 | * continue doing it. | ||
75 | */ | 66 | */ |
76 | if (!vma->vm_file) | 67 | if (!vma->vm_file) |
77 | return -ENOMEM; | 68 | return -ENOMEM; |
@@ -142,7 +133,7 @@ asmlinkage long sys_mincore(unsigned long start, size_t len, | |||
142 | 133 | ||
143 | tmp = (void *) __get_free_page(GFP_USER); | 134 | tmp = (void *) __get_free_page(GFP_USER); |
144 | if (!tmp) | 135 | if (!tmp) |
145 | return -ENOMEM; | 136 | return -EAGAIN; |
146 | 137 | ||
147 | retval = 0; | 138 | retval = 0; |
148 | while (pages) { | 139 | while (pages) { |