patch-2.0.34 linux/mm/mremap.c
Next file: linux/mm/swap_state.c
Previous file: linux/mm/mmap.c
Back to the patch index
Back to the overall index
- Lines: 36
- Date:
Wed Jun 3 15:17:50 1998
- Orig file:
v2.0.33/linux/mm/mremap.c
- Orig date:
Fri Nov 22 06:25:17 1996
diff -u --recursive --new-file v2.0.33/linux/mm/mremap.c linux/mm/mremap.c
@@ -19,6 +19,8 @@
#include <asm/system.h>
#include <asm/pgtable.h>
+extern int vm_enough_memory(long pages);
+
static inline pte_t *get_one_pte(struct mm_struct *mm, unsigned long addr)
{
pgd_t * pgd;
@@ -173,7 +175,7 @@
* Always allow a shrinking remap: that just unmaps
* the unnecessary pages..
*/
- if (old_len > new_len) {
+ if (old_len >= new_len) {
do_munmap(addr+new_len, old_len - new_len);
return addr;
}
@@ -196,11 +198,16 @@
if ((current->mm->total_vm << PAGE_SHIFT) + (new_len - old_len)
> current->rlim[RLIMIT_AS].rlim_cur)
return -ENOMEM;
+ /* Private writable mapping? Check memory availability.. */
+ if ((vma->vm_flags & (VM_SHARED | VM_WRITE)) == VM_WRITE) {
+ if (!vm_enough_memory((new_len - old_len) >> PAGE_SHIFT))
+ return -ENOMEM;
+ }
/* old_len exactly to the end of the area.. */
if (old_len == vma->vm_end - addr &&
(old_len != new_len || !(flags & MREMAP_MAYMOVE))) {
- unsigned long max_addr = TASK_SIZE;
+ unsigned long max_addr = MAX_USER_ADDR;
if (vma->vm_next)
max_addr = vma->vm_next->vm_start;
/* can we just expand the current mapping? */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov