Subject: Re: nfsd: locking botch in op %d
To: der Mouse <mouse@Rodents.Montreal.QC.CA>
From: Bill Studenmund <wrstuden@zembu.com>
List: tech-kern
Date: 03/12/2001 11:10:35
On Mon, 12 Mar 2001, der Mouse wrote:

> >> It appears that the lock ufs_hashins() took on the vnode gets lost
> >> somewhere in the checkalias() shuffle.
> 
> > In the case of an aliased device node, ufs_vinit calls vput() on the
> > old vnode just before initializing the new one.  vput() means
> > unlock+deref.  This one doesn't seem to show up in your trace output,
> > but the lockmgr() call 2 lines below (still in ufs_vinit()) does.
> 
> This is because ufs_vinit, before it vput()s the old vnode, bashes the
> vnodeops field to specfs's vnodeops.  And specfs's unlock routine is
> genfs_nounlock, which doesn't actually do anything.  This means that
> the VOP_UNLOCK in vput() is a no-op.

Oops!

Could you try changing the genfs_no{,is,un}lock{,ed} calls into the
real-lock varieties and see what happens?

Take care,

Bill