* cannot take a pagefault with the destination page locked.
                 * So pin the source page to copy it.
                 */
-               if (!PageUptodate(page)) {
+               if (!PageUptodate(page) && !segment_eq(get_fs(), KERNEL_DS)) {
                        unlock_page(page);
 
                        src_page = alloc_page(GFP_KERNEL);
        const struct address_space_operations *a_ops = mapping->a_ops;
        long status = 0;
        ssize_t written = 0;
+       unsigned int flags = 0;
+
+       /*
+        * Copies from kernel address space cannot fail (NFSD is a big user).
+        */
+       if (segment_eq(get_fs(), KERNEL_DS))
+               flags |= AOP_FLAG_UNINTERRUPTIBLE;
 
        do {
                struct page *page;
                        break;
                }
 
-               status = a_ops->write_begin(file, mapping, pos, bytes, 0,
+               status = a_ops->write_begin(file, mapping, pos, bytes, flags,
                                                &page, &fsdata);
                if (unlikely(status))
                        break;