> On 12. Jan 2020, at 18:49, Andrew Doran <a...@netbsd.org> wrote:
> 
> Module Name:  src
> Committed By: ad
> Date:         Sun Jan 12 17:49:17 UTC 2020
> 
> Modified Files:
>       src/sys/kern: vfs_vnode.c
> 
> Log Message:
> vput(): don't drop the vnode lock, carry the hold over into vrelel() which
> might need it anyway.
> 
> 
> To generate a diff of this commit:
> cvs rdiff -u -r1.106 -r1.107 src/sys/kern/vfs_vnode.c
> 
> Please note that diffs are not public domain; they are subject to the
> copyright notices on the relevant files.
> 

 vput(vnode_t *vp)
 {
+       int lktype;

-       VOP_UNLOCK(vp);
-       vrele(vp);
+       if ((vp->v_vflag & VV_LOCKSWORK) == 0) {
+               lktype = LK_EXCLUSIVE;
+       } else {
+               lktype = VOP_ISLOCKED(vp);
+               KASSERT(lktype != LK_NONE);
+       }
+       mutex_enter(vp->v_interlock);
+       vrelel(vp, 0, lktype);
 }

This is quite wrong, from the manual:

     VOP_ISLOCKED(vp)
              Test if the vnode vp is locked.  Possible return values are
              LK_EXCLUSIVE, LK_SHARED or 0 for lock held exclusively by the
              calling thread, shared lock held by anyone or unlocked,
              respectively.

              This function must never be used to make locking decisions at
              run time: it is provided only for diagnostic purposes.

I suppose you cannot determine if the current thread holds
a shared lock.

--
J. Hannken-Illjes - hann...@eis.cs.tu-bs.de - TU Braunschweig

Attachment: signature.asc
Description: Message signed with OpenPGP

Reply via email to