if (vp->v_flag & VTEXT) uvm_vnp_uncache(vp);
nfsrv_remove(nfsd, slp, procp, mrq)	struct nfsrv_descript *nfsd;	struct nfssvc_sock *slp;	struct proc *procp;	struct mbuf **mrq;{	struct mbuf *mrep = nfsd->nd_mrep, *md = nfsd->nd_md;	struct mbuf *nam = nfsd->nd_nam;	caddr_t dpos = nfsd->nd_dpos;	struct ucred *cred = &nfsd->nd_cr;	struct nameidata nd;	register u_int32_t *tl;	register int32_t t1;	caddr_t bpos;	int error = 0, cache, len, dirfor_ret = 1, diraft_ret = 1;	int v3 = (nfsd->nd_flag & ND_NFSV3);	char *cp2;	struct mbuf *mb, *mreq;	struct vnode *vp, *dirp;	struct vattr dirfor, diraft;	nfsfh_t nfh;	fhandle_t *fhp;	u_quad_t frev;#ifndef nolint	vp = (struct vnode *)0;#endif	fhp = &nfh.fh_generic;	nfsm_srvmtofh(fhp);	nfsm_srvnamesiz(len);	nd.ni_cnd.cn_cred = cred;	nd.ni_cnd.cn_nameiop = DELETE;	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF;	error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,		&dirp, procp, (nfsd->nd_flag & ND_KERBAUTH));	if (dirp) {		if (v3)			dirfor_ret = VOP_GETATTR(dirp, &dirfor, cred,				procp);		else			vrele(dirp);	}	if (!error) {		vp = nd.ni_vp;		if (vp->v_type == VDIR &&		    (error = suser(cred, (u_short *)0)) != 0)			goto out;		/*		 * The root of a mounted filesystem cannot be deleted.		 */		if (vp->v_flag & VROOT) {			error = EBUSY;			goto out;		}out:		if (!error) {			error = VOP_REMOVE(nd.ni_dvp, nd.ni_vp, &nd.ni_cnd);		} else {			VOP_ABORTOP(nd.ni_dvp, &nd.ni_cnd);			if (nd.ni_dvp == vp)				vrele(nd.ni_dvp);			else				vput(nd.ni_dvp);			vput(vp);		}	}	if (dirp && v3) {		diraft_ret = VOP_GETATTR(dirp, &diraft, cred, procp);		vrele(dirp);	}	nfsm_reply(NFSX_WCCDATA(v3));	if (v3) {		nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);		return (0);	}	nfsm_srvdone;}