Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Nov 2010 17:16:04 -0400 (EDT)
From:      Rick Macklem <rmacklem@uoguelph.ca>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        freebsd-fs@freebsd.org, freebsd-current@freebsd.org
Subject:   Re: processes stuck on a vnode lock
Message-ID:  <1090600565.181851.1288991764084.JavaMail.root@erie.cs.uoguelph.ca>
In-Reply-To: <4CD3B4A0.6060207@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
> on 04/11/2010 16:45 Andriy Gapon said the following:
> > on 04/11/2010 09:49 Andriy Gapon said the following:
> >>
> >> I see a few processes stuck on the same vnode, trying to take or to
> >> upgrade to
> >> an exclusive lock on it, while the lock data suggests that it is
> >> already
> >> shared-locked. The vnode is a root vnode of one of ZFS filesystems
> >> (it's not a
> >> global root).
> >>
> >> I couldn't find any (other) threads that could actually hold the
> >> vnode lock, but
> >> lock shared count is suspiciously or coincidentally the same as
> >> number of
> >> threads in zfs_root call.
> >
> > BTW, I still have the system alive and online, so if anyone has
> > ideas I can try them.
> >
> 
> The kernel is not live now, but I have saved it and vmcore of the
> system.
> 
> Kostik,
> 
> just a pure guesswork here - could r214049 have something to do with
> this?
> I looked at the change and it looks completely correct - I don't think
> that a
> vnode lock can be leaked by that code. But, OTOH, it has some special
> handling
> for VV_ROOT, it's in NFS code and and it's in a right time-frame, so
> just asking.
> 
You could try the attached patch which seems to have worked for Josh
Carroll, who had a similar problem with stable/8.

rick

[-- Attachment #2 --]
--- nfs_serv.c.sav	2010-11-05 08:15:57.000000000 -0400
+++ nfs_serv.c	2010-11-05 08:18:40.000000000 -0400
@@ -3252,7 +3252,7 @@
 			nfhp->fh_fsid = nvp->v_mount->mnt_stat.f_fsid;
 			if ((error1 = VOP_VPTOFH(nvp, &nfhp->fh_fid)) == 0)
 				error1 = VOP_GETATTR(nvp, vap, cred);
-			if (vp == nvp)
+			if (usevget == 0 && vp == nvp)
 				vunref(nvp);
 			else
 				vput(nvp);

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1090600565.181851.1288991764084.JavaMail.root>