|
@@ -2765,16 +2765,26 @@ int make_pages_present(unsigned long addr, unsigned long end)
|
|
|
|
|
|
vma = find_vma(current->mm, addr);
|
|
vma = find_vma(current->mm, addr);
|
|
if (!vma)
|
|
if (!vma)
|
|
- return -1;
|
|
|
|
|
|
+ return -ENOMEM;
|
|
write = (vma->vm_flags & VM_WRITE) != 0;
|
|
write = (vma->vm_flags & VM_WRITE) != 0;
|
|
BUG_ON(addr >= end);
|
|
BUG_ON(addr >= end);
|
|
BUG_ON(end > vma->vm_end);
|
|
BUG_ON(end > vma->vm_end);
|
|
len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE;
|
|
len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE;
|
|
ret = get_user_pages(current, current->mm, addr,
|
|
ret = get_user_pages(current, current->mm, addr,
|
|
len, write, 0, NULL, NULL);
|
|
len, write, 0, NULL, NULL);
|
|
- if (ret < 0)
|
|
|
|
|
|
+ if (ret < 0) {
|
|
|
|
+ /*
|
|
|
|
+ SUS require strange return value to mlock
|
|
|
|
+ - invalid addr generate to ENOMEM.
|
|
|
|
+ - out of memory should generate EAGAIN.
|
|
|
|
+ */
|
|
|
|
+ if (ret == -EFAULT)
|
|
|
|
+ ret = -ENOMEM;
|
|
|
|
+ else if (ret == -ENOMEM)
|
|
|
|
+ ret = -EAGAIN;
|
|
return ret;
|
|
return ret;
|
|
- return ret == len ? 0 : -1;
|
|
|
|
|
|
+ }
|
|
|
|
+ return ret == len ? 0 : -ENOMEM;
|
|
}
|
|
}
|
|
|
|
|
|
#if !defined(__HAVE_ARCH_GATE_AREA)
|
|
#if !defined(__HAVE_ARCH_GATE_AREA)
|