Skip site navigation (1)Skip section navigation (2)
Date:      03 Aug 1999 14:14:50 +0200
From:      Assar Westerlund <assar@sics.se>
To:        Alfred Perlstein <bright@rush.net>
Cc:        hackers@FreeBSD.ORG
Subject:   Re: more NFS questions, why is the VFS_FHTOVP weird?
Message-ID:  <5lwvvdysat.fsf@assaris.sics.se>
In-Reply-To: Alfred Perlstein's message of "Tue, 3 Aug 1999 06:15:55 -0400 (EDT)"
References:  <Pine.BSF.3.96.990803055733.20420s-100000@cygnus.rush.net>

next in thread | previous in thread | raw e-mail | index | archive | help
Alfred Perlstein <bright@rush.net> writes:
> 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)

What's your application?

> 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 NFS server is calling the FHTOVP function of the exported file
system.  You're looking at the FHTOVP function for the NFS file system
itself.  Look for example at ffs_fhtovp and ufs_check_export.

> 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)

I do think that checking for what file systems are exported has no
place in FHTOVP and this should probably be rewritten similar to the
way it has recently been done in NetBSD, namely with a new vfs
operation:

	int	(*vfs_checkexp) __P((struct mount *mp, struct mbuf *nam,
				    int *extflagsp, struct ucred **credanonp));

And they have also added fhopen and other syscalls that take file
handles instead of file names.

> btw, since this seems to work... is it ok to pass in a NULL
> sockaddr *? (nam)

I think that nam == NULL means the default export list which doesn't
sound as what you want do do?

/assar


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?5lwvvdysat.fsf>