* Find an associated nfs write request, and prepare to flush it out
  * May return an error if the user signalled nfs_wait_on_request().
  */
-static int nfs_page_async_flush(struct nfs_pageio_descriptor *pgio,
-                               struct page *page)
+static int nfs_page_async_flush(struct page *page,
+                               struct writeback_control *wbc,
+                               struct nfs_pageio_descriptor *pgio)
 {
        struct nfs_page *req;
        int ret = 0;
                /*
                 * Remove the problematic req upon fatal errors on the server
                 */
-               if (nfs_error_is_fatal(ret)) {
-                       if (nfs_error_is_fatal_on_server(ret))
-                               goto out_launder;
-               } else
-                       ret = -EAGAIN;
+               if (nfs_error_is_fatal_on_server(ret))
+                       goto out_launder;
+               if (wbc->sync_mode == WB_SYNC_NONE)
+                       ret = AOP_WRITEPAGE_ACTIVATE;
+               redirty_page_for_writepage(wbc, page);
                nfs_redirty_request(req);
                pgio->pg_error = 0;
        } else
 static int nfs_do_writepage(struct page *page, struct writeback_control *wbc,
                            struct nfs_pageio_descriptor *pgio)
 {
-       int ret;
-
        nfs_pageio_cond_complete(pgio, page_index(page));
-       ret = nfs_page_async_flush(pgio, page);
-       if (ret == -EAGAIN) {
-               redirty_page_for_writepage(wbc, page);
-               ret = AOP_WRITEPAGE_ACTIVATE;
-       }
-       return ret;
+       return nfs_page_async_flush(page, wbc, pgio);
 }
 
 /*
                priority = wb_priority(wbc);
        }
 
-       nfs_pageio_init_write(&pgio, inode, priority, false,
-                               &nfs_async_write_completion_ops);
-       pgio.pg_io_completion = ioc;
-       err = write_cache_pages(mapping, wbc, nfs_writepages_callback, &pgio);
-       pgio.pg_error = 0;
-       nfs_pageio_complete(&pgio);
+       do {
+               nfs_pageio_init_write(&pgio, inode, priority, false,
+                                     &nfs_async_write_completion_ops);
+               pgio.pg_io_completion = ioc;
+               err = write_cache_pages(mapping, wbc, nfs_writepages_callback,
+                                       &pgio);
+               pgio.pg_error = 0;
+               nfs_pageio_complete(&pgio);
+       } while (err < 0 && !nfs_error_is_fatal(err));
        nfs_io_completion_put(ioc);
 
        if (err < 0)