|
@@ -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;
|