From owner-freebsd-bugs Sat Mar 22 23:56:21 1997 Return-Path: Received: (from root@localhost) by freefall.freebsd.org (8.8.5/8.8.5) id XAA28607 for bugs-outgoing; Sat, 22 Mar 1997 23:56:21 -0800 (PST) Received: from godzilla.zeta.org.au (godzilla.zeta.org.au [203.2.228.19]) by freefall.freebsd.org (8.8.5/8.8.5) with ESMTP id XAA28601 for ; Sat, 22 Mar 1997 23:56:17 -0800 (PST) Received: (from bde@localhost) by godzilla.zeta.org.au (8.8.3/8.6.9) id SAA29091; Sun, 23 Mar 1997 18:53:16 +1100 Date: Sun, 23 Mar 1997 18:53:16 +1100 From: Bruce Evans Message-Id: <199703230753.SAA29091@godzilla.zeta.org.au> To: freebsd-bugs@freefall.freebsd.org, peter@spinner.DIALix.COM Subject: Re: kern/3064: nfs server link() handler panics with non-recursive lock reentry Sender: owner-bugs@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk > > >Fix: > > > > Not known.. I don't understand vnode locking under lite2 well enough. > > It seems the panic is happening within VOP_LINK(), so nfsrv_link() doesn't > appear to be setting up the locking properly when the target file exists. It seems to be a simple merge error. You understand merges? :-) The args are reversed, and exclusive locking of the directory arg is normal. I'm still confused about the ordering. nfssrv_link() uses non-Lite2 order for NetBSD and FreeBSD; nfs_link() uses non-Lite2 order for NetBSD. One of the NetBSD cases is probably wrong. CSRG reversed the order in Lite2. I thought that we reversed it too. VOP_LINK.9 seems to agree with our actual order (tdvp first). Bruce diff -c2 nfs_serv.c~ nfs_serv.c *** nfs_serv.c~ Mon Feb 24 00:40:43 1997 --- nfs_serv.c Sun Mar 23 18:32:53 1997 *************** *** 2028,2032 **** nqsrv_getl(vp, ND_WRITE); nqsrv_getl(xp, ND_WRITE); ! error = VOP_LINK(vp, nd.ni_dvp, &nd.ni_cnd); } else { VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd); --- 2026,2034 ---- nqsrv_getl(vp, ND_WRITE); nqsrv_getl(xp, ND_WRITE); ! #if defined(__NetBSD__) || defined(__FreeBSD__) ! error = VOP_LINK(nd.ni_dvp, vp, &nd.ni_cnd); ! #else ! error = VOP_LINK(vp, nd.ni_dvp, &nd.ni_cnd); ! #endif } else { VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);