Index: sys/nfsclient/nfs_vnops.c
===================================================================
--- sys/nfsclient/nfs_vnops.c	(revision 182995)
+++ sys/nfsclient/nfs_vnops.c	(working copy)
@@ -134,7 +134,6 @@
  * Global vfs data structures for nfs
  */
 struct vop_vector nfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
 	.vop_access =		nfs_access,
 	.vop_advlock =		nfs_advlock,
 	.vop_advlockasync =	nfs_advlockasync,
@@ -164,6 +163,7 @@
 	.vop_symlink =		nfs_symlink,
 	.vop_write =		nfs_write,
 };
+DECLARE_VOP_VECTOR(nfs_vnodeops);
 
 struct vop_vector nfs_fifoops = {
 	.vop_default =		&fifo_specops,
@@ -178,6 +178,7 @@
 	.vop_setattr =		nfs_setattr,
 	.vop_write =		nfsfifo_write,
 };
+DECLARE_VOP_VECTOR(nfs_fifoops);
 
 static int	nfs_mknodrpc(struct vnode *dvp, struct vnode **vpp,
 			     struct componentname *cnp, struct vattr *vap);
Index: sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c
===================================================================
--- sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c	(revision 182995)
+++ sys/gnu/fs/xfs/FreeBSD/xfs_vnops.c	(working copy)
@@ -118,7 +118,6 @@
 static vop_vptofh_t		_xfs_vptofh;
 
 struct vop_vector xfs_vnops = {
-	.vop_default =		&default_vnodeops,
 	.vop_access =		_xfs_access,
 	.vop_advlock =		_xfs_advlock,
 	.vop_bmap =		_xfs_bmap,
@@ -151,6 +150,7 @@
 	.vop_write =		_xfs_write,
 	.vop_vptofh =		_xfs_vptofh,
 };
+DECLARE_VOP_VECTOR(xfs_vnops);
 
 /*
  *  FIFO's specific operations.
Index: sys/gnu/fs/reiserfs/reiserfs_vnops.c
===================================================================
--- sys/gnu/fs/reiserfs/reiserfs_vnops.c	(revision 182995)
+++ sys/gnu/fs/reiserfs/reiserfs_vnops.c	(working copy)
@@ -20,8 +20,6 @@
 
 /* Global vfs data structures for ReiserFS */
 struct vop_vector reiserfs_vnodeops = {
-	.vop_default      = &default_vnodeops,
-
 	.vop_access       = reiserfs_access,
 	.vop_bmap         = reiserfs_bmap,
 	.vop_cachedlookup = reiserfs_lookup,
@@ -37,15 +35,15 @@
 	.vop_strategy     = reiserfs_strategy,
 	.vop_vptofh       = reiserfs_vptofh,
 };
+DECLARE_VOP_VECTOR(reiserfs_vnodeops);
 
 struct vop_vector reiserfs_specops = {
-	.vop_default  = &default_vnodeops,
-
 	.vop_access   = reiserfs_access,
 	.vop_getattr  = reiserfs_getattr,
 	.vop_inactive = reiserfs_inactive,
 	.vop_reclaim  = reiserfs_reclaim,
 };
+DECLARE_VOP_VECTOR(reiserfs_specops);
 
 /* -------------------------------------------------------------------
  * vnode operations
Index: sys/gnu/fs/ext2fs/ext2_vnops.c
===================================================================
--- sys/gnu/fs/ext2fs/ext2_vnops.c	(revision 182995)
+++ sys/gnu/fs/ext2fs/ext2_vnops.c	(working copy)
@@ -116,7 +116,6 @@
 
 /* Global vfs data structures for ext2. */
 struct vop_vector ext2_vnodeops = {
-	.vop_default =		&default_vnodeops,
 	.vop_access =		ext2_access,
 	.vop_bmap =		ext2_bmap,
 	.vop_cachedlookup =	ext2_lookup,
@@ -148,9 +147,9 @@
 	.vop_write =		ext2_write,
 	.vop_vptofh =		ext2_vptofh,
 };
+DECLARE_VOP_VECTOR(ext2_vnodeops);
 
 struct vop_vector ext2_fifoops = {
-	.vop_default =		&fifo_specops,
 	.vop_access =		ext2_access,
 	.vop_close =		ext2fifo_close,
 	.vop_fsync =		ext2_fsync,
@@ -164,6 +163,7 @@
 	.vop_write =		VOP_PANIC,
 	.vop_vptofh =		ext2_vptofh,
 };
+DECLARE_VOP_VECTOR(ext2_fifoops);
 
 #include <gnu/fs/ext2fs/ext2_readwrite.c>
 
Index: sys/ufs/ufs/ufs_vnops.c
===================================================================
--- sys/ufs/ufs/ufs_vnops.c	(revision 182995)
+++ sys/ufs/ufs/ufs_vnops.c	(working copy)
@@ -2446,7 +2446,6 @@
 
 /* Global vfs data structures for ufs. */
 struct vop_vector ufs_vnodeops = {
-	.vop_default =		&default_vnodeops,
 	.vop_fsync =		VOP_PANIC,
 	.vop_read =		VOP_PANIC,
 	.vop_reallocblks =	VOP_PANIC,
@@ -2490,6 +2489,7 @@
 	.vop_aclcheck =		ufs_aclcheck,
 #endif
 };
+DECLARE_VOP_VECTOR(ufs_vnodeops);
 
 struct vop_vector ufs_fifoops = {
 	.vop_default =		&fifo_specops,
@@ -2518,3 +2518,4 @@
 	.vop_aclcheck =		ufs_aclcheck,
 #endif
 };
+DECLARE_VOP_VECTOR(ufs_fifoops);
Index: sys/ufs/ffs/ffs_vnops.c
===================================================================
--- sys/ufs/ffs/ffs_vnops.c	(revision 182995)
+++ sys/ufs/ffs/ffs_vnops.c	(working copy)
@@ -132,6 +132,7 @@
 	.vop_write =		ffs_write,
 	.vop_vptofh =		ffs_vptofh,
 };
+DECLARE_VOP_VECTOR(ffs_vnodeops1);
 
 struct vop_vector ffs_fifoops1 = {
 	.vop_default =		&ufs_fifoops,
@@ -139,6 +140,7 @@
 	.vop_reallocblks =	ffs_reallocblks, /* XXX: really ??? */
 	.vop_vptofh =		ffs_vptofh,
 };
+DECLARE_VOP_VECTOR(ffs_fifoops1);
 
 /* Global vfs data structures for ufs. */
 struct vop_vector ffs_vnodeops2 = {
@@ -157,6 +159,7 @@
 	.vop_setextattr =	ffs_setextattr,
 	.vop_vptofh =		ffs_vptofh,
 };
+DECLARE_VOP_VECTOR(ffs_vnodeops2);
 
 struct vop_vector ffs_fifoops2 = {
 	.vop_default =		&ufs_fifoops,
@@ -172,6 +175,7 @@
 	.vop_setextattr =	ffs_setextattr,
 	.vop_vptofh =		ffs_vptofh,
 };
+DECLARE_VOP_VECTOR(ffs_fifoops2);
 
 /*
  * Synch an open file.
Index: sys/kern/uipc_mqueue.c
===================================================================
--- sys/kern/uipc_mqueue.c	(revision 182995)
+++ sys/kern/uipc_mqueue.c	(working copy)
@@ -2477,7 +2477,6 @@
 };
 
 static struct vop_vector mqfs_vnodeops = {
-	.vop_default 		= &default_vnodeops,
 	.vop_access		= mqfs_access,
 	.vop_cachedlookup	= mqfs_lookup,
 	.vop_lookup		= vfs_cache_lookup,
@@ -2495,6 +2494,7 @@
 	.vop_mkdir		= VOP_EOPNOTSUPP,
 	.vop_rmdir		= VOP_EOPNOTSUPP
 };
+DECLARE_VOP_VECTOR(mqfs_vnodeops);
 
 static struct vfsops mqfs_vfsops = {
 	.vfs_init 		= mqfs_init,
Index: sys/kern/vfs_default.c
===================================================================
--- sys/kern/vfs_default.c	(revision 182995)
+++ sys/kern/vfs_default.c	(working copy)
@@ -72,10 +72,7 @@
  *
  */
 
-struct vop_vector default_vnodeops = {
-	.vop_default =		NULL,
-	.vop_bypass =		VOP_EOPNOTSUPP,
-
+static struct vop_vector default_vnodeops = {
 	.vop_advlock =		vop_stdadvlock,
 	.vop_advlockasync =	vop_stdadvlockasync,
 	.vop_bmap =		vop_stdbmap,
@@ -102,6 +99,50 @@
 };
 
 /*
+ * A generic routine to inherit missing routines in vop_vectors from
+ * their vop_default or vop_bypass routines. This routine shall be
+ * called on all vop_vectors on startup, which means we can always
+ * assume existing routines are referenced.
+ */
+
+void
+vop_vector_init(void *arg)
+{
+	struct vop_vector *vop = arg, *dvop;
+	vop_bypass_t **vlist, **dvlist;
+	unsigned int i;
+
+	/*
+	 * Set vop->vop_default to &default_vnodeops to indicate that
+	 * the vop_vector has already been processed. This saves some
+	 * unneeded traversing of the vectors.
+	 */
+	dvop = vop->vop_default;
+	if (dvop == &default_vnodeops)
+		return;
+	vop->vop_default = &default_vnodeops;
+
+	if (dvop != NULL)
+		vop_vector_init(dvop);
+	else
+		dvop = &default_vnodeops;
+
+	vlist = _VOP_VECTOR_ARRAY(vop);
+	dvlist = _VOP_VECTOR_ARRAY(dvop);
+
+	for (i = 0; i < _VOP_VECTOR_COUNT; i++) {
+		if (vlist[i] == NULL) {
+			if (vop->vop_bypass != NULL)
+				vlist[i] = vop->vop_bypass;
+			else if (dvlist[i] != NULL)
+				vlist[i] = dvlist[i];
+			else
+				vlist[i] = VOP_EOPNOTSUPP;
+		}
+	}
+}
+
+/*
  * Series of placeholder functions for various error returns for
  * VOPs.
  */
Index: sys/kern/vfs_subr.c
===================================================================
--- sys/kern/vfs_subr.c	(revision 182995)
+++ sys/kern/vfs_subr.c	(working copy)
@@ -3262,7 +3262,6 @@
 static int	sync_reclaim(struct  vop_reclaim_args *);
 
 static struct vop_vector sync_vnodeops = {
-	.vop_bypass =	VOP_EOPNOTSUPP,
 	.vop_close =	sync_close,		/* close */
 	.vop_fsync =	sync_fsync,		/* fsync */
 	.vop_inactive =	sync_inactive,	/* inactive */
@@ -3271,6 +3270,7 @@
 	.vop_unlock =	vop_stdunlock,	/* unlock */
 	.vop_islocked =	vop_stdislocked,	/* islocked */
 };
+DECLARE_VOP_VECTOR(sync_vnodeops);
 
 /*
  * Create a new filesystem syncer vnode for the specified mount point.
Index: sys/tools/vnode_if.awk
===================================================================
--- sys/tools/vnode_if.awk	(revision 182995)
+++ sys/tools/vnode_if.awk	(working copy)
@@ -290,6 +290,10 @@
 		ctrstr = ctrstr ", a->a_" args[i];
 	ctrstr = ctrstr ");";
 
+	numvops++;
+	if (!firstvop)
+		firstvop = name;
+
 	if (pfile) {
 		printp("\t"name"_t\t*"name";")
 	}
@@ -366,17 +370,11 @@
 		printc("");
 		printc("\tVNASSERT(a->a_gen.a_desc == &" name "_desc, a->a_" args[0]",");
 		printc("\t    (\"Wrong a_desc in " name "(%p, %p)\", a->a_" args[0]", a));");
-		printc("\twhile(vop != NULL && \\");
-		printc("\t    vop->"name" == NULL && vop->vop_bypass == NULL)")
-		printc("\t\tvop = vop->vop_default;")
-		printc("\tVNASSERT(vop != NULL, a->a_" args[0]", (\"No "name"(%p, %p)\", a->a_" args[0]", a));")
+		printc("\tVNASSERT(vop->"name" != NULL, a->a_" args[0]", (\"No "name"(%p, %p)\", a->a_" args[0]", a));")
 		for (i = 0; i < numargs; ++i)
 			add_debug_code(name, args[i], "Entry", "\t");
 		add_pre(name);
-		printc("\tif (vop->"name" != NULL)")
-		printc("\t\trc = vop->"name"(a);")
-		printc("\telse")
-		printc("\t\trc = vop->vop_bypass(&a->a_gen);")
+		printc("\trc = vop->"name"(a);")
 		printc(ctrstr);
 		printc("\tif (rc == 0) {");
 		for (i = 0; i < numargs; ++i)
@@ -424,7 +422,11 @@
 }
  
 if (pfile)
-	printp("};")
+	printp("};\n" \
+	    "\n" \
+	    "#define\t_VOP_VECTOR_COUNT\t"numvops"\n" \
+	    "#define\t_VOP_VECTOR_ARRAY(vop) \\\n" \
+	    "\t(vop_bypass_t **)((void *)&(vop)->"firstvop")")
  
 if (hfile)
 	close(hfile);
Index: sys/fs/unionfs/union_vnops.c
===================================================================
--- sys/fs/unionfs/union_vnops.c	(revision 182995)
+++ sys/fs/unionfs/union_vnops.c	(working copy)
@@ -2278,8 +2278,6 @@
 }
 
 struct vop_vector unionfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		unionfs_access,
 	.vop_aclcheck =		unionfs_aclcheck,
 	.vop_advlock =		unionfs_advlock,
@@ -2326,3 +2324,4 @@
 	.vop_write =		unionfs_write,
 	.vop_vptofh =		unionfs_vptofh,
 };
+DECLARE_VOP_VECTOR(unionfs_vnodeops);
Index: sys/fs/deadfs/dead_vnops.c
===================================================================
--- sys/fs/deadfs/dead_vnops.c	(revision 182995)
+++ sys/fs/deadfs/dead_vnops.c	(working copy)
@@ -52,8 +52,6 @@
 static vop_rename_t	dead_rename;
 
 struct vop_vector dead_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		VOP_EBADF,
 	.vop_advlock =		VOP_EBADF,
 	.vop_bmap =		dead_bmap,
@@ -80,6 +78,7 @@
 	.vop_symlink =		VOP_PANIC,
 	.vop_write =		dead_write,
 };
+DECLARE_VOP_VECTOR(dead_vnodeops);
 
 /* ARGSUSED */
 static int
Index: sys/fs/pseudofs/pseudofs_vnops.c
===================================================================
--- sys/fs/pseudofs/pseudofs_vnops.c	(revision 182995)
+++ sys/fs/pseudofs/pseudofs_vnops.c	(working copy)
@@ -864,8 +864,6 @@
  * Vnode operations
  */
 struct vop_vector pfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		pfs_access,
 	.vop_cachedlookup =	pfs_lookup,
 	.vop_close =		pfs_close,
@@ -890,3 +888,4 @@
 	.vop_write =		pfs_write,
 	/* XXX I've probably forgotten a few that need VOP_EOPNOTSUPP */
 };
+DECLARE_VOP_VECTOR(pfs_vnodeops);
Index: sys/fs/tmpfs/tmpfs_fifoops.c
===================================================================
--- sys/fs/tmpfs/tmpfs_fifoops.c	(revision 182995)
+++ sys/fs/tmpfs/tmpfs_fifoops.c	(working copy)
@@ -37,6 +37,7 @@
  __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
+#include <sys/kernel.h>
 #include <sys/filedesc.h>
 #include <sys/proc.h>
 #include <sys/vnode.h>
@@ -88,7 +89,6 @@
  * vnode operations vector used for fifos stored in a tmpfs file system.
  */
 struct vop_vector tmpfs_fifoop_entries = {
-	.vop_default =			&fifo_specops,
 	.vop_close =			tmpfs_fifo_close,
 	.vop_reclaim =			tmpfs_reclaim,
 	.vop_access =			tmpfs_access,
@@ -96,4 +96,4 @@
 	.vop_setattr =			tmpfs_setattr,
 	.vop_kqfilter =			tmpfs_fifo_kqfilter,
 };
-
+DECLARE_VOP_VECTOR(tmpfs_fifoop_entries);
Index: sys/fs/tmpfs/tmpfs_vnops.c
===================================================================
--- sys/fs/tmpfs/tmpfs_vnops.c	(revision 182995)
+++ sys/fs/tmpfs/tmpfs_vnops.c	(working copy)
@@ -38,6 +38,7 @@
 
 #include <sys/param.h>
 #include <sys/fcntl.h>
+#include <sys/kernel.h>
 #include <sys/lockf.h>
 #include <sys/namei.h>
 #include <sys/priv.h>
@@ -1443,7 +1444,6 @@
  * vnode operations vector used for files stored in a tmpfs file system.
  */
 struct vop_vector tmpfs_vnodeop_entries = {
-	.vop_default =			&default_vnodeops,
 	.vop_lookup =			vfs_cache_lookup,
 	.vop_cachedlookup =		tmpfs_lookup,
 	.vop_create =			tmpfs_create,
@@ -1471,4 +1471,4 @@
 	.vop_vptofh =			tmpfs_vptofh,
 	.vop_bmap =			VOP_EOPNOTSUPP,
 };
-
+DECLARE_VOP_VECTOR(tmpfs_vnodeop_entries);
Index: sys/fs/portalfs/portal_vnops.c
===================================================================
--- sys/fs/portalfs/portal_vnops.c	(revision 182995)
+++ sys/fs/portalfs/portal_vnops.c	(working copy)
@@ -551,8 +551,6 @@
 }
 
 struct vop_vector portal_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		VOP_NULL,
 	.vop_getattr =		portal_getattr,
 	.vop_lookup =		portal_lookup,
@@ -562,3 +560,4 @@
 	.vop_reclaim =		portal_reclaim,
 	.vop_setattr =		portal_setattr,
 };
+DECLARE_VOP_VECTOR(portal_vnodeops);
Index: sys/fs/hpfs/hpfs_vnops.c
===================================================================
--- sys/fs/hpfs/hpfs_vnops.c	(revision 182995)
+++ sys/fs/hpfs/hpfs_vnops.c	(working copy)
@@ -1230,8 +1230,6 @@
  * Global vfs data structures
  */
 struct vop_vector hpfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		hpfs_access,
 	.vop_bmap =		hpfs_bmap,
 	.vop_cachedlookup =	hpfs_lookup,
@@ -1254,3 +1252,4 @@
 	.vop_write =		hpfs_write,
 	.vop_vptofh =		hpfs_vptofh,
 };
+DECLARE_VOP_VECTOR(hpfs_vnodeops);
Index: sys/fs/nullfs/null_vnops.c
===================================================================
--- sys/fs/nullfs/null_vnops.c	(revision 182995)
+++ sys/fs/nullfs/null_vnops.c	(working copy)
@@ -747,3 +747,4 @@
 	.vop_unlock =		null_unlock,
 	.vop_vptofh =		null_vptofh,
 };
+DECLARE_VOP_VECTOR(null_vnodeops);
Index: sys/fs/coda/coda_vnops.c
===================================================================
--- sys/fs/coda/coda_vnops.c	(revision 182995)
+++ sys/fs/coda/coda_vnops.c	(working copy)
@@ -110,7 +110,6 @@
  * Definition of the vnode operation vector.
  */
 struct vop_vector coda_vnodeops = {
-	.vop_default = &default_vnodeops,
 	.vop_cachedlookup = coda_lookup,	/* uncached lookup */
 	.vop_lookup = vfs_cache_lookup,		/* namecache lookup */
 	.vop_create = coda_create,		/* create */
@@ -150,6 +149,7 @@
 #endif
 
 };
+DECLARE_VOP_VECTOR(coda_vnodeops);
 
 static void	coda_print_vattr(struct vattr *attr);
 
Index: sys/fs/devfs/devfs_vnops.c
===================================================================
--- sys/fs/devfs/devfs_vnops.c	(revision 182995)
+++ sys/fs/devfs/devfs_vnops.c	(working copy)
@@ -1432,8 +1432,6 @@
 };
 
 static struct vop_vector devfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		devfs_access,
 	.vop_getattr =		devfs_getattr,
 	.vop_ioctl =		devfs_rioctl,
@@ -1452,10 +1450,9 @@
 #endif
 	.vop_symlink =		devfs_symlink,
 };
+DECLARE_VOP_VECTOR(devfs_vnodeops);
 
 static struct vop_vector devfs_specops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		devfs_access,
 	.vop_advlock =		devfs_advlock,
 	.vop_bmap =		VOP_PANIC,
@@ -1487,6 +1484,7 @@
 	.vop_symlink =		VOP_PANIC,
 	.vop_write =		VOP_PANIC,
 };
+DECLARE_VOP_VECTOR(devfs_specops);
 
 /*
  * Our calling convention to the device drivers used to be that we passed
Index: sys/fs/smbfs/smbfs_vnops.c
===================================================================
--- sys/fs/smbfs/smbfs_vnops.c	(revision 182995)
+++ sys/fs/smbfs/smbfs_vnops.c	(working copy)
@@ -86,8 +86,6 @@
 static vop_getextattr_t	smbfs_getextattr;
 
 struct vop_vector smbfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		smbfs_access,
 	.vop_advlock =		smbfs_advlock,
 	.vop_close =		smbfs_close,
@@ -118,6 +116,7 @@
 	.vop_symlink =		smbfs_symlink,
 	.vop_write =		smbfs_write,
 };
+DECLARE_VOP_VECTOR(smbfs_vnodeops);
 
 static int
 smbfs_access(ap)
Index: sys/fs/ntfs/ntfs_vnops.c
===================================================================
--- sys/fs/ntfs/ntfs_vnops.c	(revision 182995)
+++ sys/fs/ntfs/ntfs_vnops.c	(working copy)
@@ -756,8 +756,6 @@
  * Global vfs data structures
  */
 struct vop_vector ntfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		ntfs_access,
 	.vop_bmap =		ntfs_bmap,
 	.vop_cachedlookup =	ntfs_lookup,
@@ -775,3 +773,4 @@
 	.vop_write =		ntfs_write,
 	.vop_vptofh =		ntfs_vptofh,
 };
+DECLARE_VOP_VECTOR(ntfs_vnodeops);
Index: sys/fs/cd9660/cd9660_vnops.c
===================================================================
--- sys/fs/cd9660/cd9660_vnops.c	(revision 182995)
+++ sys/fs/cd9660/cd9660_vnops.c	(working copy)
@@ -827,7 +827,6 @@
  * Global vfs data structures for cd9660
  */
 struct vop_vector cd9660_vnodeops = {
-	.vop_default =		&default_vnodeops,
 	.vop_open =		cd9660_open,
 	.vop_access =		cd9660_access,
 	.vop_bmap =		cd9660_bmap,
@@ -845,6 +844,7 @@
 	.vop_strategy =		cd9660_strategy,
 	.vop_vptofh =		cd9660_vptofh,
 };
+DECLARE_VOP_VECTOR(cd9660_vnodeops);
 
 /*
  * Special device vnode ops
@@ -859,3 +859,4 @@
 	.vop_setattr =		cd9660_setattr,
 	.vop_vptofh =		cd9660_vptofh,
 };
+DECLARE_VOP_VECTOR(cd9660_fifoops);
Index: sys/fs/fifofs/fifo_vnops.c
===================================================================
--- sys/fs/fifofs/fifo_vnops.c	(revision 182995)
+++ sys/fs/fifofs/fifo_vnops.c	(working copy)
@@ -109,8 +109,6 @@
 	{ 1, NULL, filt_fifodetach_notsup, filt_fifo_notsup };
 
 struct vop_vector fifo_specops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		VOP_EBADF,
 	.vop_advlock =		fifo_advlock,
 	.vop_close =		fifo_close,
@@ -137,6 +135,7 @@
 	.vop_symlink =		VOP_PANIC,
 	.vop_write =		VOP_PANIC,
 };
+DECLARE_VOP_VECTOR(fifo_specops);
 
 struct mtx fifo_mtx;
 MTX_SYSINIT(fifo, &fifo_mtx, "fifo mutex", MTX_DEF);
Index: sys/fs/fdescfs/fdesc_vnops.c
===================================================================
--- sys/fs/fdescfs/fdesc_vnops.c	(revision 182995)
+++ sys/fs/fdescfs/fdesc_vnops.c	(working copy)
@@ -72,8 +72,6 @@
 static vop_setattr_t	fdesc_setattr;
 
 static struct vop_vector fdesc_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		VOP_NULL,
 	.vop_getattr =		fdesc_getattr,
 	.vop_lookup =		fdesc_lookup,
@@ -83,6 +81,7 @@
 	.vop_reclaim =		fdesc_reclaim,
 	.vop_setattr =		fdesc_setattr,
 };
+DECLARE_VOP_VECTOR(fdesc_vnodeops);
 
 static void fdesc_insmntque_dtr(struct vnode *, void *);
 static void fdesc_remove_entry(struct fdescnode *);
Index: sys/fs/nwfs/nwfs_vnops.c
===================================================================
--- sys/fs/nwfs/nwfs_vnops.c	(revision 182995)
+++ sys/fs/nwfs/nwfs_vnops.c	(working copy)
@@ -84,8 +84,6 @@
 
 /* Global vfs data structures for nwfs */
 struct vop_vector nwfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		nwfs_access,
 	.vop_close =		nwfs_close,
 	.vop_create =		nwfs_create,
@@ -113,6 +111,7 @@
 	.vop_symlink =		nwfs_symlink,
 	.vop_write =		nwfs_write,
 };
+DECLARE_VOP_VECTOR(nwfs_vnodeops);
 
 /*
  * nwfs_access vnode op
Index: sys/fs/msdosfs/msdosfs_vnops.c
===================================================================
--- sys/fs/msdosfs/msdosfs_vnops.c	(revision 182995)
+++ sys/fs/msdosfs/msdosfs_vnops.c	(working copy)
@@ -54,6 +54,7 @@
 #include <sys/buf.h>
 #include <sys/clock.h>
 #include <sys/dirent.h>
+#include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/lockf.h>
 #include <sys/malloc.h>
@@ -1965,8 +1966,6 @@
 
 /* Global vfs data structures for msdosfs */
 struct vop_vector msdosfs_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		msdosfs_access,
 	.vop_bmap =		msdosfs_bmap,
 	.vop_cachedlookup =	msdosfs_lookup,
@@ -1994,3 +1993,4 @@
 	.vop_write =		msdosfs_write,
 	.vop_vptofh =		msdosfs_vptofh,
 };
+DECLARE_VOP_VECTOR(msdosfs_vnodeops);
Index: sys/fs/udf/udf_vnops.c
===================================================================
--- sys/fs/udf/udf_vnops.c	(revision 182995)
+++ sys/fs/udf/udf_vnops.c	(working copy)
@@ -74,8 +74,6 @@
     daddr_t *sector, uint32_t *max_size);
 
 static struct vop_vector udf_vnodeops = {
-	.vop_default =		&default_vnodeops,
-
 	.vop_access =		udf_access,
 	.vop_bmap =		udf_bmap,
 	.vop_cachedlookup =	udf_lookup,
@@ -91,6 +89,7 @@
 	.vop_strategy =		udf_strategy,
 	.vop_vptofh =		udf_vptofh,
 };
+DECLARE_VOP_VECTOR(udf_vnodeops);
 
 MALLOC_DEFINE(M_UDFFID, "udf_fid", "UDF FileId structure");
 MALLOC_DEFINE(M_UDFDS, "udf_ds", "UDF Dirstream structure");
Index: sys/nfs4client/nfs4_vnops.c
===================================================================
--- sys/nfs4client/nfs4_vnops.c	(revision 182995)
+++ sys/nfs4client/nfs4_vnops.c	(working copy)
@@ -162,7 +162,6 @@
  * Global vfs data structures for nfs
  */
 struct vop_vector nfs4_vnodeops = {
-	.vop_default =		&default_vnodeops,
 	.vop_access =		nfs4_access,
 	.vop_advlock =		nfs4_advlock,
 	.vop_advlockasync =	nfs4_advlockasync,
@@ -192,6 +191,7 @@
 	.vop_symlink =		nfs4_symlink,
 	.vop_write =		nfs_write,
 };
+DECLARE_VOP_VECTOR(nfs4_vnodeops);
 
 static int	nfs4_removerpc(struct vnode *dvp, const char *name, int namelen,
 			      struct ucred *cred, struct thread *td);
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	(revision 182995)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c	(working copy)
@@ -3526,7 +3526,6 @@
 struct vop_vector zfs_fifoops;
 
 struct vop_vector zfs_vnodeops = {
-	.vop_default =	&default_vnodeops,
 	.vop_inactive =	zfs_freebsd_inactive,
 	.vop_reclaim =	zfs_freebsd_reclaim,
 	.vop_access =	zfs_freebsd_access,
@@ -3558,6 +3557,7 @@
 	.vop_bmap =	VOP_EOPNOTSUPP,
 	.vop_fid =	zfs_freebsd_fid,
 };
+DECLARE_VOP_VECTOR(zfs_vnodeops);
 
 struct vop_vector zfs_fifoops = {
 	.vop_default =	&fifo_specops,
@@ -3571,3 +3571,4 @@
 	.vop_write =	VOP_PANIC,
 	.vop_fid =	zfs_freebsd_fid,
 };
+DECLARE_VOP_VECTOR(zfs_fifoops);
Index: sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
===================================================================
--- sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c	(revision 182995)
+++ sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c	(working copy)
@@ -436,7 +436,6 @@
 }
 
 static struct vop_vector zfsctl_ops_root = {
-	.vop_default =	&default_vnodeops,
 	.vop_open =	zfsctl_common_open,
 	.vop_close =	zfsctl_common_close,
 	.vop_ioctl =	VOP_EINVAL,
@@ -448,6 +447,7 @@
 	.vop_reclaim =	zfsctl_common_reclaim,
 	.vop_fid =	zfsctl_common_fid,
 };
+DECLARE_VOP_VECTOR(zfsctl_ops_root);
 
 static int
 zfsctl_snapshot_zname(vnode_t *vp, const char *name, int len, char *zname)
@@ -840,7 +840,6 @@
 }
 
 static struct vop_vector zfsctl_ops_snapdir = {
-	.vop_default =	&default_vnodeops,
 	.vop_open =	zfsctl_common_open,
 	.vop_close =	zfsctl_common_close,
 	.vop_ioctl =	VOP_EINVAL,
@@ -852,6 +851,7 @@
 	.vop_reclaim =	zfsctl_common_reclaim,
 	.vop_fid =	zfsctl_common_fid,
 };
+DECLARE_VOP_VECTOR(zfsctl_ops_snapdir);
 
 static vnode_t *
 zfsctl_snapshot_mknode(vnode_t *pvp, uint64_t objset)
@@ -987,12 +987,12 @@
  * be covered.
  */
 static struct vop_vector zfsctl_ops_snapshot = {
-	.vop_default =	&default_vnodeops,
 	.vop_inactive =	zfsctl_snapshot_inactive,
 	.vop_reclaim =	zfsctl_common_reclaim,
 	.vop_getattr =	zfsctl_snapshot_getattr,
 	.vop_fid =	zfsctl_snapshot_fid,
 };
+DECLARE_VOP_VECTOR(zfsctl_ops_snapshot);
 
 int
 zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp)
Index: sys/sys/vnode.h
===================================================================
--- sys/sys/vnode.h	(revision 182995)
+++ sys/sys/vnode.h	(working copy)
@@ -718,8 +718,11 @@
 
 extern struct vop_vector fifo_specops;
 extern struct vop_vector dead_vnodeops;
-extern struct vop_vector default_vnodeops;
 
+void vop_vector_init(void *arg);
+#define	DECLARE_VOP_VECTOR(name) \
+	SYSINIT(name, SI_SUB_VFS, SI_ORDER_ANY, vop_vector_init, &name)
+
 #define VOP_PANIC	((void*)(uintptr_t)vop_panic)
 #define VOP_NULL	((void*)(uintptr_t)vop_null)
 #define VOP_EBADF	((void*)(uintptr_t)vop_ebadf)
