summaryrefslogtreecommitdiff
path: root/sys/nfs
diff options
context:
space:
mode:
authorThordur I. Bjornsson <thib@cvs.openbsd.org>2010-09-06 23:44:12 +0000
committerThordur I. Bjornsson <thib@cvs.openbsd.org>2010-09-06 23:44:12 +0000
commit87f3d58d3064a78c9b29faa668f1d98225f01e71 (patch)
treebbc6c4fb3c1748ac72b8b1b8bab76b4e91896fd0 /sys/nfs
parenta41bd31e53cce764c5bc6861ce6be4074cc59551 (diff)
End the VOP experiment. Instead of the ridicolusly complicated operation
vector setup that has questionable features (that have, as far as I can tell never been used in practice, atleast not in OpenBSD), remove all the gunk and favor a simple struct full of function pointers that get set directly by each of the filesystems. Removes gobs of ugly code and makes things simpler by a magnitude. The only downside of this is that we loose the vnoperate feature so the spec/fifo operations of the filesystems need to be kept in sync with specfs and fifofs, this is no big deal as the API it self is pretty static. Many thanks to armani@ who pulled an earlier version of this diff to current after c2k10 and Gabriel Kihlman on tech@ for testing. Liked by many. "come on, find your balls" 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 fb6501c31a3..9845914f46d 100644
--- a/sys/nfs/nfs_node.c
+++ b/sys/nfs/nfs_node.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_node.c,v 1.52 2010/08/07 03:50:02 krw Exp $ */
+/* $OpenBSD: nfs_node.c,v 1.53 2010/09/06 23:44:10 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 eea422228d7..b28f1caa2e1 100644
--- a/sys/nfs/nfs_subs.c
+++ b/sys/nfs/nfs_subs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_subs.c,v 1.108 2010/05/19 08:31:23 thib Exp $ */
+/* $OpenBSD: nfs_subs.c,v 1.109 2010/09/06 23:44:10 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 e2dde9025f0..68120717431 100644
--- a/sys/nfs/nfs_vnops.c
+++ b/sys/nfs/nfs_vnops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_vnops.c,v 1.130 2010/05/19 08:31:23 thib Exp $ */
+/* $OpenBSD: nfs_vnops.c,v 1.131 2010/09/06 23:44:10 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