Subject: PR/33861 CVS commit: src/sys/nfs
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: YAMAMOTO Takashi <yamt@netbsd.org>
List: netbsd-bugs
Date: 07/01/2006 11:30:02
The following reply was made to PR kern/33861; it has been noted by GNATS.

From: YAMAMOTO Takashi <yamt@netbsd.org>
To: gnats-bugs@NetBSD.org
Cc: 
Subject: PR/33861 CVS commit: src/sys/nfs
Date: Sat,  1 Jul 2006 11:29:42 +0000 (UTC)

 Module Name:	src
 Committed By:	yamt
 Date:		Sat Jul  1 11:29:42 UTC 2006
 
 Modified Files:
 	src/sys/nfs: nfs_var.h nfs_vnops.c
 
 Log Message:
 if a file is sillyrename'ed because it's a destination of rename,
 make sillyrename (try to) use LINK operation rather than RENAME.
 PR/33861 from Jed Davis.  he provided the almost same patch.
 according to him, it also happen to be what opensolaris does in this case.
 
 from the PR:
 > In nfs_rename(), if the destination appears to exist and is "in use"
 > (this check is apparently satisfied even if the file isn't in use by
 > anything except the rename itself), it will sillyrename it, then delete
 > the sillyrenamed file even if the rename fails -- for instance, because
 > the "from" file no longer exists on the server.
 
 > mkdir a b; touch a/x; perl -e 'fork(); rename("a/x","b/x") or die "$!\n"'
 >
 > Afterwards, neither a/x nor b/x will exist.
 
 > 1) Lookup of b/x; fails with NOENT.
 > 2) Rename from a/x to b/x; succeeds.
 > 3) Lookup of b/x; fails with NOENT.
 > 4) Rename from b/x to b/.nfsA23a3; succeeds.
 > 5) Rename from a/x to b/x; fails with NOENT.
 > 6) Remove of b/.nfsA23a3; succeeds.
 
 
 To generate a diff of this commit:
 cvs rdiff -r1.61 -r1.62 src/sys/nfs/nfs_var.h
 cvs rdiff -r1.238 -r1.239 src/sys/nfs/nfs_vnops.c
 
 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.