vholdrele(vp);
simple_lock(&vp->v_interlock); #ifdef DIAGNOSTIC if (vp->v_holdcnt == 0) panic("brelvp: holdcnt"); #endif vp->v_holdcnt--;   if ((vp->v_bioflag & VBIOONFREELIST) && vp->v_holdcnt == 0 && vp->v_usecount == 0) { simple_lock(&vnode_free_list_slock); TAILQ_REMOVE(&vnode_hold_list, vp, v_freelist); TAILQ_INSERT_TAIL(&vnode_free_list, vp, v_freelist); simple_unlock(&vnode_free_list_slock); } simple_unlock(&vp->v_interlock);
brelvp(struct buf *bp){	struct vnode *vp;	if ((vp = bp->b_vp) == NULL)		panic("brelvp: NULL");	/*	 * Delete from old vnode list, if on one.	 */	if (bp->b_vnbufs.le_next != NOLIST)		bufremvn(bp);	if (TAILQ_EMPTY(&vp->v_uobj.memq) &&	    (vp->v_bioflag & VBIOONSYNCLIST) &&	    LIST_FIRST(&vp->v_dirtyblkhd) == NULL) {		vp->v_bioflag &= ~VBIOONSYNCLIST;		LIST_REMOVE(vp, v_synclist);	}	bp->b_vp = NULL;	vholdrele(vp);}