I found a second bug... nfs truncation code race. I've enclosed both patches below. NFS truncation race first, softupdates bug second. The patches are against -stable.
There are still more bugs... the nfstest code is seeing data corruption on read. It looks like another truncation bug. I'm tracking it down. -Matt Index: nfs/nfs_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/nfs/Attic/nfs_vnops.c,v retrieving revision 1.150.2.4 diff -u -r1.150.2.4 nfs_vnops.c --- nfs/nfs_vnops.c 2001/08/05 00:23:58 1.150.2.4 +++ nfs/nfs_vnops.c 2001/12/13 01:42:15 @@ -710,6 +710,15 @@ */ if (vp->v_mount->mnt_flag & MNT_RDONLY) return (EROFS); + + /* + * We run vnode_pager_setsize() early (why?), + * we must set np->n_size now to avoid vinvalbuf + * V_SAVE races that might setsize a lower + * value. + */ + tsize = np->n_size; + np->n_size = vap->va_size; vnode_pager_setsize(vp, vap->va_size); if (np->n_flag & NMODIFIED) { if (vap->va_size == 0) @@ -719,12 +728,12 @@ error = nfs_vinvalbuf(vp, V_SAVE, ap->a_cred, ap->a_p, 1); if (error) { + np->n_size = tsize; vnode_pager_setsize(vp, np->n_size); return (error); } } - tsize = np->n_size; - np->n_size = np->n_vattr.va_size = vap->va_size; + np->n_vattr.va_size = vap->va_size; }; } else if ((vap->va_mtime.tv_sec != VNOVAL || vap->va_atime.tv_sec != VNOVAL) && (np->n_flag & NMODIFIED) && Index: ufs/ffs/ffs_inode.c =================================================================== RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_inode.c,v retrieving revision 1.56.2.3 diff -u -r1.56.2.3 ffs_inode.c --- ufs/ffs/ffs_inode.c 2001/11/20 20:27:27 1.56.2.3 +++ ufs/ffs/ffs_inode.c 2001/12/12 23:43:36 @@ -244,6 +244,10 @@ if (error) { return (error); } + if (length > 0 && DOINGSOFTDEP(ovp)) { + if ((error = VOP_FSYNC(ovp, cred, MNT_WAIT, p)) != 0) + return (error); + } oip->i_size = length; size = blksize(fs, oip, lbn); if (ovp->v_type != VDIR) @@ -359,6 +363,10 @@ if (newspace == 0) panic("ffs_truncate: newspace"); if (oldspace - newspace > 0) { + /* + * XXX Softupdates, adjust queued directblock + * in place rather then the second FSYNC above? + */ /* * Block number of space to be free'd is * the old block # plus the number of frags To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-hackers" in the body of the message