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