Index: nfsclient/nfs_bio.c =================================================================== --- nfsclient/nfs_bio.c (revision 225295) +++ nfsclient/nfs_bio.c (working copy) @@ -1203,6 +1204,7 @@ * to turn off caching in this case. Very odd. XXX */ if ((ioflag & IO_SYNC)) { + bp->b_flags |= B_SYNC; if (ioflag & IO_INVAL) bp->b_flags |= B_NOCACHE; error = bwrite(bp); @@ -1659,10 +1680,10 @@ uiop->uio_rw = UIO_WRITE; nfsstats.write_bios++; - if ((bp->b_flags & (B_ASYNC | B_NEEDCOMMIT | B_NOCACHE | B_CLUSTER)) == B_ASYNC) + if (!(bp->b_flags & (B_SYNC | B_NEEDCOMMIT | B_NOCACHE | B_CLUSTER))) iomode = NFSV3WRITE_UNSTABLE; else iomode = NFSV3WRITE_FILESYNC; error = (nmp->nm_rpcops->nr_writerpc)(vp, uiop, cr, &iomode, &must_commit); Index: kern/vfs_bio.c =================================================================== --- kern/vfs_bio.c (revision 225284) +++ kern/vfs_bio.c (working copy) @@ -1482,7 +1482,8 @@ if (bp->b_bufsize || bp->b_kvasize) bufspacewakeup(); - bp->b_flags &= ~(B_ASYNC | B_NOCACHE | B_AGE | B_RELBUF | B_DIRECT); + bp->b_flags &= ~(B_ASYNC | B_NOCACHE | B_AGE | B_RELBUF | B_DIRECT | + B_SYNC); if ((bp->b_flags & B_DELWRI) == 0 && (bp->b_xflags & BX_VNDIRTY)) panic("brelse: not dirty"); /* unlock */ @@ -1526,7 +1527,7 @@ BO_UNLOCK(bo); mtx_unlock(&bqlock); } - bp->b_flags &= ~(B_ASYNC | B_NOCACHE | B_AGE | B_RELBUF); + bp->b_flags &= ~(B_ASYNC | B_NOCACHE | B_AGE | B_RELBUF | B_SYNC); BUF_UNLOCK(bp); return; } @@ -1588,7 +1589,7 @@ if (bp->b_bufsize && !(bp->b_flags & B_DELWRI)) bufspacewakeup(); - bp->b_flags &= ~(B_ASYNC | B_NOCACHE | B_AGE | B_RELBUF); + bp->b_flags &= ~(B_ASYNC | B_NOCACHE | B_AGE | B_RELBUF | B_SYNC); if ((bp->b_flags & B_DELWRI) == 0 && (bp->b_xflags & BX_VNDIRTY)) panic("bqrelse: not dirty"); /* unlock */ Index: fs/nfsclient/nfs_clbio.c =================================================================== --- fs/nfsclient/nfs_clbio.c (revision 225284) +++ fs/nfsclient/nfs_clbio.c (working copy) @@ -1207,6 +1207,7 @@ * to turn off caching in this case. Very odd. XXX */ if ((ioflag & IO_SYNC)) { + bp->b_flags |= B_SYNC; if (ioflag & IO_INVAL) bp->b_flags |= B_NOCACHE; error = bwrite(bp); @@ -1664,7 +1665,7 @@ uiop->uio_rw = UIO_WRITE; NFSINCRGLOBAL(newnfsstats.write_bios); - if ((bp->b_flags & (B_ASYNC | B_NEEDCOMMIT | B_NOCACHE | B_CLUSTER)) == B_ASYNC) + if (!(bp->b_flags & (B_SYNC | B_NEEDCOMMIT | B_NOCACHE | B_CLUSTER))) iomode = NFSWRITE_UNSTABLE; else iomode = NFSWRITE_FILESYNC; Index: sys/buf.h =================================================================== --- sys/buf.h (revision 225284) +++ sys/buf.h (working copy) @@ -202,7 +202,7 @@ #define B_PERSISTENT 0x00000100 /* Perm. ref'ed while EXT2FS mounted. */ #define B_DONE 0x00000200 /* I/O completed. */ #define B_EINTR 0x00000400 /* I/O was interrupted */ -#define B_00000800 0x00000800 /* Available flag. */ +#define B_SYNC 0x00000800 /* Synchronous write (in NFS). */ #define B_00001000 0x00001000 /* Available flag. */ #define B_INVAL 0x00002000 /* Does not contain valid info. */ #define B_00004000 0x00004000 /* Available flag. */