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>
