VTONFS(dvp)->n_attrstamp = 0; vrele(dvp);
if (!attrflag) VTONFS(vp)->n_attrstamp = 0; if (!wccflag) VTONFS(dvp)->n_attrstamp = 0; vput(dvp);
nfs_link(v)	void *v;{	struct vop_link_args /* {		struct vnode *a_dvp;		struct vnode *a_vp;		struct componentname *a_cnp;	} */ *ap = v;	register struct vnode *dvp = ap->a_dvp;	register struct vnode *vp = ap->a_vp;	register struct componentname *cnp = ap->a_cnp;	register u_int32_t *tl;	register caddr_t cp;	register int32_t t2;	caddr_t bpos, dpos;	int error = 0;	struct mbuf *mreq, *mrep, *md, *mb, *mb2;	if (dvp->v_mount != vp->v_mount) {		/*VOP_ABORTOP(dvp, cnp);*/		if (vp == dvp)			vrele(dvp);		else			vput(dvp);		return (EXDEV);	}	/*	 * Push all writes to the server, so that the attribute cache	 * doesn't get "out of sync" with the server.	 * XXX There should be a better way!	 */	VOP_FSYNC(vp, cnp->cn_cred, MNT_WAIT, cnp->cn_proc);	nfsstats.rpccnt[NFSPROC_LINK]++;	nfsm_reqhead(vp, NFSPROC_LINK,		NFSX_FH*2+NFSX_UNSIGNED+nfsm_rndup(cnp->cn_namelen));	nfsm_fhtom(vp);	nfsm_fhtom(dvp);	nfsm_strtom(cnp->cn_nameptr, cnp->cn_namelen, NFS_MAXNAMLEN);	nfsm_request(vp, NFSPROC_LINK, cnp->cn_proc, cnp->cn_cred);	nfsm_reqdone;	FREE(cnp->cn_pnbuf, M_NAMEI);	VTONFS(vp)->n_attrstamp = 0;	VTONFS(dvp)->n_flag |= NMODIFIED;	VTONFS(dvp)->n_attrstamp = 0;	vrele(dvp);	/*	 * Kludge: Map EEXIST => 0 assuming that it is a reply to a retry.	 */	if (error == EEXIST)		error = 0;	return (error);}