[PATCH] mbind: restrict nodes to the currently allowed cpuset
[sfrench/cifs-2.6.git] / mm / mincore.c
index b44d7f875cb63a9afb5c0849d2338bb13ee399b0..8aca6f7167bbb25f858075c90c64d766fcc1e4c3 100644 (file)
@@ -49,29 +49,20 @@ static long do_mincore(unsigned long addr, unsigned char *vec, unsigned long pag
        struct vm_area_struct *vma = find_vma(current->mm, addr);
 
        /*
-        * find_vma() didn't find anything: the address
-        * is above everything we have mapped.
+        * find_vma() didn't find anything above us, or we're
+        * in an unmapped hole in the address space: ENOMEM.
         */
-       if (!vma) {
-               memset(vec, 0, pages);
-               return pages;
-       }
-
-       /*
-        * find_vma() found something, but we might be
-        * below it: check for that.
-        */
-       if (addr < vma->vm_start) {
-               unsigned long gap = (vma->vm_start - addr) >> PAGE_SHIFT;
-               if (gap > pages)
-                       gap = pages;
-               memset(vec, 0, gap);
-               return gap;
-       }
+       if (!vma || addr < vma->vm_start)
+               return -ENOMEM;
 
        /*
         * Ok, got it. But check whether it's a segment we support
         * mincore() on. Right now, we don't do any anonymous mappings.
+        *
+        * FIXME: This is just stupid. And returning ENOMEM is 
+        * stupid too. We should just look at the page tables. But
+        * this is what we've traditionally done, so we'll just
+        * continue doing it.
         */
        if (!vma->vm_file)
                return -ENOMEM;
@@ -142,7 +133,7 @@ asmlinkage long sys_mincore(unsigned long start, size_t len,
 
        tmp = (void *) __get_free_page(GFP_USER);
        if (!tmp)
-               return -ENOMEM;
+               return -EAGAIN;
 
        retval = 0;
        while (pages) {
@@ -151,7 +142,7 @@ asmlinkage long sys_mincore(unsigned long start, size_t len,
                 * the temporary buffer size.
                 */
                down_read(&current->mm->mmap_sem);
-               retval = do_mincore(start, tmp, max(pages, PAGE_SIZE));
+               retval = do_mincore(start, tmp, min(pages, PAGE_SIZE));
                up_read(&current->mm->mmap_sem);
 
                if (retval <= 0)