Not panic in nfsd (Re: panic in nfsd on 6.2-RC1)

Sven Willenberger sven at dmv.com
Mon Dec 18 10:14:51 PST 2006


On Fri, 2006-12-15 at 23:20 +0200, Kostik Belousov wrote:
> On Fri, Dec 15, 2006 at 02:29:58PM -0500, Kris Kennaway wrote:

<<SNIP>>

> >  
> > > FWIW, I do see the following appearing in the /var/log/messages:
> > > ufs_rename: fvp == tvp (can't happen) 
> > > about once or twice a day, but cannot correlate those to lockup. Now
> > > that I have enabled the options mentioned above in the kernel, I am
> > > seeing some LOR issues:
> > > 
> > > kernel: lock order reversal:
> > > kernel: 1st 0xffffff00c3bab200 kqueue (kqueue) @ /usr/src/sys/kern/kern_event.c:1547
> > > kernel: 2nd 0xffffff0005bb6078 struct mount mtx (struct mount mtx) @ /usr/src/sys/ufs/ufs/ufs_vnops.c:138
> > 
> > OK, this is interesting, so let's proceed from here.
> > 
> > Kris
> 
> Try this.
> 
> Index: ufs/ufs/ufs_vnops.c
> ===================================================================
> RCS file: /usr/local/arch/ncvs/src/sys/ufs/ufs/ufs_vnops.c,v
> retrieving revision 1.283
> diff -u -r1.283 ufs_vnops.c
> --- ufs/ufs/ufs_vnops.c	6 Nov 2006 13:42:09 -0000	1.283
> +++ ufs/ufs/ufs_vnops.c	15 Dec 2006 21:19:51 -0000
> @@ -133,19 +133,15 @@
>  {
>  	struct inode *ip;
>  	struct timespec ts;
> -	int mnt_locked;
>  
>  	ip = VTOI(vp);
> -	mnt_locked = 0;
> -	if ((vp->v_mount->mnt_flag & MNT_RDONLY) != 0) {
> -		VI_LOCK(vp);
> +	VI_LOCK(vp);
> +	if ((vp->v_mount->mnt_flag & MNT_RDONLY) != 0)
>  		goto out;
> +	if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0) {
> +		VI_UNLOCK(vp);
> +		return;
>  	}
> -	MNT_ILOCK(vp->v_mount);		/* For reading of mnt_kern_flags. */
> -	mnt_locked = 1;
> -	VI_LOCK(vp);
> -	if ((ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) == 0)
> -		goto out_unl;
>  
>  	if ((vp->v_type == VBLK || vp->v_type == VCHR) && !DOINGSOFTDEP(vp))
>  		ip->i_flag |= IN_LAZYMOD;
> @@ -172,10 +168,7 @@
>  
>   out:
>  	ip->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE);
> - out_unl:
>  	VI_UNLOCK(vp);
> -	if (mnt_locked)
> -		MNT_IUNLOCK(vp->v_mount);
>  }
>  
>  /*


Patch applied cleanly (offset 6 lines), make buildworld, make kernel,
reboot, make installworld, etc.

kernel: lock order reversal:
kernel: 1st 0xffffff00b9181800 kqueue (kqueue) @ /usr/src/sys/kern/kern_event.c:1547
kernel: 2nd 0xffffff00c16030d0 vnode interlock (vnode interlock) @ /usr/src/sys/ufs/ufs/ufs_vnops.c:132





More information about the freebsd-stable mailing list