diff --git a/sys/fs/nfsclient/nfs_clvnops.c.objflush b/sys/fs/nfsclient/nfs_clvnops.c --- a/sys/fs/nfsclient/nfs_clvnops.c.objflush +++ b/sys/fs/nfsclient/nfs_clvnops.c @@ -1982,6 +1982,7 @@ struct nfsnode *fnp = VTONFS(ap->a_fvp); struct nfsnode *tdnp = VTONFS(ap->a_tdvp); struct nfsv4node *newv4 = NULL; + vm_object_t obj; int error; /* Check for cross-device rename */ @@ -2012,10 +2013,24 @@ * that was written back to our cache earlier. Not checking for * this condition can result in potential (silent) data loss. */ + obj = fvp->v_object; + if (obj != NULL && vm_object_mightbedirty(obj)) { + VM_OBJECT_WLOCK(obj); + vm_object_page_clean(obj, 0, 0, OBJPC_SYNC); + VM_OBJECT_WUNLOCK(obj); + } error = VOP_FSYNC(fvp, MNT_WAIT, curthread); NFSVOPUNLOCK(fvp); - if (!error && tvp) + if (!error && tvp) { + ASSERT_VOP_ELOCKED(tvp, "nfs_rename"); + obj = tvp->v_object; + if (obj != NULL && vm_object_mightbedirty(obj)) { + VM_OBJECT_WLOCK(obj); + vm_object_page_clean(obj, 0, 0, OBJPC_SYNC); + VM_OBJECT_WUNLOCK(obj); + } error = VOP_FSYNC(tvp, MNT_WAIT, curthread); + } if (error) goto out;