flags |= RWF_SYNC;
 
        iov_iter_kvec(&iter, WRITE, vec, vlen, *cnt);
-       host_err = vfs_iter_write(file, &iter, &pos, flags);
+       if (flags & RWF_SYNC) {
+               down_write(&nf->nf_rwsem);
+               host_err = vfs_iter_write(file, &iter, &pos, flags);
+               if (host_err < 0)
+                       nfsd_reset_boot_verifier(net_generic(SVC_NET(rqstp),
+                                                nfsd_net_id));
+               up_write(&nf->nf_rwsem);
+       } else {
+               down_read(&nf->nf_rwsem);
+               host_err = vfs_iter_write(file, &iter, &pos, flags);
+               up_read(&nf->nf_rwsem);
+       }
        if (host_err < 0)
                goto out_nfserr;
        *cnt = host_err;
        if (err)
                goto out;
        if (EX_ISSYNC(fhp->fh_export)) {
-               int err2 = vfs_fsync_range(nf->nf_file, offset, end, 0);
+               int err2;
 
+               down_write(&nf->nf_rwsem);
+               err2 = vfs_fsync_range(nf->nf_file, offset, end, 0);
                switch (err2) {
                case 0:
                        break;
                        nfsd_reset_boot_verifier(net_generic(nf->nf_net,
                                                 nfsd_net_id));
                }
+               up_write(&nf->nf_rwsem);
        }
 
        nfsd_file_put(nf);