summaryrefslogtreecommitdiff
path: root/sys/nfs
diff options
context:
space:
mode:
authorThordur I. Bjornsson <thib@cvs.openbsd.org>2010-12-21 20:14:45 +0000
committerThordur I. Bjornsson <thib@cvs.openbsd.org>2010-12-21 20:14:45 +0000
commit533610cd3b12c41762f0fbaa058c868cc1458b45 (patch)
tree866b788e63499fb184820ccec149d0e2c6d410bb /sys/nfs
parentb8f93236e139a325a6aec2b47b12ecbfab8aaf99 (diff)
Bring back the "End the VOP experiment." diff, naddy's issues where
unrelated, and his alpha is much happier now. OK deraadt@
Diffstat (limited to 'sys/nfs')
-rw-r--r--sys/nfs/nfs_node.c8
-rw-r--r--sys/nfs/nfs_subs.c12
-rw-r--r--sys/nfs/nfs_vnops.c220
3 files changed, 135 insertions, 105 deletions
diff --git a/sys/nfs/nfs_node.c b/sys/nfs/nfs_node.c
index c340d136b61..9c7efe60679 100644
--- a/sys/nfs/nfs_node.c
+++ b/sys/nfs/nfs_node.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_node.c,v 1.54 2010/09/10 16:34:09 thib Exp $ */
+/* $OpenBSD: nfs_node.c,v 1.55 2010/12/21 20:14:43 thib Exp $ */
/* $NetBSD: nfs_node.c,v 1.16 1996/02/18 11:53:42 fvdl Exp $ */
/*
@@ -60,6 +60,9 @@ extern int prtactive;
struct rwlock nfs_hashlock = RWLOCK_INITIALIZER("nfshshlk");
+/* XXX */
+extern struct vops nfs_vops;
+
/* filehandle to node lookup. */
static __inline int
nfsnode_cmp(const struct nfsnode *a, const struct nfsnode *b)
@@ -81,7 +84,6 @@ RB_GENERATE(nfs_nodetree, nfsnode, n_entry, nfsnode_cmp);
int
nfs_nget(struct mount *mnt, nfsfh_t *fh, int fhsize, struct nfsnode **npp)
{
- extern int (**nfsv2_vnodeop_p)(void *); /* XXX */
struct nfsmount *nmp;
struct nfsnode *np, find, *np2;
struct vnode *vp, *nvp;
@@ -114,7 +116,7 @@ loop:
* the lock.
*/
rw_exit_write(&nfs_hashlock);
- error = getnewvnode(VT_NFS, mnt, nfsv2_vnodeop_p, &nvp);
+ error = getnewvnode(VT_NFS, mnt, &nfs_vops, &nvp);
/* note that we don't have this vnode set up completely yet */
rw_enter_write(&nfs_hashlock);
if (error) {
diff --git a/sys/nfs/nfs_subs.c b/sys/nfs/nfs_subs.c
index 4dfa67f9b32..a97633354e5 100644
--- a/sys/nfs/nfs_subs.c
+++ b/sys/nfs/nfs_subs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_subs.c,v 1.111 2010/09/10 16:34:09 thib Exp $ */
+/* $OpenBSD: nfs_subs.c,v 1.112 2010/12/21 20:14:43 thib Exp $ */
/* $NetBSD: nfs_subs.c,v 1.27.4.3 1996/07/08 20:34:24 jtc Exp $ */
/*
@@ -940,7 +940,7 @@ nfs_loadattrcache(struct vnode **vpp, struct mbuf **mdp, caddr_t *dposp,
struct vnode *vp = *vpp;
struct vattr *vap;
struct nfs_fattr *fp;
- extern int (**spec_nfsv2nodeop_p)(void *);
+ extern struct vops nfs_specvops;
struct nfsnode *np;
int32_t t1;
caddr_t cp2;
@@ -996,12 +996,12 @@ nfs_loadattrcache(struct vnode **vpp, struct mbuf **mdp, caddr_t *dposp,
#ifndef FIFO
return (EOPNOTSUPP);
#else
- extern int (**fifo_nfsv2nodeop_p)(void *);
- vp->v_op = fifo_nfsv2nodeop_p;
+ extern struct vops nfs_fifovops;
+ vp->v_op = &nfs_fifovops;
#endif /* FIFO */
}
if (vp->v_type == VCHR || vp->v_type == VBLK) {
- vp->v_op = spec_nfsv2nodeop_p;
+ vp->v_op = &nfs_specvops;
nvp = checkalias(vp, (dev_t)rdev, vp->v_mount);
if (nvp) {
/*
@@ -1012,7 +1012,7 @@ nfs_loadattrcache(struct vnode **vpp, struct mbuf **mdp, caddr_t *dposp,
nvp->v_data = vp->v_data;
vp->v_data = NULL;
- vp->v_op = spec_vnodeop_p;
+ vp->v_op = &spec_vops;
vrele(vp);
vgone(vp);
/*
diff --git a/sys/nfs/nfs_vnops.c b/sys/nfs/nfs_vnops.c
index 866ca5c11fd..60d37c01b97 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_vnops.c,v 1.132 2010/09/10 16:34:09 thib Exp $ */
+/* $OpenBSD: nfs_vnops.c,v 1.133 2010/12/21 20:14:43 thib Exp $ */
/* $NetBSD: nfs_vnops.c,v 1.62.4.1 1996/07/08 20:26:52 jtc Exp $ */
/*
@@ -83,98 +83,129 @@
void nfs_cache_enter(struct vnode *, struct vnode *, struct componentname *);
-/*
- * Global vfs data structures for nfs
- */
-int (**nfsv2_vnodeop_p)(void *);
-struct vnodeopv_entry_desc nfsv2_vnodeop_entries[] = {
- { &vop_default_desc, eopnotsupp },
- { &vop_lookup_desc, nfs_lookup },
- { &vop_create_desc, nfs_create },
- { &vop_mknod_desc, nfs_mknod },
- { &vop_open_desc, nfs_open },
- { &vop_close_desc, nfs_close },
- { &vop_access_desc, nfs_access },
- { &vop_getattr_desc, nfs_getattr },
- { &vop_setattr_desc, nfs_setattr },
- { &vop_read_desc, nfs_read },
- { &vop_write_desc, nfs_write },
- { &vop_ioctl_desc, nfs_ioctl },
- { &vop_poll_desc, nfs_poll },
- { &vop_kqfilter_desc, nfs_kqfilter },
- { &vop_revoke_desc, vop_generic_revoke },
- { &vop_fsync_desc, nfs_fsync },
- { &vop_remove_desc, nfs_remove },
- { &vop_link_desc, nfs_link },
- { &vop_rename_desc, nfs_rename },
- { &vop_mkdir_desc, nfs_mkdir },
- { &vop_rmdir_desc, nfs_rmdir },
- { &vop_symlink_desc, nfs_symlink },
- { &vop_readdir_desc, nfs_readdir },
- { &vop_readlink_desc, nfs_readlink },
- { &vop_abortop_desc, vop_generic_abortop },
- { &vop_inactive_desc, nfs_inactive },
- { &vop_reclaim_desc, nfs_reclaim },
- { &vop_lock_desc, vop_generic_lock },
- { &vop_unlock_desc, vop_generic_unlock },
- { &vop_bmap_desc, nfs_bmap },
- { &vop_strategy_desc, nfs_strategy },
- { &vop_print_desc, nfs_print },
- { &vop_islocked_desc, vop_generic_islocked },
- { &vop_pathconf_desc, nfs_pathconf },
- { &vop_advlock_desc, nfs_advlock },
- { &vop_bwrite_desc, nfs_bwrite },
- { NULL, NULL }
+/* Global vfs data structures for nfs. */
+struct vops nfs_vops = {
+ .vop_default = eopnotsupp,
+ .vop_lookup = nfs_lookup,
+ .vop_create = nfs_create,
+ .vop_mknod = nfs_mknod,
+ .vop_open = nfs_open,
+ .vop_close = nfs_close,
+ .vop_access = nfs_access,
+ .vop_getattr = nfs_getattr,
+ .vop_setattr = nfs_setattr,
+ .vop_read = nfs_read,
+ .vop_write = nfs_write,
+ .vop_ioctl = nfs_ioctl,
+ .vop_poll = nfs_poll,
+ .vop_kqfilter = nfs_kqfilter,
+ .vop_revoke = vop_generic_revoke,
+ .vop_fsync = nfs_fsync,
+ .vop_remove = nfs_remove,
+ .vop_link = nfs_link,
+ .vop_rename = nfs_rename,
+ .vop_mkdir = nfs_mkdir,
+ .vop_rmdir = nfs_rmdir,
+ .vop_symlink = nfs_symlink,
+ .vop_readdir = nfs_readdir,
+ .vop_readlink = nfs_readlink,
+ .vop_abortop = vop_generic_abortop,
+ .vop_inactive = nfs_inactive,
+ .vop_reclaim = nfs_reclaim,
+ .vop_lock = vop_generic_lock, /* XXX: beck@ must fix this. */
+ .vop_unlock = vop_generic_unlock,
+ .vop_bmap = nfs_bmap,
+ .vop_strategy = nfs_strategy,
+ .vop_print = nfs_print,
+ .vop_islocked = vop_generic_islocked,
+ .vop_pathconf = nfs_pathconf,
+ .vop_advlock = nfs_advlock,
+ .vop_bwrite = nfs_bwrite
};
-struct vnodeopv_desc nfsv2_vnodeop_opv_desc =
- { &nfsv2_vnodeop_p, nfsv2_vnodeop_entries };
-/*
- * Special device vnode ops
- */
-int (**spec_nfsv2nodeop_p)(void *);
-struct vnodeopv_entry_desc spec_nfsv2nodeop_entries[] = {
- { &vop_default_desc, spec_vnoperate },
- { &vop_close_desc, nfsspec_close },
- { &vop_access_desc, nfsspec_access },
- { &vop_getattr_desc, nfs_getattr },
- { &vop_setattr_desc, nfs_setattr },
- { &vop_read_desc, nfsspec_read },
- { &vop_write_desc, nfsspec_write },
- { &vop_fsync_desc, nfs_fsync },
- { &vop_inactive_desc, nfs_inactive },
- { &vop_reclaim_desc, nfs_reclaim },
- { &vop_lock_desc, vop_generic_lock },
- { &vop_unlock_desc, vop_generic_unlock },
- { &vop_print_desc, nfs_print },
- { &vop_islocked_desc, vop_generic_islocked },
- { NULL, NULL }
+/* Special device vnode ops. */
+struct vops nfs_specvops = {
+ .vop_default = eopnotsupp,
+ .vop_close = nfsspec_close,
+ .vop_access = nfsspec_access,
+ .vop_getattr = nfs_getattr,
+ .vop_setattr = nfs_setattr,
+ .vop_read = nfsspec_read,
+ .vop_write = nfsspec_write,
+ .vop_fsync = nfs_fsync,
+ .vop_inactive = nfs_inactive,
+ .vop_reclaim = nfs_reclaim,
+ .vop_lock = vop_generic_lock,
+ .vop_unlock = vop_generic_unlock,
+ .vop_print = nfs_print,
+ .vop_islocked = vop_generic_islocked,
+
+ /* XXX: Keep in sync with spec_vops. */
+ .vop_lookup = vop_generic_lookup,
+ .vop_create = spec_badop,
+ .vop_mknod = spec_badop,
+ .vop_open = spec_open,
+ .vop_ioctl = spec_ioctl,
+ .vop_poll = spec_poll,
+ .vop_kqfilter = spec_kqfilter,
+ .vop_revoke = vop_generic_revoke,
+ .vop_remove = spec_badop,
+ .vop_link = spec_badop,
+ .vop_rename = spec_badop,
+ .vop_mkdir = spec_badop,
+ .vop_rmdir = spec_badop,
+ .vop_symlink = spec_badop,
+ .vop_readdir = spec_badop,
+ .vop_readlink = spec_badop,
+ .vop_abortop = spec_badop,
+ .vop_bmap = vop_generic_bmap,
+ .vop_strategy = spec_strategy,
+ .vop_pathconf = spec_pathconf,
+ .vop_advlock = spec_advlock,
+ .vop_bwrite = vop_generic_bwrite,
};
-struct vnodeopv_desc spec_nfsv2nodeop_opv_desc =
- { &spec_nfsv2nodeop_p, spec_nfsv2nodeop_entries };
#ifdef FIFO
-int (**fifo_nfsv2nodeop_p)(void *);
-struct vnodeopv_entry_desc fifo_nfsv2nodeop_entries[] = {
- { &vop_default_desc, fifo_vnoperate },
- { &vop_close_desc, nfsfifo_close },
- { &vop_access_desc, nfsspec_access },
- { &vop_getattr_desc, nfs_getattr },
- { &vop_setattr_desc, nfs_setattr },
- { &vop_read_desc, nfsfifo_read },
- { &vop_write_desc, nfsfifo_write },
- { &vop_fsync_desc, nfs_fsync },
- { &vop_inactive_desc, nfs_inactive },
- { &vop_reclaim_desc, nfsfifo_reclaim },
- { &vop_lock_desc, vop_generic_lock },
- { &vop_unlock_desc, vop_generic_unlock },
- { &vop_print_desc, nfs_print },
- { &vop_islocked_desc, vop_generic_islocked },
- { &vop_bwrite_desc, vop_generic_bwrite },
- { NULL, NULL }
+struct vops nfs_fifovops = {
+ .vop_default = eopnotsupp,
+ .vop_close = nfsfifo_close,
+ .vop_access = nfsspec_access,
+ .vop_getattr = nfs_getattr,
+ .vop_setattr = nfs_setattr,
+ .vop_read = nfsfifo_read,
+ .vop_write = nfsfifo_write,
+ .vop_fsync = nfs_fsync,
+ .vop_inactive = nfs_inactive,
+ .vop_reclaim = nfsfifo_reclaim,
+ .vop_lock = vop_generic_lock,
+ .vop_unlock = vop_generic_unlock,
+ .vop_print = nfs_print,
+ .vop_islocked = vop_generic_islocked,
+ .vop_bwrite = vop_generic_bwrite,
+
+ /* XXX: Keep in sync with fifo_vops. */
+ .vop_lookup = vop_generic_lookup,
+ .vop_create = fifo_badop,
+ .vop_mknod = fifo_badop,
+ .vop_open = fifo_open,
+ .vop_ioctl = fifo_ioctl,
+ .vop_poll = fifo_poll,
+ .vop_kqfilter = fifo_kqfilter,
+ .vop_revoke = vop_generic_revoke,
+ .vop_remove = fifo_badop,
+ .vop_link = fifo_badop,
+ .vop_rename = fifo_badop,
+ .vop_mkdir = fifo_badop,
+ .vop_rmdir = fifo_badop,
+ .vop_symlink = fifo_badop,
+ .vop_readdir = fifo_badop,
+ .vop_readlink = fifo_badop,
+ .vop_abortop = fifo_badop,
+ .vop_bmap = vop_generic_bmap,
+ .vop_strategy = fifo_badop,
+ .vop_pathconf = fifo_pathconf,
+ .vop_advlock = fifo_advlock,
};
-struct vnodeopv_desc fifo_nfsv2nodeop_opv_desc =
- { &fifo_nfsv2nodeop_p, fifo_nfsv2nodeop_entries };
#endif /* FIFO */
/*
@@ -3127,7 +3158,7 @@ nfsspec_read(void *v)
*/
np->n_flag |= NACC;
getnanotime(&np->n_atim);
- return (VOCALL(spec_vnodeop_p, VOFFSET(vop_read), ap));
+ return (spec_read(ap));
}
/*
@@ -3144,7 +3175,7 @@ nfsspec_write(void *v)
*/
np->n_flag |= NUPD;
getnanotime(&np->n_mtim);
- return (VOCALL(spec_vnodeop_p, VOFFSET(vop_write), ap));
+ return (spec_write(ap));
}
/*
@@ -3172,7 +3203,7 @@ nfsspec_close(void *v)
(void)VOP_SETATTR(vp, &vattr, ap->a_cred, ap->a_p);
}
}
- return (VOCALL(spec_vnodeop_p, VOFFSET(vop_close), ap));
+ return (spec_close(ap));
}
#ifdef FIFO
@@ -3183,7 +3214,6 @@ int
nfsfifo_read(void *v)
{
struct vop_read_args *ap = v;
- extern int (**fifo_vnodeop_p)(void *);
struct nfsnode *np = VTONFS(ap->a_vp);
/*
@@ -3191,7 +3221,7 @@ nfsfifo_read(void *v)
*/
np->n_flag |= NACC;
getnanotime(&np->n_atim);
- return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_read), ap));
+ return (fifo_read(ap));
}
/*
@@ -3201,7 +3231,6 @@ int
nfsfifo_write(void *v)
{
struct vop_write_args *ap = v;
- extern int (**fifo_vnodeop_p)(void *);
struct nfsnode *np = VTONFS(ap->a_vp);
/*
@@ -3209,7 +3238,7 @@ nfsfifo_write(void *v)
*/
np->n_flag |= NUPD;
getnanotime(&np->n_mtim);
- return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_write), ap));
+ return (fifo_write(ap));
}
/*
@@ -3224,7 +3253,6 @@ nfsfifo_close(void *v)
struct vnode *vp = ap->a_vp;
struct nfsnode *np = VTONFS(vp);
struct vattr vattr;
- extern int (**fifo_vnodeop_p)(void *);
if (np->n_flag & (NACC | NUPD)) {
if (np->n_flag & NACC) {
@@ -3244,7 +3272,7 @@ nfsfifo_close(void *v)
(void)VOP_SETATTR(vp, &vattr, ap->a_cred, ap->a_p);
}
}
- return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_close), ap));
+ return (fifo_close(ap));
}
int