cow_user_page: fix page alignment
authorLinus Torvalds <torvalds@g5.osdl.org>
Tue, 29 Nov 2005 22:07:55 +0000 (14:07 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Tue, 29 Nov 2005 22:07:55 +0000 (14:07 -0800)
High Dickins points out that the user virtual address passed to the page
fault handler isn't necessarily page-aligned.

Also, add a comment on why the copy could fail for the user address case.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
mm/memory.c

index 74f95ae0510b738ac482d10b580d8195ae964e37..745b3482e6c2969fa5489f24787c3e576909e07b 100644 (file)
@@ -1394,8 +1394,15 @@ static inline void cow_user_page(struct page *dst, struct page *src, unsigned lo
         */
        if (unlikely(!src)) {
                void *kaddr = kmap_atomic(dst, KM_USER0);
-               unsigned long left = __copy_from_user_inatomic(kaddr, (void __user *)va, PAGE_SIZE);
-               if (left)
+               void __user *uaddr = (void __user *)(va & PAGE_MASK);
+
+               /*
+                * This really shouldn't fail, because the page is there
+                * in the page tables. But it might just be unreadable,
+                * in which case we just give up and fill the result with
+                * zeroes.
+                */
+               if (__copy_from_user_inatomic(kaddr, uaddr, PAGE_SIZE))
                        memset(kaddr, 0, PAGE_SIZE);
                kunmap_atomic(kaddr, KM_USER0);
                return;