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 - [[EMAIL PROTECTED]|[EMAIL PROTECTED]]
systems administrator and programmer
Wintelcom - http://www.wintelcom.net/
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message