From owner-freebsd-stable@FreeBSD.ORG Thu Feb 1 16:55:32 2007 Return-Path: X-Original-To: freebsd-stable@freebsd.org Delivered-To: freebsd-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id E01EC16A400 for ; Thu, 1 Feb 2007 16:55:32 +0000 (UTC) (envelope-from ghelmer@palisadesys.com) Received: from magellan.palisadesys.com (magellan.palisadesys.com [192.188.162.211]) by mx1.freebsd.org (Postfix) with ESMTP id AD71313C442 for ; Thu, 1 Feb 2007 16:55:32 +0000 (UTC) (envelope-from ghelmer@palisadesys.com) Received: from [172.16.2.242] (cetus.palisadesys.com [192.188.162.7]) (authenticated bits=0) by magellan.palisadesys.com (8.13.8/8.13.8) with ESMTP id l11GtLsT039319 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 1 Feb 2007 10:55:22 -0600 (CST) (envelope-from ghelmer@palisadesys.com) Message-ID: <45C21B76.8090301@palisadesys.com> Date: Thu, 01 Feb 2007 10:55:18 -0600 From: Guy Helmer User-Agent: Thunderbird 1.5.0.9 (Windows/20061207) MIME-Version: 1.0 To: Kostik Belousov References: <45C0C749.1040300@palisadesys.com> <45C20F00.4010900@palisadesys.com> <20070201163826.GI56152@deviant.kiev.zoral.com.ua> <20070201164631.GJ56152@deviant.kiev.zoral.com.ua> In-Reply-To: <20070201164631.GJ56152@deviant.kiev.zoral.com.ua> X-Greylist: Sender succeeded SMTP AUTH authentication, not delayed by milter-greylist-3.0 (magellan.palisadesys.com [192.188.162.211]); Thu, 01 Feb 2007 10:55:22 -0600 (CST) X-Palisade-MailScanner-Information: Please contact the ISP for more information X-Palisade-MailScanner: Found to be clean X-Palisade-MailScanner-SpamCheck: not spam (whitelisted), SpamAssassin (not cached, score=-3.798, required 6, autolearn=not spam, ALL_TRUSTED -1.80, BAYES_00 -2.60, HTML_MESSAGE 0.00, J_CHICKENPOX_48 0.60) X-Palisade-MailScanner-From: ghelmer@palisadesys.com Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: freebsd-stable@freebsd.org Subject: Re: 6.2 amd64 panic: lockmgr: thread 0xffffff009f9fd000, not exclusive lock holder 0xffffff003961c000 unlocking X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 01 Feb 2007 16:55:33 -0000 Kostik Belousov wrote: > On Thu, Feb 01, 2007 at 06:38:26PM +0200, Kostik Belousov wrote: > >> On Thu, Feb 01, 2007 at 10:02:08AM -0600, Guy Helmer wrote: >> vn_lock with LK_EXCLUSIVE|LK_RETRY flags combination shall not fail. It should >> return even dead vnodes locked. >> >> I suspect that in fact this is race with exec(). Could you reproduce the >> panic ? And then, with this patch ? >> >> Index: fs/procfs/procfs.c >> =================================================================== >> RCS file: /usr/local/arch/ncvs/src/sys/fs/procfs/procfs.c,v >> retrieving revision 1.14 >> diff -u -r1.14 procfs.c >> --- fs/procfs/procfs.c 5 Jun 2006 16:41:27 -0000 1.14 >> +++ fs/procfs/procfs.c 1 Feb 2007 16:37:43 -0000 >> @@ -69,10 +69,12 @@ >> { >> char *fullpath = "unknown"; >> char *freepath = NULL; >> + struct vnode *textvp; >> >> - vn_lock(p->p_textvp, LK_EXCLUSIVE | LK_RETRY, td); >> - vn_fullpath(td, p->p_textvp, &fullpath, &freepath); >> - VOP_UNLOCK(p->p_textvp, 0, td); >> + textvp = p->p_textvp; >> + vn_lock(textvp, LK_EXCLUSIVE | LK_RETRY, td); >> + vn_fullpath(td, textvp, &fullpath, &freepath); >> + VOP_UNLOCK(textvp, 0, td); >> sbuf_printf(sb, "%s", fullpath); >> if (freepath) >> free(freepath, M_TEMP); >> > > That patch is incorrect as well: textvp may be reclaimed while waiting for > lock. Below is better version. > > Index: fs/procfs/procfs.c > =================================================================== > RCS file: /usr/local/arch/ncvs/src/sys/fs/procfs/procfs.c,v > retrieving revision 1.14 > diff -u -r1.14 procfs.c > --- fs/procfs/procfs.c 5 Jun 2006 16:41:27 -0000 1.14 > +++ fs/procfs/procfs.c 1 Feb 2007 16:44:41 -0000 > @@ -69,10 +69,17 @@ > { > char *fullpath = "unknown"; > char *freepath = NULL; > + struct vnode *textvp; > + int err; > > - vn_lock(p->p_textvp, LK_EXCLUSIVE | LK_RETRY, td); > - vn_fullpath(td, p->p_textvp, &fullpath, &freepath); > - VOP_UNLOCK(p->p_textvp, 0, td); > + textvp = p->p_textvp; > + VI_LOCK(textvp); > + vholdl(textvp); > + err = vn_lock(textvp, LK_EXCLUSIVE | LK_INTERLOCK, td); > + vdrop(textvp); > + if (err) > Shouldn't that be "if (!err)"? > + vn_fullpath(td, textvp, &fullpath, &freepath); > + VOP_UNLOCK(textvp, 0, td); > sbuf_printf(sb, "%s", fullpath); > if (freepath) > free(freepath, M_TEMP); > Thanks for your insight and patch! Guy