--- //depot/vendor/freebsd_6/src/sys/fs/nwfs/nwfs_io.c 2005/03/13 05:31:11 +++ //depot/yahoo/ybsd_6/src/sys/fs/nwfs/nwfs_io.c 2006/10/31 15:17:15 @@ -611,6 +612,13 @@ return EINTR; } np->n_flag |= NFLUSHINPROG; + + if (vp->v_bufobj.bo_object != NULL) { + VM_OBJECT_LOCK(vp->v_bufobj.bo_object); + vm_object_page_clean(vp->v_bufobj.bo_object, 0, 0, OBJPC_SYNC); + VM_OBJECT_UNLOCK(vp->v_bufobj.bo_object); + } + error = vinvalbuf(vp, V_SAVE, td, PCATCH, 0); while (error) { if (error == ERESTART || error == EINTR) { --- //depot/vendor/freebsd_6/src/sys/fs/smbfs/smbfs_io.c 2005/03/13 05:31:11 +++ //depot/yahoo/ybsd_6/src/sys/fs/smbfs/smbfs_io.c 2006/10/31 15:17:15 @@ -683,6 +684,13 @@ return EINTR; } np->n_flag |= NFLUSHINPROG; + + if (vp->v_bufobj.bo_object != NULL) { + VM_OBJECT_LOCK(vp->v_bufobj.bo_object); + vm_object_page_clean(vp->v_bufobj.bo_object, 0, 0, OBJPC_SYNC); + VM_OBJECT_UNLOCK(vp->v_bufobj.bo_object); + } + error = vinvalbuf(vp, V_SAVE, td, PCATCH, 0); while (error) { if (error == ERESTART || error == EINTR) { --- //depot/vendor/freebsd_6/src/sys/kern/vfs_subr.c 2006/12/04 01:28:29 +++ //depot/yahoo/ybsd_6/src/sys/kern/vfs_subr.c 2006/12/16 06:44:11 @@ -1162,7 +1168,7 @@ return (EAGAIN); /* XXX: why not loop ? */ } bremfree(bp); - bp->b_flags |= (B_INVAL | B_NOCACHE | B_RELBUF); + bp->b_flags |= (B_INVAL | B_RELBUF); bp->b_flags &= ~B_ASYNC; brelse(bp); BO_LOCK(bo); --- //depot/vendor/freebsd_6/src/sys/nfsclient/nfs_bio.c 2006/04/17 23:28:21 +++ //depot/yahoo/ybsd_6/src/sys/nfsclient/nfs_bio.c 2006/12/07 14:39:11 @@ -1314,13 +1326,27 @@ /* * Now, flush as required. */ + + if ((flags & V_SAVE) && (vp->v_bufobj.bo_object != NULL)) { + VM_OBJECT_LOCK(vp->v_bufobj.bo_object); + vm_object_page_clean(vp->v_bufobj.bo_object, 0, 0, OBJPC_SYNC); + VM_OBJECT_UNLOCK(vp->v_bufobj.bo_object); + /* + * If the page clean was interrupted, fail the invalidation. + * Not doing so, we run the risk of losing dirty pages in the + * vinvalbuf() call below. + */ + if (intrflg && (error = nfs_sigintr(nmp, NULL, td))) + goto out; + } + error = vinvalbuf(vp, flags, td, slpflag, 0); while (error) { if (intrflg && (error = nfs_sigintr(nmp, NULL, td))) goto out; error = vinvalbuf(vp, flags, td, 0, slptimeo); } np->n_flag &= ~NMODIFIED; out: if (old_lock != LK_EXCLUSIVE) { if (old_lock == LK_SHARED) {