static void nfsd4_init_copy_res(struct nfsd4_copy *copy, bool sync)
 {
-       copy->cp_res.wr_stable_how = NFS_UNSTABLE;
+       copy->cp_res.wr_stable_how =
+               copy->committed ? NFS_FILE_SYNC : NFS_UNSTABLE;
        copy->cp_synchronous = sync;
        gen_boot_verifier(©->cp_res.wr_verifier, copy->cp_clp->net);
 }
        u64 bytes_total = copy->cp_count;
        u64 src_pos = copy->cp_src_pos;
        u64 dst_pos = copy->cp_dst_pos;
+       __be32 status;
 
        /* See RFC 7862 p.67: */
        if (bytes_total == 0)
                src_pos += bytes_copied;
                dst_pos += bytes_copied;
        } while (bytes_total > 0 && !copy->cp_synchronous);
+       /* for a non-zero asynchronous copy do a commit of data */
+       if (!copy->cp_synchronous && copy->cp_res.wr_bytes_written > 0) {
+               down_write(©->nf_dst->nf_rwsem);
+               status = vfs_fsync_range(copy->nf_dst->nf_file,
+                                        copy->cp_dst_pos,
+                                        copy->cp_res.wr_bytes_written, 0);
+               up_write(©->nf_dst->nf_rwsem);
+               if (!status)
+                       copy->committed = true;
+       }
        return bytes_copied;
 }