From owner-freebsd-hackers Tue Aug 3 3:13:44 1999 Delivered-To: freebsd-hackers@freebsd.org Received: from cygnus.rush.net (cygnus.rush.net [209.45.245.133]) by hub.freebsd.org (Postfix) with ESMTP id BD0D214E03 for ; Tue, 3 Aug 1999 03:13:40 -0700 (PDT) (envelope-from bright@rush.net) Received: from localhost (bright@localhost) by cygnus.rush.net (8.9.3/8.9.3) with SMTP id GAA25757 for ; Tue, 3 Aug 1999 06:15:56 -0400 (EDT) Date: Tue, 3 Aug 1999 06:15:55 -0400 (EDT) From: Alfred Perlstein To: hackers@freebsd.org Subject: more NFS questions, why is the VFS_FHTOVP weird? Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG 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