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

Reply via email to