+ register struct vnode *vp = (struct vnode *)fp->f_data;
+ int flags;
+
+ kind &= fp->f_flag;
+ if (vp == NULL || kind == 0)
+ return;
+ flags = vp->v_flag;
+ if (kind & FSHLOCK) {
+ if ((flags & VSHLOCK) == 0)
+ panic("vn_unlock: SHLOCK");
+ if (--vp->v_shlockc == 0) {
+ vp->v_flag &= ~VSHLOCK;
+ if (flags & VLWAIT)
+ wakeup((caddr_t)&vp->v_shlockc);
+ }
+ fp->f_flag &= ~FSHLOCK;
+ }
+ if (kind & FEXLOCK) {
+ if ((flags & VEXLOCK) == 0)
+ panic("vn_unlock: EXLOCK");
+ if (--vp->v_exlockc == 0) {
+ vp->v_flag &= ~(VEXLOCK|VLWAIT);
+ if (flags & VLWAIT)
+ wakeup((caddr_t)&vp->v_exlockc);
+ }
+ fp->f_flag &= ~FEXLOCK;
+ }