From owner-freebsd-stable Sat Jan 6 11: 8:28 2001 From owner-freebsd-stable@FreeBSD.ORG Sat Jan 6 11:08:25 2001 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from earth.backplane.com (placeholder-dcat-1076843399.broadbandoffice.net [64.47.83.135]) by hub.freebsd.org (Postfix) with ESMTP id 2D5D237B400 for ; Sat, 6 Jan 2001 11:08:25 -0800 (PST) Received: (from dillon@localhost) by earth.backplane.com (8.11.1/8.9.3) id f06J8LI13763; Sat, 6 Jan 2001 11:08:21 -0800 (PST) (envelope-from dillon) Date: Sat, 6 Jan 2001 11:08:21 -0800 (PST) From: Matt Dillon Message-Id: <200101061908.f06J8LI13763@earth.backplane.com> To: freebsd-stable@FreeBSD.ORG Subject: Re: NFSv3 O_EXCL file create - protocol spec & solution (was Re: Bug in NFSv3 client) References: <20010103155533.B71238@math.uic.edu> <200101032243.f03Mhar51440@earth.backplane.com> <200101032308.f03N84f51776@earth.backplane.com> <200101032322.f03NMTK51973@earth.backplane.com> <200101040754.f047sUW55674@earth.backplane.com> Sender: owner-freebsd-stable@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG The fix has been MFCd' to -stable. I would like to MFC the fix to 3.x as well since that was what the original PR was filed under, but I have no 3.x machines to test it on. If someone with a 3.x machine and source tree could test the patch included at the end and give me a yah or nay, I'd appreciate it. The patch is the same as for 4.x and 5.x except vfs_timestamp() turns into getnanotime(). To test, run the patch on a 3.x NFS client. The NFS server can be any FreeBSD release. Create a file using this program: #include #include int main(int ac, char **av) { int fd; fd = open("test.dat", O_CREAT|O_TRUNC|O_EXCL|O_RDWR, 0644); printf("fd = %d\n", fd); exit(0); } And then 'ls -lua test.dat'. To repeat the test, remove test.dat and run the program again. Without the patch the file access time shown by ls should be garbage. With the patch it should be reasonable. Thanks, -Matt Index: nfs_vnops.c =================================================================== RCS file: /home/ncvs/src/sys/nfs/nfs_vnops.c,v retrieving revision 1.116.2.8 diff -u -r1.116.2.8 nfs_vnops.c --- nfs_vnops.c 1999/12/12 06:52:34 1.116.2.8 +++ nfs_vnops.c 2001/01/06 19:02:44 @@ -1407,8 +1407,21 @@ } if (newvp) vput(newvp); - } else if (v3 && (fmode & O_EXCL)) + } else if (v3 && (fmode & O_EXCL)) { + /* + * We are normally called with only a partially initialized + * VAP. Since the NFSv3 spec says that server may use the + * file attributes to store the verifier, the spec requires + * us to do a SETATTR RPC. FreeBSD servers store the verifier + * in atime, but we can't really assume that all servers will + * so we ensure that our SETATTR sets both atime and mtime. + */ + if (vap->va_mtime.tv_sec == VNOVAL) + getnanotime(&vap->va_mtime); + if (vap->va_atime.tv_sec == VNOVAL) + vap->va_atime = vap->va_mtime; error = nfs_setattrrpc(newvp, vap, cnp->cn_cred, cnp->cn_proc); + } if (!error) { if (cnp->cn_flags & MAKEENTRY) cache_enter(dvp, newvp, cnp); To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-stable" in the body of the message