nfsrv_fhtovp(fhp, lockflag, vpp, cred, slp, nam, rdonlyp)
nfsrv_fhtovp(fhp, lockflag, vpp, cred, slp, nam, rdonlyp, kerbflag)
nfsrv_fhtovp(fhp, lockflag, vpp, cred, slp, nam, rdonlyp)	fhandle_t *fhp;	int lockflag;	struct vnode **vpp;	struct ucred *cred;	struct nfssvc_sock *slp;	struct mbuf *nam;	int *rdonlyp;{	register struct mount *mp;	register struct nfsuid *uidp;	register int i;	struct ucred *credanon;	int error, exflags;	*vpp = (struct vnode *)0;	if ((mp = getvfs(&fhp->fh_fsid)) == NULL)		return (ESTALE);	error = VFS_FHTOVP(mp, &fhp->fh_fid, nam, vpp, &exflags, &credanon);	if (error)		return (error);	/*	 * Check/setup credentials.	 */	if (exflags & MNT_EXKERB) {		for (uidp = NUIDHASH(slp, cred->cr_uid)->lh_first; uidp != 0;		    uidp = uidp->nu_hash.le_next) {			if (uidp->nu_uid == cred->cr_uid)				break;		}		if (uidp == 0) {			vput(*vpp);			return (NQNFS_AUTHERR);		}		cred->cr_uid = uidp->nu_cr.cr_uid;		cred->cr_gid = uidp->nu_cr.cr_gid;		for (i = 0; i < uidp->nu_cr.cr_ngroups; i++)			cred->cr_groups[i] = uidp->nu_cr.cr_groups[i];		cred->cr_ngroups = i;	} else if (cred->cr_uid == 0 || (exflags & MNT_EXPORTANON)) {		cred->cr_uid = credanon->cr_uid;		cred->cr_gid = credanon->cr_gid;		for (i = 0; i < credanon->cr_ngroups && i < NGROUPS; i++)			cred->cr_groups[i] = credanon->cr_groups[i];		cred->cr_ngroups = i;	}	if (exflags & MNT_EXRDONLY)		*rdonlyp = 1;	else		*rdonlyp = 0;	if (!lockflag)		VOP_UNLOCK(*vpp);	return (0);}