Subject: Re: kern/35542: NFS rename(?) panics (panic: lockmgr: release of unlocked lock!)
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Antti Kantee <pooka@cs.hut.fi>
List: netbsd-bugs
Date: 02/03/2007 15:20:02
The following reply was made to PR kern/35542; it has been noted by GNATS.

From: Antti Kantee <pooka@cs.hut.fi>
To: gnats-bugs@NetBSD.org, arto@selonen.org
Cc: netbsd-bugs@netbsd.org, chs@netbsd.org
Subject: Re: kern/35542: NFS rename(?) panics (panic: lockmgr: release of unlocked lock!)
Date: Sat, 3 Feb 2007 17:15:57 +0200

 On Fri Feb 02 2007 at 08:05:00 +0000, arto@selonen.org wrote:
 > At the moment, I don't have any network traces for possible client traffic, but I have a "db> reboot 0x104" crash dump of the latest panic, and the following function call trace (just to give an idea of what is going on):
 > 
 > panic: lockmgr: release of unlocked lock!
 > Stopped in pid 542.1 (nfsd) at netbsd:cpu_Debugger
 > db> tr
 > cpu_Debugger
 > panic
 > lockmgr
 > nfs_unlock
 > VOP_UNLOCK
 > ufs_inactive
 > VOP_INACTIVE
 > vput
 > nfsrv_rename
 > nfssvc_nfsd
 > sys_nfssvc
 > syscall_plain
 
 Hey Artsi,
 
 Seems the problem is caused when attempting to rename stuff without
 enough permissions.  What's happening under the hood is that nfs_namei()
 now releases the lock on the directory vnode in case of an error, so
 releasing it again in nfsrv_rename() causes the panic.
 
 The attached patch should fix it.  But I'd like Chuck (cc'd) to review
 it before it goes into the tree.
 
 Index: nfs_serv.c
 ===================================================================
 RCS file: /cvsroot/src/sys/nfs/nfs_serv.c,v
 retrieving revision 1.122
 diff -u -r1.122 nfs_serv.c
 --- nfs_serv.c	4 Jan 2007 20:24:08 -0000	1.122
 +++ nfs_serv.c	3 Feb 2007 15:14:20 -0000
 @@ -1897,8 +1897,6 @@
  		nfsm_reply(2 * NFSX_WCCDATA(v3));
  		nfsm_srvwcc_data(fdirfor_ret, &fdirfor, fdiraft_ret, &fdiraft);
  		nfsm_srvwcc_data(tdirfor_ret, &tdirfor, tdiraft_ret, &tdiraft);
 -		if (fdirp)
 -			vput(fdirp);
  		vn_finished_write(mp, 0);
  		return (0);
  	}
 
 -- 
 Antti Kantee <pooka@iki.fi>                     Of course he runs NetBSD
 http://www.iki.fi/pooka/                          http://www.NetBSD.org/
     "la qualité la plus indispensable du cuisinier est l'exactitude"