diff options
author | Thordur I. Bjornsson <thib@cvs.openbsd.org> | 2010-09-06 23:44:12 +0000 |
---|---|---|
committer | Thordur I. Bjornsson <thib@cvs.openbsd.org> | 2010-09-06 23:44:12 +0000 |
commit | 87f3d58d3064a78c9b29faa668f1d98225f01e71 (patch) | |
tree | bbc6c4fb3c1748ac72b8b1b8bab76b4e91896fd0 /sys/nfs | |
parent | a41bd31e53cce764c5bc6861ce6be4074cc59551 (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.c | 8 | ||||
-rw-r--r-- | sys/nfs/nfs_subs.c | 12 | ||||
-rw-r--r-- | sys/nfs/nfs_vnops.c | 220 |
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 |