summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>1999-09-11 00:46:08 +0000
committeralfred <alfred@FreeBSD.org>1999-09-11 00:46:08 +0000
commitb9136a6115cbac97ab114f16b1aacf4eb20ad2c1 (patch)
tree783daf81f8570ef14570d4a5a6fc45f15ec1cbf5
parenta9f7b5ee698afe56d1167bfa395f23b1fff1730c (diff)
downloadFreeBSD-src-b9136a6115cbac97ab114f16b1aacf4eb20ad2c1.zip
FreeBSD-src-b9136a6115cbac97ab114f16b1aacf4eb20ad2c1.tar.gz
Seperate the export check in VFS_FHTOVP, exports are now checked via
VFS_CHECKEXP. Add fh(open|stat|stafs) syscalls to allow userland to query filesystems based on (network) filehandle. Obtained from: NetBSD
-rw-r--r--sys/coda/coda_vfsops.c1
-rw-r--r--sys/fs/cd9660/cd9660_vfsops.c42
-rw-r--r--sys/fs/coda/coda_vfsops.c1
-rw-r--r--sys/fs/fdescfs/fdesc_vfsops.c1
-rw-r--r--sys/fs/msdosfs/msdosfs_vfsops.c31
-rw-r--r--sys/fs/ntfs/ntfs_vfsops.c8
-rw-r--r--sys/fs/nullfs/null_vfsops.c26
-rw-r--r--sys/fs/portalfs/portal_vfsops.c1
-rw-r--r--sys/fs/procfs/procfs_vfsops.c1
-rw-r--r--sys/fs/umapfs/umap_vfsops.c23
-rw-r--r--sys/fs/unionfs/union_vfsops.c3
-rw-r--r--sys/gnu/ext2fs/ext2_vfsops.c12
-rw-r--r--sys/gnu/fs/ext2fs/ext2_vfsops.c12
-rw-r--r--sys/isofs/cd9660/cd9660_vfsops.c42
-rw-r--r--sys/kern/init_sysent.c7
-rw-r--r--sys/kern/syscalls.c7
-rw-r--r--sys/kern/syscalls.master7
-rw-r--r--sys/kern/vfs_default.c13
-rw-r--r--sys/kern/vfs_extattr.c293
-rw-r--r--sys/kern/vfs_syscalls.c293
-rw-r--r--sys/miscfs/devfs/devfs_vfsops.c1
-rw-r--r--sys/miscfs/fdesc/fdesc_vfsops.c1
-rw-r--r--sys/miscfs/kernfs/kernfs_vfsops.c1
-rw-r--r--sys/miscfs/nullfs/null_vfsops.c26
-rw-r--r--sys/miscfs/portal/portal_vfsops.c1
-rw-r--r--sys/miscfs/procfs/procfs_vfsops.c1
-rw-r--r--sys/miscfs/umapfs/umap_vfsops.c23
-rw-r--r--sys/miscfs/union/union_vfsops.c3
-rw-r--r--sys/msdosfs/msdosfs_vfsops.c31
-rw-r--r--sys/nfs/nfs_common.c5
-rw-r--r--sys/nfs/nfs_subs.c5
-rw-r--r--sys/nfs/nfs_syscalls.c41
-rw-r--r--sys/nfs/nfs_vfsops.c1
-rw-r--r--sys/nfsclient/nfs_nfsiod.c41
-rw-r--r--sys/nfsclient/nfs_subs.c5
-rw-r--r--sys/nfsclient/nfs_vfsops.c1
-rw-r--r--sys/nfsserver/nfs_srvsubs.c5
-rw-r--r--sys/nfsserver/nfs_syscalls.c41
-rw-r--r--sys/ntfs/ntfs_vfsops.c8
-rw-r--r--sys/sys/mount.h26
-rw-r--r--sys/sys/syscall-hide.h4
-rw-r--r--sys/sys/syscall.h4
-rw-r--r--sys/sys/syscall.mk4
-rw-r--r--sys/sys/sysproto.h16
-rw-r--r--sys/ufs/ffs/ffs_extern.h5
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c8
-rw-r--r--sys/ufs/mfs/mfs_vfsops.c1
-rw-r--r--sys/ufs/ufs/ufs_extern.h6
-rw-r--r--sys/ufs/ufs/ufs_vfsops.c45
49 files changed, 910 insertions, 274 deletions
diff --git a/sys/coda/coda_vfsops.c b/sys/coda/coda_vfsops.c
index 489ce06..22808ed 100644
--- a/sys/coda/coda_vfsops.c
+++ b/sys/coda/coda_vfsops.c
@@ -530,6 +530,7 @@ struct vfsops coda_vfsops = {
coda_sync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
vfs_stdinit
};
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c
index f81cb14..050e99e 100644
--- a/sys/fs/cd9660/cd9660_vfsops.c
+++ b/sys/fs/cd9660/cd9660_vfsops.c
@@ -68,8 +68,9 @@ static int cd9660_unmount __P((struct mount *, int, struct proc *));
static int cd9660_root __P((struct mount *, struct vnode **));
static int cd9660_statfs __P((struct mount *, struct statfs *, struct proc *));
static int cd9660_vget __P((struct mount *, ino_t, struct vnode **));
-static int cd9660_fhtovp __P((struct mount *, struct fid *, struct sockaddr *,
- struct vnode **, int *, struct ucred **));
+static int cd9660_fhtovp __P((struct mount *, struct fid *, struct vnode **));
+static int cd9660_checkexp __P((struct mount *, struct sockaddr *,
+ int *, struct ucred **));
static int cd9660_vptofh __P((struct vnode *, struct fid *));
static struct vfsops cd9660_vfsops = {
@@ -82,6 +83,7 @@ static struct vfsops cd9660_vfsops = {
vfs_stdsync,
cd9660_vget,
cd9660_fhtovp,
+ cd9660_checkexp,
cd9660_vptofh,
cd9660_init,
};
@@ -620,18 +622,13 @@ struct ifid {
/* ARGSUSED */
int
-cd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
+cd9660_fhtovp(mp, fhp, vpp)
register struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
struct ifid *ifhp = (struct ifid *)fhp;
register struct iso_node *ip;
- register struct netcred *np;
- register struct iso_mnt *imp = VFSTOISOFS(mp);
struct vnode *nvp;
int error;
@@ -640,13 +637,6 @@ cd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
ifhp->ifid_ino, ifhp->ifid_start);
#endif
- /*
- * Get the export permission structure for this <mp, client> tuple.
- */
- np = vfs_export_lookup(mp, &imp->im_export, nam);
- if (np == NULL)
- return (EACCES);
-
if ((error = VFS_VGET(mp, ifhp->ifid_ino, &nvp)) != 0) {
*vpp = NULLVP;
return (error);
@@ -658,6 +648,28 @@ cd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
return (ESTALE);
}
*vpp = nvp;
+ return (0);
+}
+
+int
+cd9660_checkexp(mp, nam, exflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
+ int *exflagsp;
+ struct ucred **credanonp;
+{
+ register struct netcred *np;
+ register struct iso_mnt *imp;
+
+ imp = VFSTOISOFS(mp);
+
+ /*
+ * Get the export permission structure for this <mp, client> tuple.
+ */
+ np = vfs_export_lookup(mp, &imp->im_export, nam);
+ if (np == NULL)
+ return (EACCES);
+
*exflagsp = np->netc_exflags;
*credanonp = &np->netc_anon;
return (0);
diff --git a/sys/fs/coda/coda_vfsops.c b/sys/fs/coda/coda_vfsops.c
index 489ce06..22808ed 100644
--- a/sys/fs/coda/coda_vfsops.c
+++ b/sys/fs/coda/coda_vfsops.c
@@ -530,6 +530,7 @@ struct vfsops coda_vfsops = {
coda_sync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
vfs_stdinit
};
diff --git a/sys/fs/fdescfs/fdesc_vfsops.c b/sys/fs/fdescfs/fdesc_vfsops.c
index 97231a4..a451c18 100644
--- a/sys/fs/fdescfs/fdesc_vfsops.c
+++ b/sys/fs/fdescfs/fdesc_vfsops.c
@@ -224,6 +224,7 @@ static struct vfsops fdesc_vfsops = {
vfs_stdsync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
fdesc_init,
};
diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c
index e8695b8..625690d 100644
--- a/sys/fs/msdosfs/msdosfs_vfsops.c
+++ b/sys/fs/msdosfs/msdosfs_vfsops.c
@@ -75,8 +75,9 @@ static int update_mp __P((struct mount *mp, struct msdosfs_args *argp));
static int mountmsdosfs __P((struct vnode *devvp, struct mount *mp,
struct proc *p, struct msdosfs_args *argp));
static int msdosfs_fhtovp __P((struct mount *, struct fid *,
- struct sockaddr *, struct vnode **, int *,
- struct ucred **));
+ struct vnode **));
+static int msdosfs_checkexp __P((struct mount *, struct sockaddr *,
+ int *, struct ucred **));
static int msdosfs_mount __P((struct mount *, char *, caddr_t,
struct nameidata *, struct proc *));
static int msdosfs_root __P((struct mount *, struct vnode **));
@@ -915,29 +916,38 @@ loop:
}
static int
-msdosfs_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
+msdosfs_fhtovp(mp, fhp, vpp)
struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
struct msdosfsmount *pmp = VFSTOMSDOSFS(mp);
struct defid *defhp = (struct defid *) fhp;
struct denode *dep;
- struct netcred *np;
int error;
- np = vfs_export_lookup(mp, &pmp->pm_export, nam);
- if (np == NULL)
- return (EACCES);
error = deget(pmp, defhp->defid_dirclust, defhp->defid_dirofs, &dep);
if (error) {
*vpp = NULLVP;
return (error);
}
*vpp = DETOV(dep);
+ return (0);
+}
+
+static int
+msdosfs_checkexp(mp, nam, exflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
+ int *exflagsp;
+ struct ucred **credanonp;
+{
+ struct msdosfsmount *pmp = VFSTOMSDOSFS(mp);
+ struct netcred *np;
+
+ np = vfs_export_lookup(mp, &pmp->pm_export, nam);
+ if (np == NULL)
+ return (EACCES);
*exflagsp = np->netc_exflags;
*credanonp = &np->netc_anon;
return (0);
@@ -970,6 +980,7 @@ static struct vfsops msdosfs_vfsops = {
msdosfs_sync,
vfs_stdvget,
msdosfs_fhtovp,
+ msdosfs_checkexp,
msdosfs_vptofh,
msdosfs_init
};
diff --git a/sys/fs/ntfs/ntfs_vfsops.c b/sys/fs/ntfs/ntfs_vfsops.c
index 4106fc3..a77647e 100644
--- a/sys/fs/ntfs/ntfs_vfsops.c
+++ b/sys/fs/ntfs/ntfs_vfsops.c
@@ -93,9 +93,10 @@ static int ntfs_vptofh __P((struct vnode *, struct fid *));
static int ntfs_init __P((struct vfsconf *));
#if 0 /* may be implemented at a later date */
static int ntfs_fhtovp __P((struct mount *, struct fid *,
- struct sockaddr *, struct vnode **,
- int *, struct ucred **));
-#endif
+ struct vnode **));
+static int ntfs_checkexp __P((struct vnode *, struct mbuf *,
+ int *, struct ucred **));
+#endif /* 0, default ops in FreeBSD */
#elif defined(__NetBSD__)
static void ntfs_init __P((void));
static int ntfs_fhtovp __P((struct mount *, struct fid *,
@@ -952,6 +953,7 @@ static struct vfsops ntfs_vfsops = {
vfs_stdsync,
ntfs_vget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
ntfs_init,
NULL
diff --git a/sys/fs/nullfs/null_vfsops.c b/sys/fs/nullfs/null_vfsops.c
index 730eb80..06e1be0 100644
--- a/sys/fs/nullfs/null_vfsops.c
+++ b/sys/fs/nullfs/null_vfsops.c
@@ -57,8 +57,9 @@
static MALLOC_DEFINE(M_NULLFSMNT, "NULLFS mount", "NULLFS mount structure");
static int nullfs_fhtovp __P((struct mount *mp, struct fid *fidp,
- struct sockaddr *nam, struct vnode **vpp,
- int *exflagsp, struct ucred **credanonp));
+ struct vnode **vpp));
+static int nullfs_checkexp __P((struct mount *mp, struct sockaddr *nam,
+ int *extflagsp, struct ucred **credanonp));
static int nullfs_mount __P((struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct proc *p));
static int nullfs_quotactl __P((struct mount *mp, int cmd, uid_t uid,
@@ -385,17 +386,25 @@ nullfs_vget(mp, ino, vpp)
}
static int
-nullfs_fhtovp(mp, fidp, nam, vpp, exflagsp, credanonp)
+nullfs_fhtovp(mp, fidp, vpp)
struct mount *mp;
struct fid *fidp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred**credanonp;
{
- return VFS_FHTOVP(MOUNTTONULLMOUNT(mp)->nullm_vfs, fidp, nam,
- vpp, exflagsp, credanonp);
+ return VFS_FHTOVP(MOUNTTONULLMOUNT(mp)->nullm_vfs, fidp, vpp);
+}
+
+static int
+nullfs_checkexp(mp, nam, extflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
+ int *extflagsp;
+ struct ucred **credanonp;
+{
+
+ return VFS_CHECKEXP(MOUNTTONULLMOUNT(mp)->nullm_vfs, nam,
+ extflagsp, credanonp);
}
static int
@@ -416,6 +425,7 @@ static struct vfsops null_vfsops = {
nullfs_sync,
nullfs_vget,
nullfs_fhtovp,
+ nullfs_checkexp,
nullfs_vptofh,
nullfs_init,
};
diff --git a/sys/fs/portalfs/portal_vfsops.c b/sys/fs/portalfs/portal_vfsops.c
index bdb172b..d750b53 100644
--- a/sys/fs/portalfs/portal_vfsops.c
+++ b/sys/fs/portalfs/portal_vfsops.c
@@ -253,6 +253,7 @@ static struct vfsops portal_vfsops = {
vfs_stdsync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
vfs_stdinit,
};
diff --git a/sys/fs/procfs/procfs_vfsops.c b/sys/fs/procfs/procfs_vfsops.c
index 92245b8..9f51a3c 100644
--- a/sys/fs/procfs/procfs_vfsops.c
+++ b/sys/fs/procfs/procfs_vfsops.c
@@ -170,6 +170,7 @@ static struct vfsops procfs_vfsops = {
vfs_stdsync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
vfs_stdinit,
};
diff --git a/sys/fs/umapfs/umap_vfsops.c b/sys/fs/umapfs/umap_vfsops.c
index 005862a..afa44f0 100644
--- a/sys/fs/umapfs/umap_vfsops.c
+++ b/sys/fs/umapfs/umap_vfsops.c
@@ -56,8 +56,9 @@
static MALLOC_DEFINE(M_UMAPFSMNT, "UMAP mount", "UMAP mount structure");
static int umapfs_fhtovp __P((struct mount *mp, struct fid *fidp,
- struct sockaddr *nam, struct vnode **vpp,
- int *exflagsp, struct ucred **credanonp));
+ struct vnode **vpp));
+static int umapfs_checkexp __P((struct mount *mp, struct sockaddr *nam,
+ int *extflagsp, struct ucred **credanonp));
static int umapfs_mount __P((struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct proc *p));
static int umapfs_quotactl __P((struct mount *mp, int cmd, uid_t uid,
@@ -398,16 +399,25 @@ umapfs_vget(mp, ino, vpp)
}
static int
-umapfs_fhtovp(mp, fidp, nam, vpp, exflagsp, credanonp)
+umapfs_fhtovp(mp, fidp, vpp)
struct mount *mp;
struct fid *fidp;
- struct sockaddr *nam;
struct vnode **vpp;
+{
+
+ return (VFS_FHTOVP(MOUNTTOUMAPMOUNT(mp)->umapm_vfs, fidp, vpp));
+}
+
+static int
+umapfs_checkexp(mp, nam, exflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
int *exflagsp;
- struct ucred**credanonp;
+ struct ucred **credanonp;
{
- return (VFS_FHTOVP(MOUNTTOUMAPMOUNT(mp)->umapm_vfs, fidp, nam, vpp, exflagsp,credanonp));
+ return (VFS_CHECKEXP(MOUNTTOUMAPMOUNT(mp)->umapm_vfs, nam,
+ exflagsp, credanonp));
}
static int
@@ -428,6 +438,7 @@ static struct vfsops umap_vfsops = {
umapfs_sync,
umapfs_vget,
umapfs_fhtovp,
+ umapfs_checkexp,
umapfs_vptofh,
umapfs_init,
};
diff --git a/sys/fs/unionfs/union_vfsops.c b/sys/fs/unionfs/union_vfsops.c
index def8416..af828ac 100644
--- a/sys/fs/unionfs/union_vfsops.c
+++ b/sys/fs/unionfs/union_vfsops.c
@@ -496,7 +496,7 @@ union_statfs(mp, sbp, p)
static struct vfsops union_vfsops = {
union_mount,
- vfs_stdstart,
+ vfs_stdstart, /* underlying start already done */
union_unmount,
union_root,
vfs_stdquotactl,
@@ -504,6 +504,7 @@ static struct vfsops union_vfsops = {
vfs_stdsync, /* XXX assumes no cached data on union level */
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
union_init,
};
diff --git a/sys/gnu/ext2fs/ext2_vfsops.c b/sys/gnu/ext2fs/ext2_vfsops.c
index 1bf97d5..7da44f9 100644
--- a/sys/gnu/ext2fs/ext2_vfsops.c
+++ b/sys/gnu/ext2fs/ext2_vfsops.c
@@ -37,6 +37,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_vfsops.c 8.8 (Berkeley) 4/18/94
+ * $FreeBSD$
*/
#include "opt_quota.h"
@@ -65,8 +66,7 @@
#include <gnu/ext2fs/ext2_fs.h>
#include <gnu/ext2fs/ext2_fs_sb.h>
-static int ext2_fhtovp __P((struct mount *, struct fid *, struct sockaddr *,
- struct vnode **, int *, struct ucred **));
+static int ext2_fhtovp __P((struct mount *, struct fid *, struct vnode **));
static int ext2_flushfiles __P((struct mount *mp, int flags, struct proc *p));
static int ext2_mount __P((struct mount *,
char *, caddr_t, struct nameidata *, struct proc *));
@@ -92,6 +92,7 @@ static struct vfsops ext2fs_vfsops = {
ext2_sync,
ext2_vget,
ext2_fhtovp,
+ ufs_check_export,
ext2_vptofh,
ext2_init,
};
@@ -1113,13 +1114,10 @@ printf("ext2_vget(%d) dbn= %d ", ino, fsbtodb(fs, ino_to_fsba(fs, ino)));
* those rights via. exflagsp and credanonp
*/
static int
-ext2_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
+ext2_fhtovp(mp, fhp, vpp)
register struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
register struct ufid *ufhp;
struct ext2_sb_info *fs;
@@ -1129,7 +1127,7 @@ ext2_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
if (ufhp->ufid_ino < ROOTINO ||
ufhp->ufid_ino >= fs->s_groups_count * fs->s_es->s_inodes_per_group)
return (ESTALE);
- return (ufs_check_export(mp, ufhp, nam, vpp, exflagsp, credanonp));
+ return (ufs_fhtovp(mp, ufhp, vpp));
}
/*
diff --git a/sys/gnu/fs/ext2fs/ext2_vfsops.c b/sys/gnu/fs/ext2fs/ext2_vfsops.c
index 1bf97d5..7da44f9 100644
--- a/sys/gnu/fs/ext2fs/ext2_vfsops.c
+++ b/sys/gnu/fs/ext2fs/ext2_vfsops.c
@@ -37,6 +37,7 @@
* SUCH DAMAGE.
*
* @(#)ffs_vfsops.c 8.8 (Berkeley) 4/18/94
+ * $FreeBSD$
*/
#include "opt_quota.h"
@@ -65,8 +66,7 @@
#include <gnu/ext2fs/ext2_fs.h>
#include <gnu/ext2fs/ext2_fs_sb.h>
-static int ext2_fhtovp __P((struct mount *, struct fid *, struct sockaddr *,
- struct vnode **, int *, struct ucred **));
+static int ext2_fhtovp __P((struct mount *, struct fid *, struct vnode **));
static int ext2_flushfiles __P((struct mount *mp, int flags, struct proc *p));
static int ext2_mount __P((struct mount *,
char *, caddr_t, struct nameidata *, struct proc *));
@@ -92,6 +92,7 @@ static struct vfsops ext2fs_vfsops = {
ext2_sync,
ext2_vget,
ext2_fhtovp,
+ ufs_check_export,
ext2_vptofh,
ext2_init,
};
@@ -1113,13 +1114,10 @@ printf("ext2_vget(%d) dbn= %d ", ino, fsbtodb(fs, ino_to_fsba(fs, ino)));
* those rights via. exflagsp and credanonp
*/
static int
-ext2_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
+ext2_fhtovp(mp, fhp, vpp)
register struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
register struct ufid *ufhp;
struct ext2_sb_info *fs;
@@ -1129,7 +1127,7 @@ ext2_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
if (ufhp->ufid_ino < ROOTINO ||
ufhp->ufid_ino >= fs->s_groups_count * fs->s_es->s_inodes_per_group)
return (ESTALE);
- return (ufs_check_export(mp, ufhp, nam, vpp, exflagsp, credanonp));
+ return (ufs_fhtovp(mp, ufhp, vpp));
}
/*
diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c
index f81cb14..050e99e 100644
--- a/sys/isofs/cd9660/cd9660_vfsops.c
+++ b/sys/isofs/cd9660/cd9660_vfsops.c
@@ -68,8 +68,9 @@ static int cd9660_unmount __P((struct mount *, int, struct proc *));
static int cd9660_root __P((struct mount *, struct vnode **));
static int cd9660_statfs __P((struct mount *, struct statfs *, struct proc *));
static int cd9660_vget __P((struct mount *, ino_t, struct vnode **));
-static int cd9660_fhtovp __P((struct mount *, struct fid *, struct sockaddr *,
- struct vnode **, int *, struct ucred **));
+static int cd9660_fhtovp __P((struct mount *, struct fid *, struct vnode **));
+static int cd9660_checkexp __P((struct mount *, struct sockaddr *,
+ int *, struct ucred **));
static int cd9660_vptofh __P((struct vnode *, struct fid *));
static struct vfsops cd9660_vfsops = {
@@ -82,6 +83,7 @@ static struct vfsops cd9660_vfsops = {
vfs_stdsync,
cd9660_vget,
cd9660_fhtovp,
+ cd9660_checkexp,
cd9660_vptofh,
cd9660_init,
};
@@ -620,18 +622,13 @@ struct ifid {
/* ARGSUSED */
int
-cd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
+cd9660_fhtovp(mp, fhp, vpp)
register struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
struct ifid *ifhp = (struct ifid *)fhp;
register struct iso_node *ip;
- register struct netcred *np;
- register struct iso_mnt *imp = VFSTOISOFS(mp);
struct vnode *nvp;
int error;
@@ -640,13 +637,6 @@ cd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
ifhp->ifid_ino, ifhp->ifid_start);
#endif
- /*
- * Get the export permission structure for this <mp, client> tuple.
- */
- np = vfs_export_lookup(mp, &imp->im_export, nam);
- if (np == NULL)
- return (EACCES);
-
if ((error = VFS_VGET(mp, ifhp->ifid_ino, &nvp)) != 0) {
*vpp = NULLVP;
return (error);
@@ -658,6 +648,28 @@ cd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
return (ESTALE);
}
*vpp = nvp;
+ return (0);
+}
+
+int
+cd9660_checkexp(mp, nam, exflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
+ int *exflagsp;
+ struct ucred **credanonp;
+{
+ register struct netcred *np;
+ register struct iso_mnt *imp;
+
+ imp = VFSTOISOFS(mp);
+
+ /*
+ * Get the export permission structure for this <mp, client> tuple.
+ */
+ np = vfs_export_lookup(mp, &imp->im_export, nam);
+ if (np == NULL)
+ return (EACCES);
+
*exflagsp = np->netc_exflags;
*credanonp = &np->netc_anon;
return (0);
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c
index e37f1f0..592cd14 100644
--- a/sys/kern/init_sysent.c
+++ b/sys/kern/init_sysent.c
@@ -2,6 +2,7 @@
* System call switch table.
*
* DO NOT EDIT-- this file is automatically generated.
+ * $FreeBSD$
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.63 1999/08/28 00:46:19 peter Exp
*/
@@ -316,9 +317,9 @@ struct sysent sysent[] = {
{ 0, (sy_call_t *)nosys }, /* 294 = nosys */
{ 0, (sy_call_t *)nosys }, /* 295 = nosys */
{ 0, (sy_call_t *)nosys }, /* 296 = nosys */
- { 0, (sy_call_t *)nosys }, /* 297 = nosys */
- { 0, (sy_call_t *)nosys }, /* 298 = nosys */
- { 0, (sy_call_t *)nosys }, /* 299 = nosys */
+ { 2, (sy_call_t *)fhstatfs }, /* 297 = fhstatfs */
+ { 2, (sy_call_t *)fhopen }, /* 298 = fhopen */
+ { 2, (sy_call_t *)fhstat }, /* 299 = fhstat */
{ 1, (sy_call_t *)modnext }, /* 300 = modnext */
{ 2, (sy_call_t *)modstat }, /* 301 = modstat */
{ 1, (sy_call_t *)modfnext }, /* 302 = modfnext */
diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c
index 3a1cd36..8f99132 100644
--- a/sys/kern/syscalls.c
+++ b/sys/kern/syscalls.c
@@ -2,6 +2,7 @@
* System call names.
*
* DO NOT EDIT-- this file is automatically generated.
+ * $FreeBSD$
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.63 1999/08/28 00:46:19 peter Exp
*/
@@ -303,9 +304,9 @@ char *syscallnames[] = {
"#294", /* 294 = nosys */
"#295", /* 295 = nosys */
"#296", /* 296 = nosys */
- "#297", /* 297 = nosys */
- "#298", /* 298 = nosys */
- "#299", /* 299 = nosys */
+ "fhstatfs", /* 297 = fhstatfs */
+ "fhopen", /* 298 = fhopen */
+ "fhstat", /* 299 = fhstat */
"modnext", /* 300 = modnext */
"modstat", /* 301 = modstat */
"modfnext", /* 302 = modfnext */
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index 843cc9d..a0d1457 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -428,9 +428,10 @@
294 UNIMPL NOHIDE nosys
295 UNIMPL NOHIDE nosys
296 UNIMPL NOHIDE nosys
-297 UNIMPL NOHIDE nosys
-298 UNIMPL NOHIDE nosys
-299 UNIMPL NOHIDE nosys
+; XXX 297 is 300 in NetBSD
+297 STD BSD { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); }
+298 STD BSD { int fhopen(const struct fhandle *u_fhp, int flags); }
+299 STD BSD { int fhstat(const struct fhandle *u_fhp, struct stat *sb); }
; syscall numbers for FreeBSD
300 STD BSD { int modnext(int modid); }
301 STD BSD { int modstat(int modid, struct module_stat* stat); }
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index f089298..1d3e27d 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -580,12 +580,19 @@ vfs_stdvget (mp, ino, vpp)
}
int
-vfs_stdfhtovp (mp, fhp, nam, vpp, exflagsp, credanonp)
+vfs_stdfhtovp (mp, fhp, vpp)
struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
+{
+ return (EOPNOTSUPP);
+}
+
+int
+vfs_stdcheckexp (mp, nam, extflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
+ int *extflagsp;
struct ucred **credanonp;
{
return (EOPNOTSUPP);
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index ae7aeeb4..e5354f6 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -46,6 +46,8 @@
#include <sys/systm.h>
#include <sys/buf.h>
#include <sys/sysent.h>
+#include <sys/malloc.h>
+#include <sys/mount.h>
#include <sys/sysproto.h>
#include <sys/namei.h>
#include <sys/filedesc.h>
@@ -56,8 +58,6 @@
#include <sys/stat.h>
#include <sys/unistd.h>
#include <sys/vnode.h>
-#include <sys/malloc.h>
-#include <sys/mount.h>
#include <sys/proc.h>
#include <sys/dirent.h>
@@ -3130,3 +3130,292 @@ __getcwd(p, uap)
free(buf, M_TEMP);
return (error);
}
+
+/*
+ * Get (NFS) file handle
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct getfh_args {
+ char *fname;
+ fhandle_t *fhp;
+};
+#endif
+int
+getfh(p, uap)
+ struct proc *p;
+ register struct getfh_args *uap;
+{
+ struct nameidata nd;
+ fhandle_t fh;
+ register struct vnode *vp;
+ int error;
+
+ /*
+ * Must be super user
+ */
+ error = suser(p);
+ if (error)
+ return (error);
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, p);
+ error = namei(&nd);
+ if (error)
+ return (error);
+ vp = nd.ni_vp;
+ bzero(&fh, sizeof(fh));
+ fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
+ error = VFS_VPTOFH(vp, &fh.fh_fid);
+ vput(vp);
+ if (error)
+ return (error);
+ error = copyout(&fh, uap->fhp, sizeof (fh));
+ return (error);
+}
+
+/*
+ * syscall for the rpc.lockd to use to translate a NFS file handle into
+ * an open descriptor.
+ *
+ * warning: do not remove the suser() call or this becomes one giant
+ * security hole.
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct fhopen_args {
+ const struct fhandle *u_fhp;
+ int flags;
+};
+#endif
+int
+fhopen(p, uap)
+ struct proc *p;
+ struct fhopen_args /* {
+ syscallarg(const struct fhandle *) u_fhp;
+ syscallarg(int) flags;
+ } */ *uap;
+{
+ struct mount *mp;
+ struct vnode *vp;
+ struct fhandle fhp;
+ struct vattr vat;
+ struct vattr *vap = &vat;
+ struct flock lf;
+ struct file *fp;
+ register struct filedesc *fdp = p->p_fd;
+ int fmode, mode, error, type;
+ struct file *nfp;
+ int indx;
+
+ /*
+ * Must be super user
+ */
+ error = suser(p);
+ if (error)
+ return (error);
+
+ fmode = FFLAGS(SCARG(uap, flags));
+ /* why not allow a non-read/write open for our lockd? */
+ if (((fmode & (FREAD | FWRITE)) == 0) || (fmode & O_CREAT))
+ return (EINVAL);
+ error = copyin(SCARG(uap,u_fhp), &fhp, sizeof(fhp));
+ if (error)
+ return(error);
+ /* find the mount point */
+ mp = vfs_getvfs(&fhp.fh_fsid);
+ if (mp == NULL)
+ return (ESTALE);
+ /* now give me my vnode, it gets returned to me locked */
+ error = VFS_FHTOVP(mp, &fhp.fh_fid, &vp);
+ if (error)
+ return (error);
+ /*
+ * from now on we have to make sure not
+ * to forget about the vnode
+ * any error that causes an abort must vput(vp)
+ * just set error = err and 'goto bad;'.
+ */
+
+ /*
+ * from vn_open
+ */
+ if (vp->v_type == VLNK) {
+ error = EMLINK;
+ goto bad;
+ }
+ if (vp->v_type == VSOCK) {
+ error = EOPNOTSUPP;
+ goto bad;
+ }
+ mode = 0;
+ if (fmode & (FWRITE | O_TRUNC)) {
+ if (vp->v_type == VDIR) {
+ error = EISDIR;
+ goto bad;
+ }
+ error = vn_writechk(vp);
+ if (error)
+ goto bad;
+ mode |= VWRITE;
+ }
+ if (fmode & FREAD)
+ mode |= VREAD;
+ if (mode) {
+ error = VOP_ACCESS(vp, mode, p->p_ucred, p);
+ if (error)
+ goto bad;
+ }
+ if (fmode & O_TRUNC) {
+ VOP_UNLOCK(vp, 0, p); /* XXX */
+ VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); /* XXX */
+ VATTR_NULL(vap);
+ vap->va_size = 0;
+ error = VOP_SETATTR(vp, vap, p->p_ucred, p);
+ if (error)
+ goto bad;
+ }
+ error = VOP_OPEN(vp, fmode, p->p_ucred, p);
+ if (error)
+ goto bad;
+ /*
+ * Make sure that a VM object is created for VMIO support.
+ */
+ if (vn_canvmio(vp) == TRUE) {
+ if ((error = vfs_object_create(vp, p, p->p_ucred)) != 0)
+ goto bad;
+ }
+ if (fmode & FWRITE)
+ vp->v_writecount++;
+
+ /*
+ * end of vn_open code
+ */
+
+ if ((error = falloc(p, &nfp, &indx)) != 0)
+ goto bad;
+ fp = nfp;
+ nfp->f_data = (caddr_t)vp;
+ nfp->f_flag = fmode & FMASK;
+ nfp->f_ops = &vnops;
+ nfp->f_type = DTYPE_VNODE;
+ if (fmode & (O_EXLOCK | O_SHLOCK)) {
+ lf.l_whence = SEEK_SET;
+ lf.l_start = 0;
+ lf.l_len = 0;
+ if (fmode & O_EXLOCK)
+ lf.l_type = F_WRLCK;
+ else
+ lf.l_type = F_RDLCK;
+ type = F_FLOCK;
+ if ((fmode & FNONBLOCK) == 0)
+ type |= F_WAIT;
+ VOP_UNLOCK(vp, 0, p);
+ if ((error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, type)) != 0) {
+ (void) vn_close(vp, fp->f_flag, fp->f_cred, p);
+ ffree(fp);
+ fdp->fd_ofiles[indx] = NULL;
+ return (error);
+ }
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ fp->f_flag |= FHASLOCK;
+ }
+ if ((vp->v_type == VREG) && (vp->v_object == NULL))
+ vfs_object_create(vp, p, p->p_ucred);
+
+ VOP_UNLOCK(vp, 0, p);
+ p->p_retval[0] = indx;
+ return (0);
+
+bad:
+ vput(vp);
+ return (error);
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct fhstat_args {
+ struct fhandle *u_fhp;
+ struct stat *sb;
+};
+#endif
+int
+fhstat(p, uap)
+ struct proc *p;
+ register struct fhstat_args /* {
+ syscallarg(struct fhandle *) u_fhp;
+ syscallarg(struct stat *) sb;
+ } */ *uap;
+{
+ struct stat sb;
+ fhandle_t fh;
+ struct mount *mp;
+ struct vnode *vp;
+ int error;
+
+ /*
+ * Must be super user
+ */
+ error = suser(p);
+ if (error)
+ return (error);
+
+ error = copyin(SCARG(uap, u_fhp), &fh, sizeof(fhandle_t));
+ if (error)
+ return (error);
+
+ if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL)
+ return (ESTALE);
+ if ((error = VFS_FHTOVP(mp, &fh.fh_fid, &vp)))
+ return (error);
+ error = vn_stat(vp, &sb, p);
+ vput(vp);
+ if (error)
+ return (error);
+ error = copyout(&sb, SCARG(uap, sb), sizeof(sb));
+ return (error);
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct fhstatfs_args {
+ struct fhandle *u_fhp;
+ struct statfs *buf;
+};
+#endif
+int
+fhstatfs(p, uap)
+ struct proc *p;
+ struct fhstatfs_args /* {
+ syscallarg(struct fhandle) *u_fhp;
+ syscallarg(struct statfs) *buf;
+ } */ *uap;
+{
+ struct statfs *sp;
+ struct mount *mp;
+ struct vnode *vp;
+ struct statfs sb;
+ fhandle_t fh;
+ int error;
+
+ /*
+ * Must be super user
+ */
+ if ((error = suser(p)))
+ return (error);
+
+ if ((error = copyin(SCARG(uap, u_fhp), &fh, sizeof(fhandle_t))) != 0)
+ return (error);
+
+ if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL)
+ return (ESTALE);
+ if ((error = VFS_FHTOVP(mp, &fh.fh_fid, &vp)))
+ return (error);
+ mp = vp->v_mount;
+ sp = &mp->mnt_stat;
+ vput(vp);
+ if ((error = VFS_STATFS(mp, sp, p)) != 0)
+ return (error);
+ sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
+ if (suser_xxx(p->p_ucred, 0, 0)) {
+ bcopy((caddr_t)sp, (caddr_t)&sb, sizeof(sb));
+ sb.f_fsid.val[0] = sb.f_fsid.val[1] = 0;
+ sp = &sb;
+ }
+ return (copyout(sp, SCARG(uap, buf), sizeof(*sp)));
+}
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index ae7aeeb4..e5354f6 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -46,6 +46,8 @@
#include <sys/systm.h>
#include <sys/buf.h>
#include <sys/sysent.h>
+#include <sys/malloc.h>
+#include <sys/mount.h>
#include <sys/sysproto.h>
#include <sys/namei.h>
#include <sys/filedesc.h>
@@ -56,8 +58,6 @@
#include <sys/stat.h>
#include <sys/unistd.h>
#include <sys/vnode.h>
-#include <sys/malloc.h>
-#include <sys/mount.h>
#include <sys/proc.h>
#include <sys/dirent.h>
@@ -3130,3 +3130,292 @@ __getcwd(p, uap)
free(buf, M_TEMP);
return (error);
}
+
+/*
+ * Get (NFS) file handle
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct getfh_args {
+ char *fname;
+ fhandle_t *fhp;
+};
+#endif
+int
+getfh(p, uap)
+ struct proc *p;
+ register struct getfh_args *uap;
+{
+ struct nameidata nd;
+ fhandle_t fh;
+ register struct vnode *vp;
+ int error;
+
+ /*
+ * Must be super user
+ */
+ error = suser(p);
+ if (error)
+ return (error);
+ NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, p);
+ error = namei(&nd);
+ if (error)
+ return (error);
+ vp = nd.ni_vp;
+ bzero(&fh, sizeof(fh));
+ fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
+ error = VFS_VPTOFH(vp, &fh.fh_fid);
+ vput(vp);
+ if (error)
+ return (error);
+ error = copyout(&fh, uap->fhp, sizeof (fh));
+ return (error);
+}
+
+/*
+ * syscall for the rpc.lockd to use to translate a NFS file handle into
+ * an open descriptor.
+ *
+ * warning: do not remove the suser() call or this becomes one giant
+ * security hole.
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct fhopen_args {
+ const struct fhandle *u_fhp;
+ int flags;
+};
+#endif
+int
+fhopen(p, uap)
+ struct proc *p;
+ struct fhopen_args /* {
+ syscallarg(const struct fhandle *) u_fhp;
+ syscallarg(int) flags;
+ } */ *uap;
+{
+ struct mount *mp;
+ struct vnode *vp;
+ struct fhandle fhp;
+ struct vattr vat;
+ struct vattr *vap = &vat;
+ struct flock lf;
+ struct file *fp;
+ register struct filedesc *fdp = p->p_fd;
+ int fmode, mode, error, type;
+ struct file *nfp;
+ int indx;
+
+ /*
+ * Must be super user
+ */
+ error = suser(p);
+ if (error)
+ return (error);
+
+ fmode = FFLAGS(SCARG(uap, flags));
+ /* why not allow a non-read/write open for our lockd? */
+ if (((fmode & (FREAD | FWRITE)) == 0) || (fmode & O_CREAT))
+ return (EINVAL);
+ error = copyin(SCARG(uap,u_fhp), &fhp, sizeof(fhp));
+ if (error)
+ return(error);
+ /* find the mount point */
+ mp = vfs_getvfs(&fhp.fh_fsid);
+ if (mp == NULL)
+ return (ESTALE);
+ /* now give me my vnode, it gets returned to me locked */
+ error = VFS_FHTOVP(mp, &fhp.fh_fid, &vp);
+ if (error)
+ return (error);
+ /*
+ * from now on we have to make sure not
+ * to forget about the vnode
+ * any error that causes an abort must vput(vp)
+ * just set error = err and 'goto bad;'.
+ */
+
+ /*
+ * from vn_open
+ */
+ if (vp->v_type == VLNK) {
+ error = EMLINK;
+ goto bad;
+ }
+ if (vp->v_type == VSOCK) {
+ error = EOPNOTSUPP;
+ goto bad;
+ }
+ mode = 0;
+ if (fmode & (FWRITE | O_TRUNC)) {
+ if (vp->v_type == VDIR) {
+ error = EISDIR;
+ goto bad;
+ }
+ error = vn_writechk(vp);
+ if (error)
+ goto bad;
+ mode |= VWRITE;
+ }
+ if (fmode & FREAD)
+ mode |= VREAD;
+ if (mode) {
+ error = VOP_ACCESS(vp, mode, p->p_ucred, p);
+ if (error)
+ goto bad;
+ }
+ if (fmode & O_TRUNC) {
+ VOP_UNLOCK(vp, 0, p); /* XXX */
+ VOP_LEASE(vp, p, p->p_ucred, LEASE_WRITE);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); /* XXX */
+ VATTR_NULL(vap);
+ vap->va_size = 0;
+ error = VOP_SETATTR(vp, vap, p->p_ucred, p);
+ if (error)
+ goto bad;
+ }
+ error = VOP_OPEN(vp, fmode, p->p_ucred, p);
+ if (error)
+ goto bad;
+ /*
+ * Make sure that a VM object is created for VMIO support.
+ */
+ if (vn_canvmio(vp) == TRUE) {
+ if ((error = vfs_object_create(vp, p, p->p_ucred)) != 0)
+ goto bad;
+ }
+ if (fmode & FWRITE)
+ vp->v_writecount++;
+
+ /*
+ * end of vn_open code
+ */
+
+ if ((error = falloc(p, &nfp, &indx)) != 0)
+ goto bad;
+ fp = nfp;
+ nfp->f_data = (caddr_t)vp;
+ nfp->f_flag = fmode & FMASK;
+ nfp->f_ops = &vnops;
+ nfp->f_type = DTYPE_VNODE;
+ if (fmode & (O_EXLOCK | O_SHLOCK)) {
+ lf.l_whence = SEEK_SET;
+ lf.l_start = 0;
+ lf.l_len = 0;
+ if (fmode & O_EXLOCK)
+ lf.l_type = F_WRLCK;
+ else
+ lf.l_type = F_RDLCK;
+ type = F_FLOCK;
+ if ((fmode & FNONBLOCK) == 0)
+ type |= F_WAIT;
+ VOP_UNLOCK(vp, 0, p);
+ if ((error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, type)) != 0) {
+ (void) vn_close(vp, fp->f_flag, fp->f_cred, p);
+ ffree(fp);
+ fdp->fd_ofiles[indx] = NULL;
+ return (error);
+ }
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ fp->f_flag |= FHASLOCK;
+ }
+ if ((vp->v_type == VREG) && (vp->v_object == NULL))
+ vfs_object_create(vp, p, p->p_ucred);
+
+ VOP_UNLOCK(vp, 0, p);
+ p->p_retval[0] = indx;
+ return (0);
+
+bad:
+ vput(vp);
+ return (error);
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct fhstat_args {
+ struct fhandle *u_fhp;
+ struct stat *sb;
+};
+#endif
+int
+fhstat(p, uap)
+ struct proc *p;
+ register struct fhstat_args /* {
+ syscallarg(struct fhandle *) u_fhp;
+ syscallarg(struct stat *) sb;
+ } */ *uap;
+{
+ struct stat sb;
+ fhandle_t fh;
+ struct mount *mp;
+ struct vnode *vp;
+ int error;
+
+ /*
+ * Must be super user
+ */
+ error = suser(p);
+ if (error)
+ return (error);
+
+ error = copyin(SCARG(uap, u_fhp), &fh, sizeof(fhandle_t));
+ if (error)
+ return (error);
+
+ if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL)
+ return (ESTALE);
+ if ((error = VFS_FHTOVP(mp, &fh.fh_fid, &vp)))
+ return (error);
+ error = vn_stat(vp, &sb, p);
+ vput(vp);
+ if (error)
+ return (error);
+ error = copyout(&sb, SCARG(uap, sb), sizeof(sb));
+ return (error);
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct fhstatfs_args {
+ struct fhandle *u_fhp;
+ struct statfs *buf;
+};
+#endif
+int
+fhstatfs(p, uap)
+ struct proc *p;
+ struct fhstatfs_args /* {
+ syscallarg(struct fhandle) *u_fhp;
+ syscallarg(struct statfs) *buf;
+ } */ *uap;
+{
+ struct statfs *sp;
+ struct mount *mp;
+ struct vnode *vp;
+ struct statfs sb;
+ fhandle_t fh;
+ int error;
+
+ /*
+ * Must be super user
+ */
+ if ((error = suser(p)))
+ return (error);
+
+ if ((error = copyin(SCARG(uap, u_fhp), &fh, sizeof(fhandle_t))) != 0)
+ return (error);
+
+ if ((mp = vfs_getvfs(&fh.fh_fsid)) == NULL)
+ return (ESTALE);
+ if ((error = VFS_FHTOVP(mp, &fh.fh_fid, &vp)))
+ return (error);
+ mp = vp->v_mount;
+ sp = &mp->mnt_stat;
+ vput(vp);
+ if ((error = VFS_STATFS(mp, sp, p)) != 0)
+ return (error);
+ sp->f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
+ if (suser_xxx(p->p_ucred, 0, 0)) {
+ bcopy((caddr_t)sp, (caddr_t)&sb, sizeof(sb));
+ sb.f_fsid.val[0] = sb.f_fsid.val[1] = 0;
+ sp = &sb;
+ }
+ return (copyout(sp, SCARG(uap, buf), sizeof(*sp)));
+}
diff --git a/sys/miscfs/devfs/devfs_vfsops.c b/sys/miscfs/devfs/devfs_vfsops.c
index b6be038..264f049 100644
--- a/sys/miscfs/devfs/devfs_vfsops.c
+++ b/sys/miscfs/devfs/devfs_vfsops.c
@@ -303,6 +303,7 @@ static struct vfsops devfs_vfsops = {
devfs_sync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
devfs_init
};
diff --git a/sys/miscfs/fdesc/fdesc_vfsops.c b/sys/miscfs/fdesc/fdesc_vfsops.c
index 97231a4..a451c18 100644
--- a/sys/miscfs/fdesc/fdesc_vfsops.c
+++ b/sys/miscfs/fdesc/fdesc_vfsops.c
@@ -224,6 +224,7 @@ static struct vfsops fdesc_vfsops = {
vfs_stdsync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
fdesc_init,
};
diff --git a/sys/miscfs/kernfs/kernfs_vfsops.c b/sys/miscfs/kernfs/kernfs_vfsops.c
index 0f21035..a08e9d4 100644
--- a/sys/miscfs/kernfs/kernfs_vfsops.c
+++ b/sys/miscfs/kernfs/kernfs_vfsops.c
@@ -252,6 +252,7 @@ static struct vfsops kernfs_vfsops = {
vfs_stdsync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
vfs_stdinit,
};
diff --git a/sys/miscfs/nullfs/null_vfsops.c b/sys/miscfs/nullfs/null_vfsops.c
index 730eb80..06e1be0 100644
--- a/sys/miscfs/nullfs/null_vfsops.c
+++ b/sys/miscfs/nullfs/null_vfsops.c
@@ -57,8 +57,9 @@
static MALLOC_DEFINE(M_NULLFSMNT, "NULLFS mount", "NULLFS mount structure");
static int nullfs_fhtovp __P((struct mount *mp, struct fid *fidp,
- struct sockaddr *nam, struct vnode **vpp,
- int *exflagsp, struct ucred **credanonp));
+ struct vnode **vpp));
+static int nullfs_checkexp __P((struct mount *mp, struct sockaddr *nam,
+ int *extflagsp, struct ucred **credanonp));
static int nullfs_mount __P((struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct proc *p));
static int nullfs_quotactl __P((struct mount *mp, int cmd, uid_t uid,
@@ -385,17 +386,25 @@ nullfs_vget(mp, ino, vpp)
}
static int
-nullfs_fhtovp(mp, fidp, nam, vpp, exflagsp, credanonp)
+nullfs_fhtovp(mp, fidp, vpp)
struct mount *mp;
struct fid *fidp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred**credanonp;
{
- return VFS_FHTOVP(MOUNTTONULLMOUNT(mp)->nullm_vfs, fidp, nam,
- vpp, exflagsp, credanonp);
+ return VFS_FHTOVP(MOUNTTONULLMOUNT(mp)->nullm_vfs, fidp, vpp);
+}
+
+static int
+nullfs_checkexp(mp, nam, extflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
+ int *extflagsp;
+ struct ucred **credanonp;
+{
+
+ return VFS_CHECKEXP(MOUNTTONULLMOUNT(mp)->nullm_vfs, nam,
+ extflagsp, credanonp);
}
static int
@@ -416,6 +425,7 @@ static struct vfsops null_vfsops = {
nullfs_sync,
nullfs_vget,
nullfs_fhtovp,
+ nullfs_checkexp,
nullfs_vptofh,
nullfs_init,
};
diff --git a/sys/miscfs/portal/portal_vfsops.c b/sys/miscfs/portal/portal_vfsops.c
index bdb172b..d750b53 100644
--- a/sys/miscfs/portal/portal_vfsops.c
+++ b/sys/miscfs/portal/portal_vfsops.c
@@ -253,6 +253,7 @@ static struct vfsops portal_vfsops = {
vfs_stdsync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
vfs_stdinit,
};
diff --git a/sys/miscfs/procfs/procfs_vfsops.c b/sys/miscfs/procfs/procfs_vfsops.c
index 92245b8..9f51a3c 100644
--- a/sys/miscfs/procfs/procfs_vfsops.c
+++ b/sys/miscfs/procfs/procfs_vfsops.c
@@ -170,6 +170,7 @@ static struct vfsops procfs_vfsops = {
vfs_stdsync,
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
vfs_stdinit,
};
diff --git a/sys/miscfs/umapfs/umap_vfsops.c b/sys/miscfs/umapfs/umap_vfsops.c
index 005862a..afa44f0 100644
--- a/sys/miscfs/umapfs/umap_vfsops.c
+++ b/sys/miscfs/umapfs/umap_vfsops.c
@@ -56,8 +56,9 @@
static MALLOC_DEFINE(M_UMAPFSMNT, "UMAP mount", "UMAP mount structure");
static int umapfs_fhtovp __P((struct mount *mp, struct fid *fidp,
- struct sockaddr *nam, struct vnode **vpp,
- int *exflagsp, struct ucred **credanonp));
+ struct vnode **vpp));
+static int umapfs_checkexp __P((struct mount *mp, struct sockaddr *nam,
+ int *extflagsp, struct ucred **credanonp));
static int umapfs_mount __P((struct mount *mp, char *path, caddr_t data,
struct nameidata *ndp, struct proc *p));
static int umapfs_quotactl __P((struct mount *mp, int cmd, uid_t uid,
@@ -398,16 +399,25 @@ umapfs_vget(mp, ino, vpp)
}
static int
-umapfs_fhtovp(mp, fidp, nam, vpp, exflagsp, credanonp)
+umapfs_fhtovp(mp, fidp, vpp)
struct mount *mp;
struct fid *fidp;
- struct sockaddr *nam;
struct vnode **vpp;
+{
+
+ return (VFS_FHTOVP(MOUNTTOUMAPMOUNT(mp)->umapm_vfs, fidp, vpp));
+}
+
+static int
+umapfs_checkexp(mp, nam, exflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
int *exflagsp;
- struct ucred**credanonp;
+ struct ucred **credanonp;
{
- return (VFS_FHTOVP(MOUNTTOUMAPMOUNT(mp)->umapm_vfs, fidp, nam, vpp, exflagsp,credanonp));
+ return (VFS_CHECKEXP(MOUNTTOUMAPMOUNT(mp)->umapm_vfs, nam,
+ exflagsp, credanonp));
}
static int
@@ -428,6 +438,7 @@ static struct vfsops umap_vfsops = {
umapfs_sync,
umapfs_vget,
umapfs_fhtovp,
+ umapfs_checkexp,
umapfs_vptofh,
umapfs_init,
};
diff --git a/sys/miscfs/union/union_vfsops.c b/sys/miscfs/union/union_vfsops.c
index def8416..af828ac 100644
--- a/sys/miscfs/union/union_vfsops.c
+++ b/sys/miscfs/union/union_vfsops.c
@@ -496,7 +496,7 @@ union_statfs(mp, sbp, p)
static struct vfsops union_vfsops = {
union_mount,
- vfs_stdstart,
+ vfs_stdstart, /* underlying start already done */
union_unmount,
union_root,
vfs_stdquotactl,
@@ -504,6 +504,7 @@ static struct vfsops union_vfsops = {
vfs_stdsync, /* XXX assumes no cached data on union level */
vfs_stdvget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
union_init,
};
diff --git a/sys/msdosfs/msdosfs_vfsops.c b/sys/msdosfs/msdosfs_vfsops.c
index e8695b8..625690d 100644
--- a/sys/msdosfs/msdosfs_vfsops.c
+++ b/sys/msdosfs/msdosfs_vfsops.c
@@ -75,8 +75,9 @@ static int update_mp __P((struct mount *mp, struct msdosfs_args *argp));
static int mountmsdosfs __P((struct vnode *devvp, struct mount *mp,
struct proc *p, struct msdosfs_args *argp));
static int msdosfs_fhtovp __P((struct mount *, struct fid *,
- struct sockaddr *, struct vnode **, int *,
- struct ucred **));
+ struct vnode **));
+static int msdosfs_checkexp __P((struct mount *, struct sockaddr *,
+ int *, struct ucred **));
static int msdosfs_mount __P((struct mount *, char *, caddr_t,
struct nameidata *, struct proc *));
static int msdosfs_root __P((struct mount *, struct vnode **));
@@ -915,29 +916,38 @@ loop:
}
static int
-msdosfs_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
+msdosfs_fhtovp(mp, fhp, vpp)
struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
struct msdosfsmount *pmp = VFSTOMSDOSFS(mp);
struct defid *defhp = (struct defid *) fhp;
struct denode *dep;
- struct netcred *np;
int error;
- np = vfs_export_lookup(mp, &pmp->pm_export, nam);
- if (np == NULL)
- return (EACCES);
error = deget(pmp, defhp->defid_dirclust, defhp->defid_dirofs, &dep);
if (error) {
*vpp = NULLVP;
return (error);
}
*vpp = DETOV(dep);
+ return (0);
+}
+
+static int
+msdosfs_checkexp(mp, nam, exflagsp, credanonp)
+ struct mount *mp;
+ struct sockaddr *nam;
+ int *exflagsp;
+ struct ucred **credanonp;
+{
+ struct msdosfsmount *pmp = VFSTOMSDOSFS(mp);
+ struct netcred *np;
+
+ np = vfs_export_lookup(mp, &pmp->pm_export, nam);
+ if (np == NULL)
+ return (EACCES);
*exflagsp = np->netc_exflags;
*credanonp = &np->netc_anon;
return (0);
@@ -970,6 +980,7 @@ static struct vfsops msdosfs_vfsops = {
msdosfs_sync,
vfs_stdvget,
msdosfs_fhtovp,
+ msdosfs_checkexp,
msdosfs_vptofh,
msdosfs_init
};
diff --git a/sys/nfs/nfs_common.c b/sys/nfs/nfs_common.c
index 0ed9e22..7fd9d9d 100644
--- a/sys/nfs/nfs_common.c
+++ b/sys/nfs/nfs_common.c
@@ -1960,7 +1960,10 @@ nfsrv_fhtovp(fhp, lockflag, vpp, cred, slp, nam, rdonlyp, kerbflag, pubflag)
mp = vfs_getvfs(&fhp->fh_fsid);
if (!mp)
return (ESTALE);
- error = VFS_FHTOVP(mp, &fhp->fh_fid, nam, vpp, &exflags, &credanon);
+ error = VFS_CHECKEXP(mp, nam, &exflags, &credanon);
+ if (error)
+ return (error);
+ error = VFS_FHTOVP(mp, &fhp->fh_fid, vpp);
if (error)
return (error);
#ifdef MNT_EXNORESPORT
diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c
index 0ed9e22..7fd9d9d 100644
--- a/sys/nfs/nfs_subs.c
+++ b/sys/nfs/nfs_subs.c
@@ -1960,7 +1960,10 @@ nfsrv_fhtovp(fhp, lockflag, vpp, cred, slp, nam, rdonlyp, kerbflag, pubflag)
mp = vfs_getvfs(&fhp->fh_fsid);
if (!mp)
return (ESTALE);
- error = VFS_FHTOVP(mp, &fhp->fh_fid, nam, vpp, &exflags, &credanon);
+ error = VFS_CHECKEXP(mp, nam, &exflags, &credanon);
+ if (error)
+ return (error);
+ error = VFS_FHTOVP(mp, &fhp->fh_fid, vpp);
if (error)
return (error);
#ifdef MNT_EXNORESPORT
diff --git a/sys/nfs/nfs_syscalls.c b/sys/nfs/nfs_syscalls.c
index 210dde6..054950b 100644
--- a/sys/nfs/nfs_syscalls.c
+++ b/sys/nfs/nfs_syscalls.c
@@ -120,49 +120,8 @@ SYSCTL_INT(_vfs_nfs, OID_AUTO, gatherdelay_v3, CTLFLAG_RW, &nfsrvw_procrastinate
/*
* NFS server system calls
- * getfh() lives here too, but maybe should move to kern/vfs_syscalls.c
*/
-/*
- * Get file handle system call
- */
-#ifndef _SYS_SYSPROTO_H_
-struct getfh_args {
- char *fname;
- fhandle_t *fhp;
-};
-#endif
-int
-getfh(p, uap)
- struct proc *p;
- register struct getfh_args *uap;
-{
- register struct vnode *vp;
- fhandle_t fh;
- int error;
- struct nameidata nd;
-
- /*
- * Must be super user
- */
- error = suser(p);
- if(error)
- return (error);
- NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, p);
- error = namei(&nd);
- if (error)
- return (error);
- vp = nd.ni_vp;
- bzero((caddr_t)&fh, sizeof(fh));
- fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
- error = VFS_VPTOFH(vp, &fh.fh_fid);
- vput(vp);
- if (error)
- return (error);
- error = copyout((caddr_t)&fh, (caddr_t)uap->fhp, sizeof (fh));
- return (error);
-}
-
#endif /* NFS_NOSERVER */
/*
* Nfs server psuedo system call for the nfsd's
diff --git a/sys/nfs/nfs_vfsops.c b/sys/nfs/nfs_vfsops.c
index 33085c4..d63f38d 100644
--- a/sys/nfs/nfs_vfsops.c
+++ b/sys/nfs/nfs_vfsops.c
@@ -120,6 +120,7 @@ static struct vfsops nfs_vfsops = {
nfs_sync,
vfs_stdvget,
vfs_stdfhtovp, /* shouldn't happen */
+ vfs_stdcheckexp,
vfs_stdvptofh, /* shouldn't happen */
nfs_init,
nfs_uninit,
diff --git a/sys/nfsclient/nfs_nfsiod.c b/sys/nfsclient/nfs_nfsiod.c
index 210dde6..054950b 100644
--- a/sys/nfsclient/nfs_nfsiod.c
+++ b/sys/nfsclient/nfs_nfsiod.c
@@ -120,49 +120,8 @@ SYSCTL_INT(_vfs_nfs, OID_AUTO, gatherdelay_v3, CTLFLAG_RW, &nfsrvw_procrastinate
/*
* NFS server system calls
- * getfh() lives here too, but maybe should move to kern/vfs_syscalls.c
*/
-/*
- * Get file handle system call
- */
-#ifndef _SYS_SYSPROTO_H_
-struct getfh_args {
- char *fname;
- fhandle_t *fhp;
-};
-#endif
-int
-getfh(p, uap)
- struct proc *p;
- register struct getfh_args *uap;
-{
- register struct vnode *vp;
- fhandle_t fh;
- int error;
- struct nameidata nd;
-
- /*
- * Must be super user
- */
- error = suser(p);
- if(error)
- return (error);
- NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, p);
- error = namei(&nd);
- if (error)
- return (error);
- vp = nd.ni_vp;
- bzero((caddr_t)&fh, sizeof(fh));
- fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
- error = VFS_VPTOFH(vp, &fh.fh_fid);
- vput(vp);
- if (error)
- return (error);
- error = copyout((caddr_t)&fh, (caddr_t)uap->fhp, sizeof (fh));
- return (error);
-}
-
#endif /* NFS_NOSERVER */
/*
* Nfs server psuedo system call for the nfsd's
diff --git a/sys/nfsclient/nfs_subs.c b/sys/nfsclient/nfs_subs.c
index 0ed9e22..7fd9d9d 100644
--- a/sys/nfsclient/nfs_subs.c
+++ b/sys/nfsclient/nfs_subs.c
@@ -1960,7 +1960,10 @@ nfsrv_fhtovp(fhp, lockflag, vpp, cred, slp, nam, rdonlyp, kerbflag, pubflag)
mp = vfs_getvfs(&fhp->fh_fsid);
if (!mp)
return (ESTALE);
- error = VFS_FHTOVP(mp, &fhp->fh_fid, nam, vpp, &exflags, &credanon);
+ error = VFS_CHECKEXP(mp, nam, &exflags, &credanon);
+ if (error)
+ return (error);
+ error = VFS_FHTOVP(mp, &fhp->fh_fid, vpp);
if (error)
return (error);
#ifdef MNT_EXNORESPORT
diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c
index 33085c4..d63f38d 100644
--- a/sys/nfsclient/nfs_vfsops.c
+++ b/sys/nfsclient/nfs_vfsops.c
@@ -120,6 +120,7 @@ static struct vfsops nfs_vfsops = {
nfs_sync,
vfs_stdvget,
vfs_stdfhtovp, /* shouldn't happen */
+ vfs_stdcheckexp,
vfs_stdvptofh, /* shouldn't happen */
nfs_init,
nfs_uninit,
diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c
index 0ed9e22..7fd9d9d 100644
--- a/sys/nfsserver/nfs_srvsubs.c
+++ b/sys/nfsserver/nfs_srvsubs.c
@@ -1960,7 +1960,10 @@ nfsrv_fhtovp(fhp, lockflag, vpp, cred, slp, nam, rdonlyp, kerbflag, pubflag)
mp = vfs_getvfs(&fhp->fh_fsid);
if (!mp)
return (ESTALE);
- error = VFS_FHTOVP(mp, &fhp->fh_fid, nam, vpp, &exflags, &credanon);
+ error = VFS_CHECKEXP(mp, nam, &exflags, &credanon);
+ if (error)
+ return (error);
+ error = VFS_FHTOVP(mp, &fhp->fh_fid, vpp);
if (error)
return (error);
#ifdef MNT_EXNORESPORT
diff --git a/sys/nfsserver/nfs_syscalls.c b/sys/nfsserver/nfs_syscalls.c
index 210dde6..054950b 100644
--- a/sys/nfsserver/nfs_syscalls.c
+++ b/sys/nfsserver/nfs_syscalls.c
@@ -120,49 +120,8 @@ SYSCTL_INT(_vfs_nfs, OID_AUTO, gatherdelay_v3, CTLFLAG_RW, &nfsrvw_procrastinate
/*
* NFS server system calls
- * getfh() lives here too, but maybe should move to kern/vfs_syscalls.c
*/
-/*
- * Get file handle system call
- */
-#ifndef _SYS_SYSPROTO_H_
-struct getfh_args {
- char *fname;
- fhandle_t *fhp;
-};
-#endif
-int
-getfh(p, uap)
- struct proc *p;
- register struct getfh_args *uap;
-{
- register struct vnode *vp;
- fhandle_t fh;
- int error;
- struct nameidata nd;
-
- /*
- * Must be super user
- */
- error = suser(p);
- if(error)
- return (error);
- NDINIT(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_USERSPACE, uap->fname, p);
- error = namei(&nd);
- if (error)
- return (error);
- vp = nd.ni_vp;
- bzero((caddr_t)&fh, sizeof(fh));
- fh.fh_fsid = vp->v_mount->mnt_stat.f_fsid;
- error = VFS_VPTOFH(vp, &fh.fh_fid);
- vput(vp);
- if (error)
- return (error);
- error = copyout((caddr_t)&fh, (caddr_t)uap->fhp, sizeof (fh));
- return (error);
-}
-
#endif /* NFS_NOSERVER */
/*
* Nfs server psuedo system call for the nfsd's
diff --git a/sys/ntfs/ntfs_vfsops.c b/sys/ntfs/ntfs_vfsops.c
index 4106fc3..a77647e 100644
--- a/sys/ntfs/ntfs_vfsops.c
+++ b/sys/ntfs/ntfs_vfsops.c
@@ -93,9 +93,10 @@ static int ntfs_vptofh __P((struct vnode *, struct fid *));
static int ntfs_init __P((struct vfsconf *));
#if 0 /* may be implemented at a later date */
static int ntfs_fhtovp __P((struct mount *, struct fid *,
- struct sockaddr *, struct vnode **,
- int *, struct ucred **));
-#endif
+ struct vnode **));
+static int ntfs_checkexp __P((struct vnode *, struct mbuf *,
+ int *, struct ucred **));
+#endif /* 0, default ops in FreeBSD */
#elif defined(__NetBSD__)
static void ntfs_init __P((void));
static int ntfs_fhtovp __P((struct mount *, struct fid *,
@@ -952,6 +953,7 @@ static struct vfsops ntfs_vfsops = {
vfs_stdsync,
ntfs_vget,
vfs_stdfhtovp,
+ vfs_stdcheckexp,
vfs_stdvptofh,
ntfs_init,
NULL
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index d64150e..bb4b490 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -38,6 +38,13 @@
#define _SYS_MOUNT_H_
#include <sys/ucred.h>
+
+#ifndef KERNEL
+#if !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)
+#include <sys/stat.h>
+#endif /* !_POSIX_C_SOURCE */
+#endif /* !KERNEL */
+
#include <sys/queue.h>
#include <sys/lock.h>
@@ -305,8 +312,9 @@ struct vfsops {
int (*vfs_vget) __P((struct mount *mp, ino_t ino,
struct vnode **vpp));
int (*vfs_fhtovp) __P((struct mount *mp, struct fid *fhp,
- struct sockaddr *nam, struct vnode **vpp,
- int *exflagsp, struct ucred **credanonp));
+ struct vnode **vpp));
+ int (*vfs_checkexp) __P((struct mount *mp, struct sockaddr *nam,
+ int *extflagsp, struct ucred **credanonp));
int (*vfs_vptofh) __P((struct vnode *vp, struct fid *fhp));
int (*vfs_init) __P((struct vfsconf *));
int (*vfs_uninit) __P((struct vfsconf *));
@@ -321,9 +329,11 @@ struct vfsops {
#define VFS_STATFS(MP, SBP, P) (*(MP)->mnt_op->vfs_statfs)(MP, SBP, P)
#define VFS_SYNC(MP, WAIT, C, P) (*(MP)->mnt_op->vfs_sync)(MP, WAIT, C, P)
#define VFS_VGET(MP, INO, VPP) (*(MP)->mnt_op->vfs_vget)(MP, INO, VPP)
-#define VFS_FHTOVP(MP, FIDP, NAM, VPP, EXFLG, CRED) \
- (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, NAM, VPP, EXFLG, CRED)
+#define VFS_FHTOVP(MP, FIDP, VPP) \
+ (*(MP)->mnt_op->vfs_fhtovp)(MP, FIDP, VPP)
#define VFS_VPTOFH(VP, FIDP) (*(VP)->v_mount->mnt_op->vfs_vptofh)(VP, FIDP)
+#define VFS_CHECKEXP(MP, NAM, EXFLG, CRED) \
+ (*(MP)->mnt_op->vfs_checkexp)(MP, NAM, EXFLG, CRED)
#include <sys/module.h>
@@ -409,8 +419,9 @@ int vfs_stdstatfs __P((struct mount *mp, struct statfs *sbp, struct proc *p));
int vfs_stdsync __P((struct mount *mp, int waitfor, struct ucred *cred,
struct proc *p));
int vfs_stdvget __P((struct mount *mp, ino_t ino, struct vnode **vpp));
-int vfs_stdfhtovp __P((struct mount *mp, struct fid *fhp, struct sockaddr *nam,
- struct vnode **vpp, int *exflagsp, struct ucred **credanonp));
+int vfs_stdfhtovp __P((struct mount *mp, struct fid *fhp, struct vnode **vpp));
+int vfs_stdcheckexp __P((struct mount *mp, struct sockaddr *nam,
+ int *extflagsp, struct ucred **credanonp));
int vfs_stdvptofh __P((struct vnode *vp, struct fid *fhp));
int vfs_stdinit __P((struct vfsconf *));
int vfs_stduninit __P((struct vfsconf *));
@@ -427,6 +438,9 @@ int getmntinfo __P((struct statfs **, int));
int mount __P((const char *, const char *, int, void *));
int statfs __P((const char *, struct statfs *));
int unmount __P((const char *, int));
+int fhopen __P((const struct fhandle *, int));
+int fhstat __P((const struct fhandle *, struct stat *));
+int fhstatfs __P((const struct fhandle *, struct statfs *));
/* C library stuff */
void endvfsent __P((void));
diff --git a/sys/sys/syscall-hide.h b/sys/sys/syscall-hide.h
index bc98c64..ce7ab1f 100644
--- a/sys/sys/syscall-hide.h
+++ b/sys/sys/syscall-hide.h
@@ -2,6 +2,7 @@
* System call hiders.
*
* DO NOT EDIT-- this file is automatically generated.
+ * $FreeBSD$
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.63 1999/08/28 00:46:19 peter Exp
*/
@@ -216,6 +217,9 @@ HIDE_BSD(msync)
HIDE_BSD(nstat)
HIDE_BSD(nfstat)
HIDE_BSD(nlstat)
+HIDE_BSD(fhstatfs)
+HIDE_BSD(fhopen)
+HIDE_BSD(fhstat)
HIDE_BSD(modnext)
HIDE_BSD(modstat)
HIDE_BSD(modfnext)
diff --git a/sys/sys/syscall.h b/sys/sys/syscall.h
index 9ed2ff5..b3eae43 100644
--- a/sys/sys/syscall.h
+++ b/sys/sys/syscall.h
@@ -2,6 +2,7 @@
* System call numbers.
*
* DO NOT EDIT-- this file is automatically generated.
+ * $FreeBSD$
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.63 1999/08/28 00:46:19 peter Exp
*/
@@ -221,6 +222,9 @@
#define SYS_nstat 278
#define SYS_nfstat 279
#define SYS_nlstat 280
+#define SYS_fhstatfs 297
+#define SYS_fhopen 298
+#define SYS_fhstat 299
#define SYS_modnext 300
#define SYS_modstat 301
#define SYS_modfnext 302
diff --git a/sys/sys/syscall.mk b/sys/sys/syscall.mk
index 108bd28..b03b43e 100644
--- a/sys/sys/syscall.mk
+++ b/sys/sys/syscall.mk
@@ -1,5 +1,6 @@
# FreeBSD system call names.
# DO NOT EDIT-- this file is automatically generated.
+# $FreeBSD$
# created from FreeBSD: src/sys/kern/syscalls.master,v 1.63 1999/08/28 00:46:19 peter Exp
MIASM = \
syscall.o \
@@ -178,6 +179,9 @@ MIASM = \
nstat.o \
nfstat.o \
nlstat.o \
+ fhstatfs.o \
+ fhopen.o \
+ fhstat.o \
modnext.o \
modstat.o \
modfnext.o \
diff --git a/sys/sys/sysproto.h b/sys/sys/sysproto.h
index bc67dca..a35e74c 100644
--- a/sys/sys/sysproto.h
+++ b/sys/sys/sysproto.h
@@ -2,6 +2,7 @@
* System call prototypes.
*
* DO NOT EDIT-- this file is automatically generated.
+ * $FreeBSD$
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.63 1999/08/28 00:46:19 peter Exp
*/
@@ -779,6 +780,18 @@ struct nlstat_args {
char * path; char path_[PAD_(char *)];
struct nstat * ub; char ub_[PAD_(struct nstat *)];
};
+struct fhstatfs_args {
+ const struct fhandle * u_fhp; char u_fhp_[PAD_(const struct fhandle *)];
+ struct statfs * buf; char buf_[PAD_(struct statfs *)];
+};
+struct fhopen_args {
+ const struct fhandle * u_fhp; char u_fhp_[PAD_(const struct fhandle *)];
+ int flags; char flags_[PAD_(int)];
+};
+struct fhstat_args {
+ const struct fhandle * u_fhp; char u_fhp_[PAD_(const struct fhandle *)];
+ struct stat * sb; char sb_[PAD_(struct stat *)];
+};
struct modnext_args {
int modid; char modid_[PAD_(int)];
};
@@ -1084,6 +1097,9 @@ int lutimes __P((struct proc *, struct lutimes_args *));
int nstat __P((struct proc *, struct nstat_args *));
int nfstat __P((struct proc *, struct nfstat_args *));
int nlstat __P((struct proc *, struct nlstat_args *));
+int fhstatfs __P((struct proc *, struct fhstatfs_args *));
+int fhopen __P((struct proc *, struct fhopen_args *));
+int fhstat __P((struct proc *, struct fhstat_args *));
int modnext __P((struct proc *, struct modnext_args *));
int modstat __P((struct proc *, struct modstat_args *));
int modfnext __P((struct proc *, struct modfnext_args *));
diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h
index 177a820..12beae3 100644
--- a/sys/ufs/ffs/ffs_extern.h
+++ b/sys/ufs/ffs/ffs_extern.h
@@ -76,8 +76,9 @@ void ffs_blkfree __P((struct inode *, ufs_daddr_t, long));
ufs_daddr_t ffs_blkpref __P((struct inode *, ufs_daddr_t, int, ufs_daddr_t *));
int ffs_bmap __P((struct vop_bmap_args *));
void ffs_clrblock __P((struct fs *, u_char *, ufs_daddr_t));
-int ffs_fhtovp __P((struct mount *, struct fid *, struct sockaddr *,
- struct vnode **, int *, struct ucred **));
+int ffs_fhtovp __P((struct mount *, struct fid *, struct vnode **));
+int ffs_checkexp __P((struct mount *, struct sockaddr *, int *,
+ struct ucred **));
int ffs_flushfiles __P((struct mount *, int, struct proc *));
void ffs_fragacct __P((struct fs *, int, int32_t [], int));
int ffs_freefile __P(( struct vnode *, ino_t, int ));
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 3efbdeb..9af1c90 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -80,6 +80,7 @@ static struct vfsops ufs_vfsops = {
ffs_sync,
ffs_vget,
ffs_fhtovp,
+ ufs_check_export,
ffs_vptofh,
ffs_init,
};
@@ -1177,13 +1178,10 @@ restart:
* those rights via. exflagsp and credanonp
*/
int
-ffs_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
+ffs_fhtovp(mp, fhp, vpp)
register struct mount *mp;
struct fid *fhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
register struct ufid *ufhp;
struct fs *fs;
@@ -1193,7 +1191,7 @@ ffs_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp)
if (ufhp->ufid_ino < ROOTINO ||
ufhp->ufid_ino >= fs->fs_ncg * fs->fs_ipg)
return (ESTALE);
- return (ufs_check_export(mp, ufhp, nam, vpp, exflagsp, credanonp));
+ return (ufs_fhtovp(mp, ufhp, vpp));
}
/*
diff --git a/sys/ufs/mfs/mfs_vfsops.c b/sys/ufs/mfs/mfs_vfsops.c
index 1ac1dc8..22ca0b6 100644
--- a/sys/ufs/mfs/mfs_vfsops.c
+++ b/sys/ufs/mfs/mfs_vfsops.c
@@ -114,6 +114,7 @@ static struct vfsops mfs_vfsops = {
ffs_sync,
ffs_vget,
ffs_fhtovp,
+ ufs_check_export,
ffs_vptofh,
mfs_init,
};
diff --git a/sys/ufs/ufs/ufs_extern.h b/sys/ufs/ufs/ufs_extern.h
index ee2779d..feec939 100644
--- a/sys/ufs/ufs/ufs_extern.h
+++ b/sys/ufs/ufs/ufs_extern.h
@@ -61,9 +61,9 @@ int ufs_vnoperatespec __P((struct vop_generic_args *));
int ufs_bmap __P((struct vop_bmap_args *));
int ufs_bmaparray __P((struct vnode *, daddr_t, daddr_t *, struct indir *,
int *, int *, int *));
-int ufs_check_export __P((struct mount *, struct ufid *,
- struct sockaddr *, struct vnode **,
- int *exflagsp, struct ucred **));
+int ufs_check_export __P((struct mount *, struct sockaddr *,
+ int *, struct ucred **));
+int ufs_fhtovp(register struct mount *, struct ufid *, struct vnode **);
int ufs_checkpath __P((struct inode *, struct inode *, struct ucred *));
void ufs_dirbad __P((struct inode *, doff_t, char *));
int ufs_dirbadentry __P((struct vnode *, struct direct *, int));
diff --git a/sys/ufs/ufs/ufs_vfsops.c b/sys/ufs/ufs/ufs_vfsops.c
index f128400..22cc9cc 100644
--- a/sys/ufs/ufs/ufs_vfsops.c
+++ b/sys/ufs/ufs/ufs_vfsops.c
@@ -183,31 +183,18 @@ ufs_init(vfsp)
* This is the generic part of fhtovp called after the underlying
* filesystem has validated the file handle.
*
- * Verify that a host should have access to a filesystem, and if so
- * return a vnode for the presented file handle.
+ * Call the VFS_CHECKEXP beforehand to verify access.
*/
int
-ufs_check_export(mp, ufhp, nam, vpp, exflagsp, credanonp)
+ufs_fhtovp(mp, ufhp, vpp)
register struct mount *mp;
struct ufid *ufhp;
- struct sockaddr *nam;
struct vnode **vpp;
- int *exflagsp;
- struct ucred **credanonp;
{
register struct inode *ip;
- register struct netcred *np;
- register struct ufsmount *ump = VFSTOUFS(mp);
struct vnode *nvp;
int error;
- /*
- * Get the export permission structure for this <mp, client> tuple.
- */
- np = vfs_export_lookup(mp, &ump->um_export, nam);
- if (np == NULL)
- return (EACCES);
-
error = VFS_VGET(mp, ufhp->ufid_ino, &nvp);
if (error) {
*vpp = NULLVP;
@@ -220,6 +207,34 @@ ufs_check_export(mp, ufhp, nam, vpp, exflagsp, credanonp)
return (ESTALE);
}
*vpp = nvp;
+ return (0);
+}
+
+
+/*
+ * This is the generic part of fhtovp called after the underlying
+ * filesystem has validated the file handle.
+ *
+ * Verify that a host should have access to a filesystem.
+ */
+int
+ufs_check_export(mp, nam, exflagsp, credanonp)
+ register struct mount *mp;
+ struct sockaddr *nam;
+ int *exflagsp;
+ struct ucred **credanonp;
+{
+ register struct netcred *np;
+ register struct ufsmount *ump;;
+
+ ump = VFSTOUFS(mp);
+ /*
+ * Get the export permission structure for this <mp, client> tuple.
+ */
+ np = vfs_export_lookup(mp, &ump->um_export, nam);
+ if (np == NULL)
+ return (EACCES);
+
*exflagsp = np->netc_exflags;
*credanonp = &np->netc_anon;
return (0);
OpenPOWER on IntegriCloud