[PATCH] mlock error handling fix
authorAndrew Morton <akpm@osdl.org>
Sun, 21 Sep 2003 08:43:28 +0000 (01:43 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Sun, 21 Sep 2003 08:43:28 +0000 (01:43 -0700)
make_pages_present() can fail: propagate that failure back.

Spotted by Bill Irwin.

mm/memory.c
mm/mlock.c

index 980953d..be552e3 100644 (file)
@@ -1655,6 +1655,8 @@ int make_pages_present(unsigned long addr, unsigned long end)
        len = (end+PAGE_SIZE-1)/PAGE_SIZE-addr/PAGE_SIZE;
        ret = get_user_pages(current, current->mm, addr,
                        len, write, 0, NULL, NULL);
+       if (ret < 0)
+               return ret;
        return ret == len ? 0 : -1;
 }
 
index 21c8fbf..6f026bd 100644 (file)
@@ -13,21 +13,24 @@ static int mlock_fixup(struct vm_area_struct * vma,
        unsigned long start, unsigned long end, unsigned int newflags)
 {
        struct mm_struct * mm = vma->vm_mm;
-       int pages, error;
+       int pages;
+       int ret = 0;
 
        if (newflags == vma->vm_flags)
-               return 0;
+               goto out;
 
        if (start != vma->vm_start) {
-               error = split_vma(mm, vma, start, 1);
-               if (error)
-                       return -EAGAIN;
+               if (split_vma(mm, vma, start, 1)) {
+                       ret = -EAGAIN;
+                       goto out;
+               }
        }
 
        if (end != vma->vm_end) {
-               error = split_vma(mm, vma, end, 0);
-               if (error)
-                       return -EAGAIN;
+               if (split_vma(mm, vma, end, 0)) {
+                       ret = -EAGAIN;
+                       goto out;
+               }
        }
        
        spin_lock(&mm->page_table_lock);
@@ -40,11 +43,12 @@ static int mlock_fixup(struct vm_area_struct * vma,
        pages = (end - start) >> PAGE_SHIFT;
        if (newflags & VM_LOCKED) {
                pages = -pages;
-               make_pages_present(start, end);
+               ret = make_pages_present(start, end);
        }
 
        vma->vm_mm->locked_vm -= pages;
-       return 0;
+out:
+       return ret;
 }
 
 static int do_mlock(unsigned long start, size_t len, int on)