* fall back to doing a synchronous write.
  */
 static int
-nfs_file_fsync_commit(struct file *file, loff_t start, loff_t end, int datasync)
+nfs_file_fsync_commit(struct file *file, int datasync)
 {
        struct nfs_open_context *ctx = nfs_file_open_context(file);
        struct inode *inode = file_inode(file);
-       int have_error, do_resend, status;
+       int do_resend, status;
        int ret = 0;
 
        dprintk("NFS: fsync file(%pD2) datasync %d\n", file, datasync);
 
        nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
        do_resend = test_and_clear_bit(NFS_CONTEXT_RESEND_WRITES, &ctx->flags);
-       have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
        status = nfs_commit_inode(inode, FLUSH_SYNC);
-       have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
-       if (have_error) {
+       if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
                ret = xchg(&ctx->error, 0);
                if (ret)
                        goto out;
        trace_nfs_fsync_enter(inode);
 
        do {
+               struct nfs_open_context *ctx = nfs_file_open_context(file);
                ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+               if (test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags)) {
+                       int ret2 = xchg(&ctx->error, 0);
+                       if (ret2)
+                               ret = ret2;
+               }
                if (ret != 0)
                        break;
-               ret = nfs_file_fsync_commit(file, start, end, datasync);
+               ret = nfs_file_fsync_commit(file, datasync);
                if (!ret)
                        ret = pnfs_sync_inode(inode, !!datasync);
                /*
 
 
                /* remember fatal errors */
                if (nfs_error_is_fatal(desc->pg_error))
-                       mapping_set_error(desc->pg_inode->i_mapping,
-                                         desc->pg_error);
+                       nfs_context_set_write_error(req->wb_context,
+                                                   desc->pg_error);
 
                func = desc->pg_completion_ops->error_cleanup;
                for (midx = 0; midx < desc->pg_mirror_count; midx++) {
 
                kref_put(&ioc->refcount, nfs_io_completion_release);
 }
 
-static void nfs_context_set_write_error(struct nfs_open_context *ctx, int error)
-{
-       ctx->error = error;
-       smp_wmb();
-       set_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
-}
-
 static struct nfs_page *
 nfs_page_private_request(struct page *page)
 {