Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Aug 1999 06:15:55 -0400 (EDT)
From:      Alfred Perlstein <bright@rush.net>
To:        hackers@freebsd.org
Subject:   more NFS questions, why is the VFS_FHTOVP weird?
Message-ID:  <Pine.BSF.3.96.990803055733.20420s-100000@cygnus.rush.net>

next in thread | raw e-mail | index | archive | help

If you look in src/nfs/nfs_serv.c in almost every call you'll see
this:

	nfsm_srvmtofh(fhp);
	nfsm_dissect(tl, u_int32_t *, NFSX_UNSIGNED);
	error = nfsrv_fhtovp(fhp, 1, &vp, cred, slp, nam, &rdonly,
	    (nfsd->nd_flag & ND_KERBAUTH), TRUE);
	if (error) {
		nfsm_reply(NFSX_UNSIGNED);
		nfsm_srvpostop_attr(1, (struct vattr *)0);
		error = 0;
		goto nfsmout;
	}

my interest is the third function called (nfsrv_fhtovp)

it is in "nfs_subs.c" around line 1953

the problem with nfsrv_fhtovp is that it is overkill for my application
(it checks perms where i don't need it to, so i would have to fake
a lot of stuff to look like i was authorized)

so instead I gutted nfsrv_fhtovp a bit and came up with this sequence:

	fhp = &nfh.fh_generic;
	error = copyin(u_fhp, fhp, fhlen);
	if (error)
		return(error);

	/* find the mount point */
	mp = vfs_getvfs(&fhp->fh_fsid);
	if (!mp)
		return (ESTALE);

	/* now give me my vnode, it gets returned to me locked */
	error = VFS_FHTOVP(mp, &fhp->fh_fid, nam, &vp, &exflags, &credanon);
	if (error)
		return (error);

the copying is from userspace, it's a NFS handle...

now here's where I get very confused...

in src/nfs/nfs_vfsops.c around line 1100:

/*
 * At this point, this should never happen
 */
/* ARGSUSED */
static int
nfs_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
	register struct mount *mp;
	struct fid *fhp;
	struct sockaddr *nam;
	struct vnode **vpp;
	int *exflagsp;
	struct ucred **credanonp;
{

	return (EINVAL);
}

ok, now if you look at the first piece of code it obviously
fails if nfsrv_fhtovp fails, and nfsrv_fhtovp fails if VFS_FHTOVP
fails...

so how does NFS work?  where is this magic function?

the macro VFS_FHTOVP is defined in mount.h:

#define VFS_FHTOVP(MP, FIDP, NAM, VPP, EXFLG, CRED) \
	(*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, NAM, VPP, EXFLG, CRED)

btw, since this seems to work... is it ok to pass in a NULL
sockaddr *? (nam)

thanks for all the help,
-Alfred Perlstein - [bright@rush.net|bright@wintelcom.net] 
systems administrator and programmer
    Wintelcom - http://www.wintelcom.net/



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.96.990803055733.20420s-100000>