Nick Piggin wrote:

@@ -1878,31 +1889,88 @@ generic_file_buffered_write(struct kiocb
                        break;
                }
+ /*
+                * non-uptodate pages cannot cope with short copies, and we
+                * cannot take a pagefault with the destination page locked.
+                * So pin the source page to copy it.
+                */
+               if (!PageUptodate(page)) {
+                       unlock_page(page);
+
+                       bytes = min(bytes, PAGE_CACHE_SIZE -
+                                    ((unsigned long)buf & ~PAGE_CACHE_MASK));
+
+                       /*
+                        * Cannot get_user_pages with a page locked for the
+                        * same reason as we can't take a page fault with a
+                        * page locked (as explained below).
+                        */
+                       status = get_user_pages(current, current->mm,
+                                       (unsigned long)buf & PAGE_CACHE_MASK, 1,
+                                       0, 0, &src_page, NULL);

Thinko... get_user_pages needs to be called with mmap_sem held, obviously.

--
SUSE Labs, Novell Inc.
Send instant messages to your online friends http://au.messenger.yahoo.com
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to