changeset 3898:c788126f2a20

PSARC/2007/124 Strong Type-Checking for VFS Operation Registration Mechanism 6505923 Need better type checking for vnodeops 6531594 lxpr_readlink() is missing the "cred_t *cr" arg 6532559 vfs_strayops does not use the vnode/vfs operation registration mechanism
author rsb
date Mon, 26 Mar 2007 17:41:06 -0700
parents 278bade789ba
children 6c4b3d85ee77
files usr/src/pkgdefs/SUNWhea/prototype_com usr/src/uts/common/brand/lx/autofs/lx_autofs.c usr/src/uts/common/brand/lx/procfs/lx_prvfsops.c usr/src/uts/common/brand/lx/procfs/lx_prvnops.c usr/src/uts/common/fs/autofs/auto_vfsops.c usr/src/uts/common/fs/autofs/auto_vnops.c usr/src/uts/common/fs/cachefs/cachefs_vfsops.c usr/src/uts/common/fs/cachefs/cachefs_vnops.c usr/src/uts/common/fs/ctfs/ctfs_all.c usr/src/uts/common/fs/ctfs/ctfs_cdir.c usr/src/uts/common/fs/ctfs/ctfs_ctl.c usr/src/uts/common/fs/ctfs/ctfs_event.c usr/src/uts/common/fs/ctfs/ctfs_latest.c usr/src/uts/common/fs/ctfs/ctfs_root.c usr/src/uts/common/fs/ctfs/ctfs_sym.c usr/src/uts/common/fs/ctfs/ctfs_tdir.c usr/src/uts/common/fs/ctfs/ctfs_tmpl.c usr/src/uts/common/fs/dev/sdev_ptsops.c usr/src/uts/common/fs/dev/sdev_vfsops.c usr/src/uts/common/fs/dev/sdev_vnops.c usr/src/uts/common/fs/devfs/devfs_vfsops.c usr/src/uts/common/fs/devfs/devfs_vnops.c usr/src/uts/common/fs/doorfs/door_sys.c usr/src/uts/common/fs/doorfs/door_vnops.c usr/src/uts/common/fs/fd/fdops.c usr/src/uts/common/fs/fem.c usr/src/uts/common/fs/fifofs/fifosubr.c usr/src/uts/common/fs/fifofs/fifovnops.c usr/src/uts/common/fs/hsfs/hsfs_vfsops.c usr/src/uts/common/fs/hsfs/hsfs_vnops.c usr/src/uts/common/fs/lofs/lofs_vfsops.c usr/src/uts/common/fs/lofs/lofs_vnops.c usr/src/uts/common/fs/mntfs/mntvfsops.c usr/src/uts/common/fs/mntfs/mntvnops.c usr/src/uts/common/fs/namefs/namevfs.c usr/src/uts/common/fs/namefs/namevno.c usr/src/uts/common/fs/nfs/nfs3_vfsops.c usr/src/uts/common/fs/nfs/nfs3_vnops.c usr/src/uts/common/fs/nfs/nfs4_srv.c usr/src/uts/common/fs/nfs/nfs4_vfsops.c usr/src/uts/common/fs/nfs/nfs4_vnops.c usr/src/uts/common/fs/nfs/nfs_common.c usr/src/uts/common/fs/nfs/nfs_vfsops.c usr/src/uts/common/fs/nfs/nfs_vnops.c usr/src/uts/common/fs/objfs/objfs_data.c usr/src/uts/common/fs/objfs/objfs_odir.c usr/src/uts/common/fs/objfs/objfs_root.c usr/src/uts/common/fs/objfs/objfs_vfs.c usr/src/uts/common/fs/pcfs/pc_vfsops.c usr/src/uts/common/fs/pcfs/pc_vnops.c usr/src/uts/common/fs/portfs/port.c usr/src/uts/common/fs/portfs/port_vnops.c usr/src/uts/common/fs/proc/prvfsops.c usr/src/uts/common/fs/proc/prvnops.c usr/src/uts/common/fs/sockfs/socksctp.c usr/src/uts/common/fs/sockfs/socksctpsubr.c usr/src/uts/common/fs/sockfs/socksctpvnops.c usr/src/uts/common/fs/sockfs/socksdp.c usr/src/uts/common/fs/sockfs/socksdpsubr.c usr/src/uts/common/fs/sockfs/socksdpvnops.c usr/src/uts/common/fs/sockfs/socksubr.c usr/src/uts/common/fs/sockfs/sockvnops.c usr/src/uts/common/fs/specfs/specsubr.c usr/src/uts/common/fs/specfs/specvnops.c usr/src/uts/common/fs/swapfs/swap_subr.c usr/src/uts/common/fs/swapfs/swap_vnops.c usr/src/uts/common/fs/tmpfs/tmp_vfsops.c usr/src/uts/common/fs/tmpfs/tmp_vnops.c usr/src/uts/common/fs/udfs/udf_vfsops.c usr/src/uts/common/fs/udfs/udf_vnops.c usr/src/uts/common/fs/ufs/ufs_vfsops.c usr/src/uts/common/fs/ufs/ufs_vnops.c usr/src/uts/common/fs/vfs.c usr/src/uts/common/fs/vnode.c usr/src/uts/common/fs/zfs/zfs_ctldir.c usr/src/uts/common/fs/zfs/zfs_vfsops.c usr/src/uts/common/fs/zfs/zfs_vnops.c usr/src/uts/common/fs/zfs/zfs_znode.c usr/src/uts/common/io/physmem.c usr/src/uts/common/os/vfs_conf.c usr/src/uts/common/sys/Makefile usr/src/uts/common/sys/fem.h usr/src/uts/common/sys/fs/sdev_impl.h usr/src/uts/common/sys/gfs.h usr/src/uts/common/sys/vfs.h usr/src/uts/common/sys/vfs_opreg.h usr/src/uts/common/sys/vnode.h usr/src/uts/common/vm/page_retire.c
diffstat 88 files changed, 1757 insertions(+), 1574 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/pkgdefs/SUNWhea/prototype_com	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/pkgdefs/SUNWhea/prototype_com	Mon Mar 26 17:41:06 2007 -0700
@@ -1189,6 +1189,7 @@
 f none usr/include/sys/var.h 644 root bin
 f none usr/include/sys/varargs.h 644 root bin
 f none usr/include/sys/vfs.h 644 root bin
+f none usr/include/sys/vfs_opreg.h 644 root bin
 f none usr/include/sys/vfstab.h 644 root bin
 f none usr/include/sys/videodev2.h 644 root bin
 f none usr/include/sys/vm.h 644 root bin
--- a/usr/src/uts/common/brand/lx/autofs/lx_autofs.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/brand/lx/autofs/lx_autofs.c	Mon Mar 26 17:41:06 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -38,6 +38,7 @@
 
 #include <sys/sysmacros.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 
 #include <sys/lx_autofs_impl.h>
 
@@ -1205,10 +1206,10 @@
 }
 
 static const fs_operation_def_t lx_autofs_vfstops[] = {
-	{ VFSNAME_MOUNT, lx_autofs_mount },
-	{ VFSNAME_UNMOUNT, lx_autofs_unmount },
-	{ VFSNAME_ROOT, lx_autofs_root },
-	{ VFSNAME_STATVFS, lx_autofs_statvfs },
+	{ VFSNAME_MOUNT,	{ .vfs_mount = lx_autofs_mount } },
+	{ VFSNAME_UNMOUNT,	{ .vfs_unmount = lx_autofs_unmount } },
+	{ VFSNAME_ROOT,		{ .vfs_root = lx_autofs_root } },
+	{ VFSNAME_STATVFS,	{ .vfs_statvfs = lx_autofs_statvfs } },
 	{ NULL, NULL }
 };
 
@@ -1427,18 +1428,18 @@
  * VOP entry points definitions
  */
 static const fs_operation_def_t lx_autofs_tops_root[] = {
-	{ VOPNAME_OPEN,		lx_autofs_open },
-	{ VOPNAME_CLOSE,	lx_autofs_close },
-	{ VOPNAME_IOCTL,	lx_autofs_ioctl },
-	{ VOPNAME_RWLOCK,	lx_autofs_rwlock },
-	{ VOPNAME_RWUNLOCK,	(fs_generic_func_p)lx_autofs_rwunlock },
-	{ VOPNAME_GETATTR,	lx_autofs_getattr },
-	{ VOPNAME_ACCESS,	lx_autofs_access },
-	{ VOPNAME_READDIR,	lx_autofs_readdir },
-	{ VOPNAME_LOOKUP,	lx_autofs_lookup },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p)lx_autofs_inactive },
-	{ VOPNAME_MKDIR,	lx_autofs_mkdir },
-	{ VOPNAME_RMDIR,	lx_autofs_rmdir },
+	{ VOPNAME_OPEN,		{ .vop_open = lx_autofs_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = lx_autofs_close } },
+	{ VOPNAME_IOCTL,	{ .vop_ioctl = lx_autofs_ioctl } },
+	{ VOPNAME_RWLOCK,	{ .vop_rwlock = lx_autofs_rwlock } },
+	{ VOPNAME_RWUNLOCK,	{ .vop_rwunlock = lx_autofs_rwunlock } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = lx_autofs_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = lx_autofs_access } },
+	{ VOPNAME_READDIR,	{ .vop_readdir = lx_autofs_readdir } },
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = lx_autofs_lookup } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = lx_autofs_inactive } },
+	{ VOPNAME_MKDIR,	{ .vop_mkdir = lx_autofs_mkdir } },
+	{ VOPNAME_RMDIR,	{ .vop_rmdir = lx_autofs_rmdir } },
 	{ NULL }
 };
 
--- a/usr/src/uts/common/brand/lx/procfs/lx_prvfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/brand/lx/procfs/lx_prvfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -42,6 +42,7 @@
 #include <sys/systm.h>
 #include <sys/var.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
 #include <sys/signal.h>
@@ -134,11 +135,11 @@
 lxpr_init(int fstype, char *name)
 {
 	static const fs_operation_def_t lxpr_vfsops_template[] = {
-		VFSNAME_MOUNT, lxpr_mount,
-		VFSNAME_UNMOUNT, lxpr_unmount,
-		VFSNAME_ROOT, lxpr_root,
-		VFSNAME_STATVFS, lxpr_statvfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = lxpr_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = lxpr_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = lxpr_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = lxpr_statvfs },
+		NULL,			NULL
 	};
 	extern const fs_operation_def_t lxpr_vnodeops_template[];
 	int error;
--- a/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -58,6 +58,7 @@
 #include <sys/pset.h>
 #include <sys/zone.h>
 #include <sys/pghw.h>
+#include <sys/vfs_opreg.h>
 
 /* Dependent on the Solaris procfs */
 extern kthread_t *prchoose(proc_t *);
@@ -82,7 +83,7 @@
 static int lxpr_lookup(vnode_t *, char *, vnode_t **,
     pathname_t *, int, vnode_t *, cred_t *);
 static int lxpr_readdir(vnode_t *, uio_t *, cred_t *, int *);
-static int lxpr_readlink(vnode_t *, uio_t *);
+static int lxpr_readlink(vnode_t *, uio_t *, cred_t *);
 static int lxpr_cmp(vnode_t *, vnode_t *);
 static int lxpr_realvp(vnode_t *, vnode_t **);
 static int lxpr_sync(void);
@@ -149,20 +150,20 @@
  * The lx /proc vnode operations vector
  */
 const fs_operation_def_t lxpr_vnodeops_template[] = {
-	VOPNAME_OPEN, lxpr_open,
-	VOPNAME_CLOSE, lxpr_close,
-	VOPNAME_READ, lxpr_read,
-	VOPNAME_GETATTR, lxpr_getattr,
-	VOPNAME_ACCESS, lxpr_access,
-	VOPNAME_LOOKUP, lxpr_lookup,
-	VOPNAME_READDIR, lxpr_readdir,
-	VOPNAME_READLINK, lxpr_readlink,
-	VOPNAME_FSYNC, lxpr_sync,
-	VOPNAME_SEEK, lxpr_sync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) lxpr_inactive,
-	VOPNAME_CMP, lxpr_cmp,
-	VOPNAME_REALVP, lxpr_realvp,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = lxpr_open },
+	VOPNAME_CLOSE,		{ .vop_close = lxpr_close },
+	VOPNAME_READ,		{ .vop_read = lxpr_read },
+	VOPNAME_GETATTR,	{ .vop_getattr = lxpr_getattr },
+	VOPNAME_ACCESS,		{ .vop_access = lxpr_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = lxpr_lookup },
+	VOPNAME_READDIR,	{ .vop_readdir = lxpr_readdir },
+	VOPNAME_READLINK,	{ .vop_readlink = lxpr_readlink },
+	VOPNAME_FSYNC,		{ .error = lxpr_sync },
+	VOPNAME_SEEK,		{ .error = lxpr_sync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = lxpr_inactive },
+	VOPNAME_CMP,		{ .vop_cmp = lxpr_cmp },
+	VOPNAME_REALVP,		{ .vop_realvp = lxpr_realvp },
+	NULL,			NULL
 };
 
 
@@ -2829,8 +2830,9 @@
 /*
  * lxpr_readlink(): Vnode operation for VOP_READLINK()
  */
+/* ARGSUSED */
 static int
-lxpr_readlink(vnode_t *vp, uio_t *uiop)
+lxpr_readlink(vnode_t *vp, uio_t *uiop, cred_t *cr)
 {
 	char bp[MAXPATHLEN + 1];
 	size_t buflen = sizeof (bp);
--- a/usr/src/uts/common/fs/autofs/auto_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/autofs/auto_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -30,6 +30,7 @@
 #include <sys/proc.h>
 #include <sys/disp.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/uio.h>
 #include <sys/kmem.h>
@@ -250,11 +251,11 @@
 autofs_init(int fstype, char *name)
 {
 	static const fs_operation_def_t auto_vfsops_template[] = {
-		VFSNAME_MOUNT, auto_mount,
-		VFSNAME_UNMOUNT, auto_unmount,
-		VFSNAME_ROOT, auto_root,
-		VFSNAME_STATVFS, auto_statvfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = auto_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = auto_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = auto_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = auto_statvfs },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/autofs/auto_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/autofs/auto_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -31,6 +31,7 @@
 #include <sys/proc.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/uio.h>
 #include <sys/cred.h>
 #include <sys/pathname.h>
@@ -81,30 +82,30 @@
 vnodeops_t *auto_vnodeops;
 
 const fs_operation_def_t auto_vnodeops_template[] = {
-	VOPNAME_OPEN, auto_open,
-	VOPNAME_CLOSE, auto_close,
-	VOPNAME_GETATTR, auto_getattr,
-	VOPNAME_SETATTR, auto_setattr,
-	VOPNAME_ACCESS, auto_access,
-	VOPNAME_LOOKUP, auto_lookup,
-	VOPNAME_CREATE, auto_create,
-	VOPNAME_REMOVE, auto_remove,
-	VOPNAME_LINK, auto_link,
-	VOPNAME_RENAME, auto_rename,
-	VOPNAME_MKDIR, auto_mkdir,
-	VOPNAME_RMDIR, auto_rmdir,
-	VOPNAME_READDIR, auto_readdir,
-	VOPNAME_SYMLINK, auto_symlink,
-	VOPNAME_READLINK, auto_readlink,
-	VOPNAME_FSYNC, auto_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) auto_inactive,
-	VOPNAME_RWLOCK, auto_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) auto_rwunlock,
-	VOPNAME_SEEK, auto_seek,
-	VOPNAME_FRLOCK, fs_error,
-	VOPNAME_DISPOSE, fs_error,
-	VOPNAME_SHRLOCK, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = auto_open },
+	VOPNAME_CLOSE,		{ .vop_close = auto_close },
+	VOPNAME_GETATTR,	{ .vop_getattr = auto_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = auto_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = auto_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = auto_lookup },
+	VOPNAME_CREATE,		{ .vop_create = auto_create },
+	VOPNAME_REMOVE,		{ .vop_remove = auto_remove },
+	VOPNAME_LINK,		{ .vop_link = auto_link },
+	VOPNAME_RENAME,		{ .vop_rename = auto_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = auto_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = auto_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = auto_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = auto_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = auto_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = auto_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = auto_inactive },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = auto_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = auto_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = auto_seek },
+	VOPNAME_FRLOCK,		{ .error = fs_error },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	VOPNAME_SHRLOCK,	{ .error = fs_error },
+	NULL,			NULL
 };
 
 
--- a/usr/src/uts/common/fs/cachefs/cachefs_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/cachefs/cachefs_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -33,6 +32,7 @@
 #include <sys/proc.h>
 #include <sys/user.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/pathname.h>
 #include <sys/uio.h>
@@ -98,12 +98,12 @@
 cachefs_init_vfsops(int fstype)
 {
 	static const fs_operation_def_t cachefs_vfsops_template[] = {
-		VFSNAME_MOUNT, cachefs_mount,
-		VFSNAME_UNMOUNT, cachefs_unmount,
-		VFSNAME_ROOT, cachefs_root,
-		VFSNAME_STATVFS, cachefs_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) cachefs_sync,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = cachefs_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = cachefs_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = cachefs_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = cachefs_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = cachefs_sync },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/cachefs/cachefs_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/cachefs/cachefs_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -35,6 +34,7 @@
 #include <sys/time.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/file.h>
 #include <sys/filio.h>
 #include <sys/uio.h>
@@ -246,45 +246,45 @@
 struct vnodeops *cachefs_vnodeops;
 
 static const fs_operation_def_t cachefs_vnodeops_template[] = {
-	VOPNAME_OPEN, cachefs_open,
-	VOPNAME_CLOSE, cachefs_close,
-	VOPNAME_READ, cachefs_read,
-	VOPNAME_WRITE, cachefs_write,
-	VOPNAME_IOCTL, cachefs_ioctl,
-	VOPNAME_GETATTR, cachefs_getattr,
-	VOPNAME_SETATTR, cachefs_setattr,
-	VOPNAME_ACCESS, cachefs_access,
-	VOPNAME_LOOKUP, cachefs_lookup,
-	VOPNAME_CREATE, cachefs_create,
-	VOPNAME_REMOVE, cachefs_remove,
-	VOPNAME_LINK, cachefs_link,
-	VOPNAME_RENAME, cachefs_rename,
-	VOPNAME_MKDIR, cachefs_mkdir,
-	VOPNAME_RMDIR, cachefs_rmdir,
-	VOPNAME_READDIR, cachefs_readdir,
-	VOPNAME_SYMLINK, cachefs_symlink,
-	VOPNAME_READLINK, cachefs_readlink,
-	VOPNAME_FSYNC, cachefs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) cachefs_inactive,
-	VOPNAME_FID, cachefs_fid,
-	VOPNAME_RWLOCK, cachefs_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) cachefs_rwunlock,
-	VOPNAME_SEEK, cachefs_seek,
-	VOPNAME_FRLOCK, cachefs_frlock,
-	VOPNAME_SPACE, cachefs_space,
-	VOPNAME_REALVP, cachefs_realvp,
-	VOPNAME_GETPAGE, cachefs_getpage,
-	VOPNAME_PUTPAGE, cachefs_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) cachefs_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) cachefs_addmap,
-	VOPNAME_DELMAP, cachefs_delmap,
-	VOPNAME_DUMP, cachefs_dump,
-	VOPNAME_PATHCONF, cachefs_pathconf,
-	VOPNAME_PAGEIO, cachefs_pageio,
-	VOPNAME_SETSECATTR, cachefs_setsecattr,
-	VOPNAME_GETSECATTR, cachefs_getsecattr,
-	VOPNAME_SHRLOCK, cachefs_shrlock,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = cachefs_open },
+	VOPNAME_CLOSE,		{ .vop_close = cachefs_close },
+	VOPNAME_READ,		{ .vop_read = cachefs_read },
+	VOPNAME_WRITE,		{ .vop_write = cachefs_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = cachefs_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = cachefs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = cachefs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = cachefs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = cachefs_lookup },
+	VOPNAME_CREATE,		{ .vop_create = cachefs_create },
+	VOPNAME_REMOVE,		{ .vop_remove = cachefs_remove },
+	VOPNAME_LINK,		{ .vop_link = cachefs_link },
+	VOPNAME_RENAME,		{ .vop_rename = cachefs_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = cachefs_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = cachefs_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = cachefs_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = cachefs_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = cachefs_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = cachefs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = cachefs_inactive },
+	VOPNAME_FID,		{ .vop_fid = cachefs_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = cachefs_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = cachefs_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = cachefs_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = cachefs_frlock },
+	VOPNAME_SPACE,		{ .vop_space = cachefs_space },
+	VOPNAME_REALVP,		{ .vop_realvp = cachefs_realvp },
+	VOPNAME_GETPAGE,	{ .vop_getpage = cachefs_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = cachefs_putpage },
+	VOPNAME_MAP,		{ .vop_map = cachefs_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = cachefs_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = cachefs_delmap },
+	VOPNAME_DUMP,		{ .vop_dump = cachefs_dump },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = cachefs_pathconf },
+	VOPNAME_PAGEIO,		{ .vop_pageio = cachefs_pageio },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = cachefs_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = cachefs_getsecattr },
+	VOPNAME_SHRLOCK,	{ .vop_shrlock = cachefs_shrlock },
+	NULL,			NULL
 };
 
 /* forward declarations of statics */
--- a/usr/src/uts/common/fs/ctfs/ctfs_all.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_all.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -135,14 +135,14 @@
 }
 
 const fs_operation_def_t ctfs_tops_adir[] = {
-	{ VOPNAME_OPEN,		ctfs_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	ctfs_adir_getattr },
-	{ VOPNAME_ACCESS,	ctfs_access_dir },
-	{ VOPNAME_READDIR,	gfs_vop_readdir },
-	{ VOPNAME_LOOKUP,	gfs_vop_lookup },
-	{ VOPNAME_SEEK,		fs_seek },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_adir_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_dir } },
+	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir } },
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = gfs_vop_lookup } },
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_cdir.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_cdir.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -149,14 +149,14 @@
 
 
 const fs_operation_def_t ctfs_tops_cdir[] = {
-	{ VOPNAME_OPEN,		ctfs_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	ctfs_cdir_getattr },
-	{ VOPNAME_ACCESS,	ctfs_access_dir },
-	{ VOPNAME_READDIR,	gfs_vop_readdir },
-	{ VOPNAME_LOOKUP,	gfs_vop_lookup },
-	{ VOPNAME_SEEK,		fs_seek },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) ctfs_cdir_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_cdir_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_dir } },
+	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir } },
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = gfs_vop_lookup } },
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = ctfs_cdir_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_ctl.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_ctl.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -183,14 +183,14 @@
 }
 
 const fs_operation_def_t ctfs_tops_ctl[] = {
-	{ VOPNAME_OPEN,		ctfs_ctl_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	ctfs_ctl_ioctl },
-	{ VOPNAME_GETATTR,	ctfs_ctl_getattr },
-	{ VOPNAME_ACCESS,	ctfs_ctl_access },
-	{ VOPNAME_READDIR,	fs_notdir },
-	{ VOPNAME_LOOKUP,	fs_notdir },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_ctl_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .vop_ioctl = ctfs_ctl_ioctl } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_ctl_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_ctl_access } },
+	{ VOPNAME_READDIR,	{ .error = fs_notdir } },
+	{ VOPNAME_LOOKUP,	{ .error = fs_notdir } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL, NULL }
 };
 
@@ -276,13 +276,13 @@
 }
 
 const fs_operation_def_t ctfs_tops_stat[] = {
-	{ VOPNAME_OPEN,		ctfs_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	ctfs_stat_ioctl },
-	{ VOPNAME_GETATTR,	ctfs_ctl_getattr },
-	{ VOPNAME_ACCESS,	ctfs_access_readonly },
-	{ VOPNAME_READDIR,	fs_notdir },
-	{ VOPNAME_LOOKUP,	fs_notdir },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .vop_ioctl = ctfs_stat_ioctl } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_ctl_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_readonly } },
+	{ VOPNAME_READDIR,	{ .error = fs_notdir } },
+	{ VOPNAME_LOOKUP,	{ .error = fs_notdir } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_event.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_event.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -304,15 +304,15 @@
 }
 
 const fs_operation_def_t ctfs_tops_event[] = {
-	{ VOPNAME_OPEN,		ctfs_ev_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	ctfs_ev_ioctl },
-	{ VOPNAME_GETATTR,	ctfs_ev_getattr },
-	{ VOPNAME_ACCESS,	ctfs_ev_access },
-	{ VOPNAME_READDIR,	fs_notdir },
-	{ VOPNAME_LOOKUP,	fs_notdir },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) ctfs_ev_inactive },
-	{ VOPNAME_POLL,		(fs_generic_func_p) ctfs_ev_poll },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_ev_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .vop_ioctl = ctfs_ev_ioctl } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_ev_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_ev_access } },
+	{ VOPNAME_READDIR,	{ .error = fs_notdir } },
+	{ VOPNAME_LOOKUP,	{ .error = fs_notdir } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = ctfs_ev_inactive } },
+	{ VOPNAME_POLL,		{ .vop_poll = ctfs_ev_poll } },
 	{ NULL, NULL }
 };
 
@@ -447,14 +447,14 @@
 }
 
 const fs_operation_def_t ctfs_tops_bundle[] = {
-	{ VOPNAME_OPEN,		ctfs_bu_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	ctfs_bu_ioctl },
-	{ VOPNAME_GETATTR,	ctfs_bu_getattr },
-	{ VOPNAME_ACCESS,	ctfs_access_readonly },
-	{ VOPNAME_READDIR,	fs_notdir },
-	{ VOPNAME_LOOKUP,	fs_notdir },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) ctfs_bu_inactive },
-	{ VOPNAME_POLL,		(fs_generic_func_p) ctfs_bu_poll },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_bu_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .vop_ioctl = ctfs_bu_ioctl } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_bu_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_readonly } },
+	{ VOPNAME_READDIR,	{ .error = fs_notdir } },
+	{ VOPNAME_LOOKUP,	{ .error = fs_notdir } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = ctfs_bu_inactive } },
+	{ VOPNAME_POLL,		{ .vop_poll = ctfs_bu_poll } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_latest.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_latest.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -162,13 +162,13 @@
 }
 
 const fs_operation_def_t ctfs_tops_latest[] = {
-	{ VOPNAME_OPEN,		ctfs_latest_open },
-	{ VOPNAME_CLOSE,	fs_inval },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	ctfs_latest_getattr },
-	{ VOPNAME_ACCESS,	ctfs_latest_access },
-	{ VOPNAME_READDIR,	fs_notdir },
-	{ VOPNAME_LOOKUP,	fs_notdir },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_latest_open } },
+	{ VOPNAME_CLOSE,	{ .error = fs_inval } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_latest_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_latest_access } },
+	{ VOPNAME_READDIR,	{ .error = fs_notdir } },
+	{ VOPNAME_LOOKUP,	{ .error = fs_notdir } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_root.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_root.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -32,6 +31,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -364,10 +364,10 @@
 }
 
 static const fs_operation_def_t ctfs_vfstops[] = {
-	{ VFSNAME_MOUNT, ctfs_mount },
-	{ VFSNAME_UNMOUNT, ctfs_unmount },
-	{ VFSNAME_ROOT, ctfs_root },
-	{ VFSNAME_STATVFS, ctfs_statvfs },
+	{ VFSNAME_MOUNT,	{ .vfs_mount = ctfs_mount } },
+	{ VFSNAME_UNMOUNT,	{ .vfs_unmount = ctfs_unmount } },
+	{ VFSNAME_ROOT,		{ .vfs_root = ctfs_root } },
+	{ VFSNAME_STATVFS,	{ .vfs_statvfs = ctfs_statvfs } },
 	{ NULL, NULL }
 };
 
@@ -485,14 +485,14 @@
 }
 
 static const fs_operation_def_t ctfs_tops_root[] = {
-	{ VOPNAME_OPEN,		ctfs_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	ctfs_root_getattr },
-	{ VOPNAME_ACCESS,	ctfs_access_dir },
-	{ VOPNAME_READDIR,	gfs_vop_readdir },
-	{ VOPNAME_LOOKUP,	gfs_vop_lookup },
-	{ VOPNAME_SEEK,		fs_seek },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_root_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_dir } },
+	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir } },
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = gfs_vop_lookup } },
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_sym.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_sym.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -129,14 +129,14 @@
 }
 
 const fs_operation_def_t ctfs_tops_sym[] = {
-	{ VOPNAME_OPEN,		ctfs_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	ctfs_sym_getattr },
-	{ VOPNAME_READLINK,	ctfs_sym_readlink },
-	{ VOPNAME_ACCESS,	ctfs_access_readonly },
-	{ VOPNAME_READDIR,	fs_notdir },
-	{ VOPNAME_LOOKUP,	fs_notdir },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) ctfs_sym_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_sym_getattr } },
+	{ VOPNAME_READLINK,	{ .vop_readlink = ctfs_sym_readlink } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_readonly } },
+	{ VOPNAME_READDIR,	{ .error = fs_notdir } },
+	{ VOPNAME_LOOKUP,	{ .error = fs_notdir } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = ctfs_sym_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_tdir.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_tdir.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -146,14 +146,14 @@
 }
 
 const fs_operation_def_t ctfs_tops_tdir[] = {
-	{ VOPNAME_OPEN,		ctfs_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	ctfs_tdir_getattr },
-	{ VOPNAME_ACCESS,	ctfs_access_dir },
-	{ VOPNAME_READDIR,	gfs_vop_readdir },
-	{ VOPNAME_LOOKUP,	gfs_vop_lookup },
-	{ VOPNAME_SEEK,		fs_seek },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_tdir_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_dir } },
+	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir } },
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = gfs_vop_lookup } },
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/ctfs/ctfs_tmpl.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ctfs/ctfs_tmpl.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/systm.h>
@@ -164,13 +164,13 @@
 }
 
 const fs_operation_def_t ctfs_tops_tmpl[] = {
-	{ VOPNAME_OPEN,		ctfs_tmpl_open },
-	{ VOPNAME_CLOSE,	ctfs_close },
-	{ VOPNAME_IOCTL,	ctfs_tmpl_ioctl },
-	{ VOPNAME_GETATTR,	ctfs_tmpl_getattr },
-	{ VOPNAME_ACCESS,	ctfs_access_readwrite },
-	{ VOPNAME_READDIR,	fs_notdir },
-	{ VOPNAME_LOOKUP,	fs_notdir },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) ctfs_tmpl_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = ctfs_tmpl_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = ctfs_close } },
+	{ VOPNAME_IOCTL,	{ .vop_ioctl = ctfs_tmpl_ioctl } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = ctfs_tmpl_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = ctfs_access_readwrite } },
+	{ VOPNAME_READDIR,	{ .error = fs_notdir } },
+	{ VOPNAME_LOOKUP,	{ .error = fs_notdir } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = ctfs_tmpl_inactive } },
 	{ NULL, NULL }
 };
--- a/usr/src/uts/common/fs/dev/sdev_ptsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/dev/sdev_ptsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -42,6 +42,7 @@
 #include <sys/policy.h>
 #include <sys/ptms.h>
 #include <sys/stat.h>
+#include <sys/vfs_opreg.h>
 
 #define	DEVPTS_UID_DEFAULT	0
 #define	DEVPTS_GID_DEFAULT	3
@@ -408,14 +409,14 @@
  * avoid persisting permissions.
  */
 const fs_operation_def_t devpts_vnodeops_tbl[] = {
-	VOPNAME_READDIR, devpts_readdir,
-	VOPNAME_LOOKUP, devpts_lookup,
-	VOPNAME_CREATE, devpts_create,
-	VOPNAME_SETATTR, devpts_setattr,
-	VOPNAME_REMOVE, fs_nosys,
-	VOPNAME_MKDIR, fs_nosys,
-	VOPNAME_RMDIR, fs_nosys,
-	VOPNAME_SYMLINK, fs_nosys,
-	VOPNAME_SETSECATTR, fs_nosys,
-	NULL, NULL
+	VOPNAME_READDIR,	{ .vop_readdir = devpts_readdir },
+	VOPNAME_LOOKUP,		{ .vop_lookup = devpts_lookup },
+	VOPNAME_CREATE,		{ .vop_create = devpts_create },
+	VOPNAME_SETATTR,	{ .vop_setattr = devpts_setattr },
+	VOPNAME_REMOVE,		{ .error = fs_nosys },
+	VOPNAME_MKDIR,		{ .error = fs_nosys },
+	VOPNAME_RMDIR,		{ .error = fs_nosys },
+	VOPNAME_SYMLINK,	{ .error = fs_nosys },
+	VOPNAME_SETSECATTR,	{ .error = fs_nosys },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/dev/sdev_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/dev/sdev_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -37,6 +37,7 @@
 #include <sys/time.h>
 #include <sys/pathname.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/file.h>
 #include <sys/stat.h>
@@ -144,11 +145,11 @@
 devinit(int fstype, char *name)
 {
 	static const fs_operation_def_t dev_vfsops_tbl[] = {
-		VFSNAME_MOUNT, sdev_mount,	/* mount file system */
-		VFSNAME_UNMOUNT, sdev_unmount,	/* unmount file system */
-		VFSNAME_ROOT, sdev_root,	/* get root vnode */
-		VFSNAME_STATVFS, sdev_statvfs,	/* get file system statistics */
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = sdev_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = sdev_unmount },
+		VFSNAME_ROOT, 		{ .vfs_root = sdev_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = sdev_statvfs },
+		NULL,			NULL
 	};
 
 	int	error;
--- a/usr/src/uts/common/fs/dev/sdev_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/dev/sdev_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -44,6 +44,7 @@
 #include <sys/time.h>
 #include <sys/vfs.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/file.h>
 #include <sys/fcntl.h>
 #include <sys/flock.h>
@@ -1347,34 +1348,34 @@
 vnodeops_t *sdev_vnodeops;
 
 const fs_operation_def_t sdev_vnodeops_tbl[] = {
-	VOPNAME_OPEN, sdev_open,
-	VOPNAME_CLOSE, sdev_close,
-	VOPNAME_READ, sdev_read,
-	VOPNAME_WRITE, sdev_write,
-	VOPNAME_IOCTL, sdev_ioctl,
-	VOPNAME_GETATTR, sdev_getattr,
-	VOPNAME_SETATTR, sdev_setattr,
-	VOPNAME_ACCESS, sdev_access,
-	VOPNAME_LOOKUP, sdev_lookup,
-	VOPNAME_CREATE, sdev_create,
-	VOPNAME_RENAME, sdev_rename,
-	VOPNAME_REMOVE, sdev_remove,
-	VOPNAME_MKDIR, sdev_mkdir,
-	VOPNAME_RMDIR, sdev_rmdir,
-	VOPNAME_READDIR, sdev_readdir,
-	VOPNAME_SYMLINK, sdev_symlink,
-	VOPNAME_READLINK, sdev_readlink, /* readlink */
-	VOPNAME_INACTIVE, (fs_generic_func_p)sdev_inactive,
-	VOPNAME_FID, sdev_fid,
-	VOPNAME_RWLOCK, (fs_generic_func_p)sdev_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p)sdev_rwunlock,
-	VOPNAME_SEEK, sdev_seek,
-	VOPNAME_FRLOCK, sdev_frlock,
-	VOPNAME_PATHCONF, sdev_pathconf,
-	VOPNAME_SETFL, sdev_setfl,
-	VOPNAME_SETSECATTR, sdev_setsecattr,	/* setsecattr */
-	VOPNAME_GETSECATTR, sdev_getsecattr,	/* getsecattr */
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = sdev_open },
+	VOPNAME_CLOSE,		{ .vop_close = sdev_close },
+	VOPNAME_READ,		{ .vop_read = sdev_read },
+	VOPNAME_WRITE,		{ .vop_write = sdev_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = sdev_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = sdev_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = sdev_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = sdev_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = sdev_lookup },
+	VOPNAME_CREATE,		{ .vop_create = sdev_create },
+	VOPNAME_RENAME,		{ .vop_rename = sdev_rename },
+	VOPNAME_REMOVE,		{ .vop_remove = sdev_remove },
+	VOPNAME_MKDIR,		{ .vop_mkdir = sdev_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = sdev_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = sdev_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = sdev_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = sdev_readlink },
+	VOPNAME_INACTIVE,	{ .vop_inactive = sdev_inactive },
+	VOPNAME_FID,		{ .vop_fid = sdev_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = sdev_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = sdev_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = sdev_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = sdev_frlock },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = sdev_pathconf },
+	VOPNAME_SETFL,		{ .vop_setfl = sdev_setfl },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = sdev_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = sdev_getsecattr },
+	NULL,			NULL
 };
 
 int sdev_vnodeops_tbl_size = sizeof (sdev_vnodeops_tbl);
--- a/usr/src/uts/common/fs/devfs/devfs_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/devfs/devfs_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -42,6 +42,7 @@
 #include <sys/time.h>
 #include <sys/pathname.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/stat.h>
 #include <sys/uio.h>
@@ -129,13 +130,13 @@
 devfsinit(int fstype, char *name)
 {
 	static const fs_operation_def_t devfs_vfsops_template[] = {
-		VFSNAME_MOUNT, devfs_mount,
-		VFSNAME_UNMOUNT, devfs_unmount,
-		VFSNAME_ROOT, devfs_root,
-		VFSNAME_STATVFS, devfs_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) fs_sync,
-		VFSNAME_MOUNTROOT, devfs_mountroot,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = devfs_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = devfs_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = devfs_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = devfs_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = fs_sync },
+		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = devfs_mountroot },
+		NULL,			NULL
 	};
 	int error;
 	int dev;
--- a/usr/src/uts/common/fs/devfs/devfs_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/devfs/devfs_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -44,6 +44,7 @@
 #include <sys/time.h>
 #include <sys/vfs.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/file.h>
 #include <sys/fcntl.h>
 #include <sys/flock.h>
@@ -1104,26 +1105,26 @@
 vnodeops_t *dv_vnodeops;
 
 const fs_operation_def_t dv_vnodeops_template[] = {
-	VOPNAME_OPEN, devfs_open,
-	VOPNAME_CLOSE, devfs_close,
-	VOPNAME_READ, devfs_read,
-	VOPNAME_WRITE, devfs_write,
-	VOPNAME_IOCTL, devfs_ioctl,
-	VOPNAME_GETATTR, devfs_getattr,
-	VOPNAME_SETATTR, devfs_setattr,
-	VOPNAME_ACCESS, devfs_access,
-	VOPNAME_LOOKUP, devfs_lookup,
-	VOPNAME_CREATE, devfs_create,
-	VOPNAME_READDIR, devfs_readdir,
-	VOPNAME_FSYNC, devfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) devfs_inactive,
-	VOPNAME_FID, devfs_fid,
-	VOPNAME_RWLOCK, devfs_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) devfs_rwunlock,
-	VOPNAME_SEEK, devfs_seek,
-	VOPNAME_PATHCONF, devfs_pathconf,
-	VOPNAME_DISPOSE, fs_error,
-	VOPNAME_SETSECATTR, devfs_setsecattr,
-	VOPNAME_GETSECATTR, devfs_getsecattr,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = devfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = devfs_close },
+	VOPNAME_READ,		{ .vop_read = devfs_read },
+	VOPNAME_WRITE,		{ .vop_write = devfs_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = devfs_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = devfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = devfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = devfs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = devfs_lookup },
+	VOPNAME_CREATE,		{ .vop_create = devfs_create },
+	VOPNAME_READDIR,	{ .vop_readdir = devfs_readdir },
+	VOPNAME_FSYNC,		{ .vop_fsync = devfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = devfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = devfs_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = devfs_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = devfs_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = devfs_seek },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = devfs_pathconf },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = devfs_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = devfs_getsecattr },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/doorfs/door_sys.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/doorfs/door_sys.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -21,7 +20,7 @@
  */
 
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -48,6 +47,7 @@
 #include <sys/fcntl.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/sobject.h>
 #include <sys/schedctl.h>
 #include <sys/callb.h>
--- a/usr/src/uts/common/fs/doorfs/door_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/doorfs/door_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -27,6 +27,7 @@
 
 #include <sys/types.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/door.h>
 #include <sys/proc.h>
 #include <sys/kmem.h>
@@ -52,19 +53,19 @@
 struct vnodeops *door_vnodeops;
 
 const fs_operation_def_t door_vnodeops_template[] = {
-	VOPNAME_OPEN, door_open,
-	VOPNAME_CLOSE, door_close,
-	VOPNAME_GETATTR, door_getattr,
-	VOPNAME_ACCESS, door_access,
-	VOPNAME_INACTIVE, (fs_generic_func_p) door_inactive,
-	VOPNAME_FRLOCK, fs_error,
-	VOPNAME_REALVP, door_realvp,
-	VOPNAME_POLL, fs_error,
-	VOPNAME_PATHCONF, fs_error,
-	VOPNAME_DISPOSE, fs_error,
-	VOPNAME_GETSECATTR, fs_error,
-	VOPNAME_SHRLOCK, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = door_open },
+	VOPNAME_CLOSE,		{ .vop_close = door_close },
+	VOPNAME_GETATTR,	{ .vop_getattr = door_getattr },
+	VOPNAME_ACCESS,		{ .vop_access = door_access },
+	VOPNAME_INACTIVE,	{ .vop_inactive = door_inactive },
+	VOPNAME_FRLOCK,		{ .error = fs_error },
+	VOPNAME_REALVP,		{ .vop_realvp = door_realvp },
+	VOPNAME_POLL,		{ .error = fs_error },
+	VOPNAME_PATHCONF,	{ .error = fs_error },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	VOPNAME_GETSECATTR,	{ .error = fs_error },
+	VOPNAME_SHRLOCK,	{ .error = fs_error },
+	NULL,			NULL
 };
 
 /* ARGSUSED */
--- a/usr/src/uts/common/fs/fd/fdops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/fd/fdops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -47,6 +46,7 @@
 #include <sys/systm.h>
 #include <sys/uio.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/cred.h>
 #include <sys/mntent.h>
@@ -316,19 +316,19 @@
 static struct vnodeops *fd_vnodeops;
 
 static const fs_operation_def_t fd_vnodeops_template[] = {
-	VOPNAME_OPEN, fdopen,
-	VOPNAME_CLOSE, fdclose,
-	VOPNAME_READ, fdread,
-	VOPNAME_GETATTR, fdgetattr,
-	VOPNAME_ACCESS, fdaccess,
-	VOPNAME_LOOKUP, fdlookup,
-	VOPNAME_CREATE, fdcreate,
-	VOPNAME_READDIR, fdreaddir,
-	VOPNAME_INACTIVE, (fs_generic_func_p) fdinactive,
-	VOPNAME_FRLOCK, fs_error,
-	VOPNAME_POLL, fs_error,
-	VOPNAME_DISPOSE, fs_error, /* XXX - used to be default action instead */
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = fdopen },
+	VOPNAME_CLOSE,		{ .vop_close = fdclose },
+	VOPNAME_READ,		{ .vop_read = fdread },
+	VOPNAME_GETATTR,	{ .vop_getattr = fdgetattr },
+	VOPNAME_ACCESS,		{ .vop_access = fdaccess },
+	VOPNAME_LOOKUP,		{ .vop_lookup = fdlookup },
+	VOPNAME_CREATE,		{ .vop_create = fdcreate },
+	VOPNAME_READDIR,	{ .vop_readdir = fdreaddir },
+	VOPNAME_INACTIVE,	{ .vop_inactive = fdinactive },
+	VOPNAME_FRLOCK,		{ .error = fs_error },
+	VOPNAME_POLL,		{ .error = fs_error },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	NULL,			NULL
 };
 
 static int
@@ -477,11 +477,11 @@
 fdinit(int fstype, char *name)
 {
 	static const fs_operation_def_t fd_vfsops_template[] = {
-		VFSNAME_MOUNT, fdmount,
-		VFSNAME_UNMOUNT, fdunmount,
-		VFSNAME_ROOT, fdroot,
-		VFSNAME_STATVFS, fdstatvfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = fdmount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = fdunmount },
+		VFSNAME_ROOT, 		{ .vfs_root = fdroot },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = fdstatvfs },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/fem.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/fem.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 #pragma ident	"%Z%%M%	%I%	%E% SMI"
@@ -38,7 +38,7 @@
 #include <sys/fem.h>
 #include <sys/vfs.h>
 #include <sys/vnode.h>
-
+#include <sys/vfs_opreg.h>
 
 #define	NNODES_DEFAULT	8	/* Default number of nodes in a fem_list */
 /*
@@ -77,7 +77,7 @@
 
 
 #define	_FEMOPDEF(name, member)  \
-	{ VOPNAME_##name, offsetof(fem_t, vsop_##member), NULL, fem_err }
+	{ VOPNAME_##name, offsetof(fem_t, femop_##member), NULL, fem_err }
 
 static fs_operation_trans_def_t	fem_opdef[] = {
 	_FEMOPDEF(OPEN,		open),
@@ -181,7 +181,7 @@
 
 
 #define	_FSEMOPDEF(name, member)  \
-	{ VFSNAME_##name, offsetof(fsem_t, vfsop_##member), NULL, fsem_err }
+	{ VFSNAME_##name, offsetof(fsem_t, fsemop_##member), NULL, fsem_err }
 
 static fs_operation_trans_def_t fsem_opdef[] = {
 	_FSEMOPDEF(MOUNT, 	mount),
@@ -446,7 +446,7 @@
 		fem_unlock((*vpp)->v_femhead);
 		farg.fa_vnode.vpp = vpp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_open, vsop_open);
+		vsop_find(&farg, &func, int, &arg0, vop_open, femop_open);
 		errc = (*func)(arg0, mode, cr);
 		fem_release(femsp);
 	}
@@ -472,7 +472,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_close, vsop_close);
+		vsop_find(&farg, &func, int, &arg0, vop_close, femop_close);
 		errc = (*func)(arg0, flag, count, offset, cr);
 		fem_release(femsp);
 	}
@@ -499,7 +499,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_read, vsop_read);
+		vsop_find(&farg, &func, int, &arg0, vop_read, femop_read);
 		errc = (*func)(arg0, uiop, ioflag, cr, ct);
 		fem_release(femsp);
 	}
@@ -526,7 +526,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_write, vsop_write);
+		vsop_find(&farg, &func, int, &arg0, vop_write, femop_write);
 		errc = (*func)(arg0, uiop, ioflag, cr, ct);
 		fem_release(femsp);
 	}
@@ -553,7 +553,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_ioctl, vsop_ioctl);
+		vsop_find(&farg, &func, int, &arg0, vop_ioctl, femop_ioctl);
 		errc = (*func)(arg0, cmd, arg, flag, cr, rvalp);
 		fem_release(femsp);
 	}
@@ -579,7 +579,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_setfl, vsop_setfl);
+		vsop_find(&farg, &func, int, &arg0, vop_setfl, femop_setfl);
 		errc = (*func)(arg0, oflags, nflags, cr);
 		fem_release(femsp);
 	}
@@ -606,7 +606,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_getattr,
-			vsop_getattr);
+			femop_getattr);
 		errc = (*func)(arg0, vap, flags, cr);
 		fem_release(femsp);
 	}
@@ -634,7 +634,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_setattr,
-			vsop_setattr);
+			femop_setattr);
 		errc = (*func)(arg0, vap, flags, cr, ct);
 		fem_release(femsp);
 	}
@@ -661,7 +661,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_access,
-			vsop_access);
+			femop_access);
 		errc = (*func)(arg0, mode, flags, cr);
 		fem_release(femsp);
 	}
@@ -689,7 +689,7 @@
 		farg.fa_vnode.vp = dvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_lookup,
-			vsop_lookup);
+			femop_lookup);
 		errc = (*func)(arg0, nm, vpp, pnp, flags, rdir, cr);
 		fem_release(femsp);
 	}
@@ -717,7 +717,7 @@
 		farg.fa_vnode.vp = dvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_create,
-			vsop_create);
+			femop_create);
 		errc = (*func)(arg0, name, vap, excl, mode, vpp, cr, flag);
 		fem_release(femsp);
 	}
@@ -744,7 +744,7 @@
 		farg.fa_vnode.vp = dvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_remove,
-			vsop_remove);
+			femop_remove);
 		errc = (*func)(arg0, nm, cr);
 		fem_release(femsp);
 	}
@@ -770,7 +770,7 @@
 		fem_unlock(tdvp->v_femhead);
 		farg.fa_vnode.vp = tdvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_link, vsop_link);
+		vsop_find(&farg, &func, int, &arg0, vop_link, femop_link);
 		errc = (*func)(arg0, svp, tnm, cr);
 		fem_release(femsp);
 	}
@@ -798,7 +798,7 @@
 		farg.fa_vnode.vp = sdvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_rename,
-			vsop_rename);
+			femop_rename);
 		errc = (*func)(arg0, snm, tdvp, tnm, cr);
 		fem_release(femsp);
 	}
@@ -825,7 +825,7 @@
 		fem_unlock(dvp->v_femhead);
 		farg.fa_vnode.vp = dvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_mkdir, vsop_mkdir);
+		vsop_find(&farg, &func, int, &arg0, vop_mkdir, femop_mkdir);
 		errc = (*func)(arg0, dirname, vap, vpp, cr);
 		fem_release(femsp);
 	}
@@ -851,7 +851,7 @@
 		fem_unlock(dvp->v_femhead);
 		farg.fa_vnode.vp = dvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_rmdir, vsop_rmdir);
+		vsop_find(&farg, &func, int, &arg0, vop_rmdir, femop_rmdir);
 		errc = (*func)(arg0, nm, cdir, cr);
 		fem_release(femsp);
 	}
@@ -878,7 +878,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_readdir,
-			vsop_readdir);
+			femop_readdir);
 		errc = (*func)(arg0, uiop, cr, eofp);
 		fem_release(femsp);
 	}
@@ -906,7 +906,7 @@
 		farg.fa_vnode.vp = dvp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_symlink,
-			vsop_symlink);
+			femop_symlink);
 		errc = (*func)(arg0, linkname, vap, target, cr);
 		fem_release(femsp);
 	}
@@ -933,7 +933,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_readlink,
-			vsop_readlink);
+			femop_readlink);
 		errc = (*func)(arg0, uiop, cr);
 		fem_release(femsp);
 	}
@@ -959,7 +959,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_fsync, vsop_fsync);
+		vsop_find(&farg, &func, int, &arg0, vop_fsync, femop_fsync);
 		errc = (*func)(arg0, syncflag, cr);
 		fem_release(femsp);
 	}
@@ -985,7 +985,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, void, &arg0, vop_inactive,
-			vsop_inactive);
+			femop_inactive);
 		(*func)(arg0, cr);
 		fem_release(femsp);
 	}
@@ -1010,7 +1010,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_fid, vsop_fid);
+		vsop_find(&farg, &func, int, &arg0, vop_fid, femop_fid);
 		errc = (*func)(arg0, fidp);
 		fem_release(femsp);
 	}
@@ -1037,7 +1037,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_rwlock,
-			vsop_rwlock);
+			femop_rwlock);
 		errc = (*func)(arg0, write_lock, ct);
 		fem_release(femsp);
 	}
@@ -1063,7 +1063,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, void, &arg0, vop_rwunlock,
-			vsop_rwunlock);
+			femop_rwunlock);
 		(*func)(arg0, write_lock, ct);
 		fem_release(femsp);
 	}
@@ -1088,7 +1088,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_seek, vsop_seek);
+		vsop_find(&farg, &func, int, &arg0, vop_seek, femop_seek);
 		errc = (*func)(arg0, ooff, noffp);
 		fem_release(femsp);
 	}
@@ -1114,7 +1114,7 @@
 		fem_unlock(vp1->v_femhead);
 		farg.fa_vnode.vp = vp1;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_cmp, vsop_cmp);
+		vsop_find(&farg, &func, int, &arg0, vop_cmp, femop_cmp);
 		errc = (*func)(arg0, vp2);
 		fem_release(femsp);
 	}
@@ -1142,7 +1142,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_frlock,
-			vsop_frlock);
+			femop_frlock);
 		errc = (*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr);
 		fem_release(femsp);
 	}
@@ -1169,7 +1169,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_space, vsop_space);
+		vsop_find(&farg, &func, int, &arg0, vop_space, femop_space);
 		errc = (*func)(arg0, cmd, bfp, flag, offset, cr, ct);
 		fem_release(femsp);
 	}
@@ -1196,7 +1196,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_realvp,
-			vsop_realvp);
+			femop_realvp);
 		errc = (*func)(arg0, vpp);
 		fem_release(femsp);
 	}
@@ -1226,7 +1226,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_getpage,
-			vsop_getpage);
+			femop_getpage);
 		errc = (*func)(arg0, off, len, protp, plarr, plsz, seg,
 			addr, rw, cr);
 		fem_release(femsp);
@@ -1254,7 +1254,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_putpage,
-			vsop_putpage);
+			femop_putpage);
 		errc = (*func)(arg0, off, len, flags, cr);
 		fem_release(femsp);
 	}
@@ -1283,7 +1283,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_map, vsop_map);
+		vsop_find(&farg, &func, int, &arg0, vop_map, femop_map);
 		errc = (*func)(arg0, off, as, addrp, len, prot, maxprot,
 			flags, cr);
 		fem_release(femsp);
@@ -1314,7 +1314,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_addmap,
-			vsop_addmap);
+			femop_addmap);
 		errc = (*func)(arg0, off, as, addr, len, prot, maxprot,
 			flags, cr);
 		fem_release(femsp);
@@ -1344,7 +1344,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_delmap,
-			vsop_delmap);
+			femop_delmap);
 		errc = (*func)(arg0, off, as, addr, len, prot, maxprot,
 			flags, cr);
 		fem_release(femsp);
@@ -1372,7 +1372,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_poll, vsop_poll);
+		vsop_find(&farg, &func, int, &arg0, vop_poll, femop_poll);
 		errc = (*func)(arg0, events, anyyet, reventsp, phpp);
 		fem_release(femsp);
 	}
@@ -1398,7 +1398,7 @@
 		fem_unlock(vp->v_femhead);
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vsop_find(&farg, &func, int, &arg0, vop_dump, vsop_dump);
+		vsop_find(&farg, &func, int, &arg0, vop_dump, femop_dump);
 		errc = (*func)(arg0, addr, lbdn, dblks);
 		fem_release(femsp);
 	}
@@ -1425,7 +1425,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_pathconf,
-			vsop_pathconf);
+			femop_pathconf);
 		errc = (*func)(arg0, cmd, valp, cr);
 		fem_release(femsp);
 	}
@@ -1453,7 +1453,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_pageio,
-			vsop_pageio);
+			femop_pageio);
 		errc = (*func)(arg0, pp, io_off, io_len, flags, cr);
 		fem_release(femsp);
 	}
@@ -1480,7 +1480,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_dumpctl,
-			vsop_dumpctl);
+			femop_dumpctl);
 		errc = (*func)(arg0, action, blkp);
 		fem_release(femsp);
 	}
@@ -1506,7 +1506,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, void, &arg0, vop_dispose,
-			vsop_dispose);
+			femop_dispose);
 		(*func)(arg0, pp, flag, dn, cr);
 		fem_release(femsp);
 	}
@@ -1532,7 +1532,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_setsecattr,
-			vsop_setsecattr);
+			femop_setsecattr);
 		errc = (*func)(arg0, vsap, flag, cr);
 		fem_release(femsp);
 	}
@@ -1559,7 +1559,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_getsecattr,
-			vsop_getsecattr);
+			femop_getsecattr);
 		errc = (*func)(arg0, vsap, flag, cr);
 		fem_release(femsp);
 	}
@@ -1587,7 +1587,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_shrlock,
-			vsop_shrlock);
+			femop_shrlock);
 		errc = (*func)(arg0, cmd, shr, flag, cr);
 		fem_release(femsp);
 	}
@@ -1614,7 +1614,7 @@
 		farg.fa_vnode.vp = vp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vsop_find(&farg, &func, int, &arg0, vop_vnevent,
-			vsop_vnevent);
+			femop_vnevent);
 		errc = (*func)(arg0, vnevent);
 		fem_release(femsp);
 	}
@@ -1642,7 +1642,7 @@
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vfsop_find(&farg, &func, int, &arg0, vfs_mount,
-			vfsop_mount);
+			fsemop_mount);
 		errc = (*func)(arg0, mvp, uap, cr);
 		fem_release(femsp);
 	}
@@ -1670,7 +1670,7 @@
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vfsop_find(&farg, &func, int, &arg0, vfs_unmount,
-			vfsop_unmount);
+			fsemop_unmount);
 		errc = (*func)(arg0, flag, cr);
 		fem_release(femsp);
 	}
@@ -1697,7 +1697,7 @@
 		fem_unlock(vfsp->vfs_femhead);
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vfsop_find(&farg, &func, int, &arg0, vfs_root, vfsop_root);
+		vfsop_find(&farg, &func, int, &arg0, vfs_root, fsemop_root);
 		errc = (*func)(arg0, vpp);
 		fem_release(femsp);
 	}
@@ -1725,7 +1725,7 @@
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vfsop_find(&farg, &func, int, &arg0, vfs_statvfs,
-			vfsop_statvfs);
+			fsemop_statvfs);
 		errc = (*func)(arg0, sp);
 		fem_release(femsp);
 	}
@@ -1752,7 +1752,7 @@
 		fem_unlock(vfsp->vfs_femhead);
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vfsop_find(&farg, &func, int, &arg0, vfs_sync, vfsop_sync);
+		vfsop_find(&farg, &func, int, &arg0, vfs_sync, fsemop_sync);
 		errc = (*func)(arg0, flag, cr);
 		fem_release(femsp);
 	}
@@ -1779,7 +1779,7 @@
 		fem_unlock(vfsp->vfs_femhead);
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
-		vfsop_find(&farg, &func, int, &arg0, vfs_vget, vfsop_vget);
+		vfsop_find(&farg, &func, int, &arg0, vfs_vget, fsemop_vget);
 		errc = (*func)(arg0, vpp, fidp);
 		fem_release(femsp);
 	}
@@ -1807,7 +1807,7 @@
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vfsop_find(&farg, &func, int, &arg0, vfs_mountroot,
-			vfsop_mountroot);
+			fsemop_mountroot);
 		errc = (*func)(arg0, reason);
 		fem_release(femsp);
 	}
@@ -1834,7 +1834,7 @@
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vfsop_find(&farg, &func, void, &arg0, vfs_freevfs,
-			vfsop_freevfs);
+			fsemop_freevfs);
 		(*func)(arg0);
 		fem_release(femsp);
 	}
@@ -1861,7 +1861,7 @@
 		farg.fa_vnode.vfsp = vfsp;
 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
 		vfsop_find(&farg, &func, int, &arg0, vfs_vnstate,
-			vfsop_vnstate);
+			fsemop_vnstate);
 		errc = (*func)(arg0, vp, nstate);
 		fem_release(femsp);
 	}
@@ -1965,7 +1965,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_open, vsop_open);
+	vsop_find(vf, &func, int, &arg0, vop_open, femop_open);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, mode, cr));
@@ -1979,7 +1979,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_close, vsop_close);
+	vsop_find(vf, &func, int, &arg0, vop_close, femop_close);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, flag, count, offset, cr));
@@ -1994,7 +1994,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_read, vsop_read);
+	vsop_find(vf, &func, int, &arg0, vop_read, femop_read);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, uiop, ioflag, cr, ct));
@@ -2009,7 +2009,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_write, vsop_write);
+	vsop_find(vf, &func, int, &arg0, vop_write, femop_write);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, uiop, ioflag, cr, ct));
@@ -2024,7 +2024,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_ioctl, vsop_ioctl);
+	vsop_find(vf, &func, int, &arg0, vop_ioctl, femop_ioctl);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, cmd, arg, flag, cr, rvalp));
@@ -2038,7 +2038,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_setfl, vsop_setfl);
+	vsop_find(vf, &func, int, &arg0, vop_setfl, femop_setfl);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, oflags, nflags, cr));
@@ -2052,7 +2052,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_getattr, vsop_getattr);
+	vsop_find(vf, &func, int, &arg0, vop_getattr, femop_getattr);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vap, flags, cr));
@@ -2067,7 +2067,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_setattr, vsop_setattr);
+	vsop_find(vf, &func, int, &arg0, vop_setattr, femop_setattr);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vap, flags, cr, ct));
@@ -2081,7 +2081,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_access, vsop_access);
+	vsop_find(vf, &func, int, &arg0, vop_access, femop_access);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, mode, flags, cr));
@@ -2096,7 +2096,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_lookup, vsop_lookup);
+	vsop_find(vf, &func, int, &arg0, vop_lookup, femop_lookup);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, nm, vpp, pnp, flags, rdir, cr));
@@ -2111,7 +2111,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_create, vsop_create);
+	vsop_find(vf, &func, int, &arg0, vop_create, femop_create);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, name, vap, excl, mode, vpp, cr, flag));
@@ -2125,7 +2125,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_remove, vsop_remove);
+	vsop_find(vf, &func, int, &arg0, vop_remove, femop_remove);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, nm, cr));
@@ -2139,7 +2139,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_link, vsop_link);
+	vsop_find(vf, &func, int, &arg0, vop_link, femop_link);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, svp, tnm, cr));
@@ -2153,7 +2153,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_rename, vsop_rename);
+	vsop_find(vf, &func, int, &arg0, vop_rename, femop_rename);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, snm, tdvp, tnm, cr));
@@ -2168,7 +2168,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_mkdir, vsop_mkdir);
+	vsop_find(vf, &func, int, &arg0, vop_mkdir, femop_mkdir);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, dirname, vap, vpp, cr));
@@ -2182,7 +2182,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_rmdir, vsop_rmdir);
+	vsop_find(vf, &func, int, &arg0, vop_rmdir, femop_rmdir);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, nm, cdir, cr));
@@ -2196,7 +2196,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_readdir, vsop_readdir);
+	vsop_find(vf, &func, int, &arg0, vop_readdir, femop_readdir);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, uiop, cr, eofp));
@@ -2211,7 +2211,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_symlink, vsop_symlink);
+	vsop_find(vf, &func, int, &arg0, vop_symlink, femop_symlink);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, linkname, vap, target, cr));
@@ -2225,7 +2225,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_readlink, vsop_readlink);
+	vsop_find(vf, &func, int, &arg0, vop_readlink, femop_readlink);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, uiop, cr));
@@ -2239,7 +2239,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_fsync, vsop_fsync);
+	vsop_find(vf, &func, int, &arg0, vop_fsync, femop_fsync);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, syncflag, cr));
@@ -2253,7 +2253,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, void, &arg0, vop_inactive, vsop_inactive);
+	vsop_find(vf, &func, void, &arg0, vop_inactive, femop_inactive);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	(*func)(arg0, cr);
@@ -2267,7 +2267,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_fid, vsop_fid);
+	vsop_find(vf, &func, int, &arg0, vop_fid, femop_fid);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, fidp));
@@ -2281,7 +2281,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_rwlock, vsop_rwlock);
+	vsop_find(vf, &func, int, &arg0, vop_rwlock, femop_rwlock);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, write_lock, ct));
@@ -2295,7 +2295,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, void, &arg0, vop_rwunlock, vsop_rwunlock);
+	vsop_find(vf, &func, void, &arg0, vop_rwunlock, femop_rwunlock);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	(*func)(arg0, write_lock, ct);
@@ -2309,7 +2309,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_seek, vsop_seek);
+	vsop_find(vf, &func, int, &arg0, vop_seek, femop_seek);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, ooff, noffp));
@@ -2323,7 +2323,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_cmp, vsop_cmp);
+	vsop_find(vf, &func, int, &arg0, vop_cmp, femop_cmp);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vp2));
@@ -2338,7 +2338,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_frlock, vsop_frlock);
+	vsop_find(vf, &func, int, &arg0, vop_frlock, femop_frlock);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr));
@@ -2353,7 +2353,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_space, vsop_space);
+	vsop_find(vf, &func, int, &arg0, vop_space, femop_space);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, cmd, bfp, flag, offset, cr, ct));
@@ -2367,7 +2367,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_realvp, vsop_realvp);
+	vsop_find(vf, &func, int, &arg0, vop_realvp, femop_realvp);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vpp));
@@ -2383,7 +2383,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_getpage, vsop_getpage);
+	vsop_find(vf, &func, int, &arg0, vop_getpage, femop_getpage);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, off, len, protp, plarr, plsz, seg, addr, rw,
@@ -2399,7 +2399,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_putpage, vsop_putpage);
+	vsop_find(vf, &func, int, &arg0, vop_putpage, femop_putpage);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, off, len, flags, cr));
@@ -2415,7 +2415,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_map, vsop_map);
+	vsop_find(vf, &func, int, &arg0, vop_map, femop_map);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, off, as, addrp, len, prot, maxprot, flags,
@@ -2432,7 +2432,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_addmap, vsop_addmap);
+	vsop_find(vf, &func, int, &arg0, vop_addmap, femop_addmap);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, off, as, addr, len, prot, maxprot, flags, cr));
@@ -2447,7 +2447,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_delmap, vsop_delmap);
+	vsop_find(vf, &func, int, &arg0, vop_delmap, femop_delmap);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, off, as, addr, len, prot, maxprot, flags, cr));
@@ -2462,7 +2462,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_poll, vsop_poll);
+	vsop_find(vf, &func, int, &arg0, vop_poll, femop_poll);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, events, anyyet, reventsp, phpp));
@@ -2476,7 +2476,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_dump, vsop_dump);
+	vsop_find(vf, &func, int, &arg0, vop_dump, femop_dump);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, addr, lbdn, dblks));
@@ -2490,7 +2490,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_pathconf, vsop_pathconf);
+	vsop_find(vf, &func, int, &arg0, vop_pathconf, femop_pathconf);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, cmd, valp, cr));
@@ -2505,7 +2505,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_pageio, vsop_pageio);
+	vsop_find(vf, &func, int, &arg0, vop_pageio, femop_pageio);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, pp, io_off, io_len, flags, cr));
@@ -2519,7 +2519,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_dumpctl, vsop_dumpctl);
+	vsop_find(vf, &func, int, &arg0, vop_dumpctl, femop_dumpctl);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, action, blkp));
@@ -2533,7 +2533,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, void, &arg0, vop_dispose, vsop_dispose);
+	vsop_find(vf, &func, void, &arg0, vop_dispose, femop_dispose);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	(*func)(arg0, pp, flag, dn, cr);
@@ -2547,7 +2547,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_setsecattr, vsop_setsecattr);
+	vsop_find(vf, &func, int, &arg0, vop_setsecattr, femop_setsecattr);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vsap, flag, cr));
@@ -2561,7 +2561,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_getsecattr, vsop_getsecattr);
+	vsop_find(vf, &func, int, &arg0, vop_getsecattr, femop_getsecattr);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vsap, flag, cr));
@@ -2576,7 +2576,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_shrlock, vsop_shrlock);
+	vsop_find(vf, &func, int, &arg0, vop_shrlock, femop_shrlock);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, cmd, shr, flag, cr));
@@ -2590,7 +2590,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vsop_find(vf, &func, int, &arg0, vop_vnevent, vsop_vnevent);
+	vsop_find(vf, &func, int, &arg0, vop_vnevent, femop_vnevent);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vnevent));
@@ -2604,7 +2604,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_mount, vfsop_mount);
+	vfsop_find(vf, &func, int, &arg0, vfs_mount, fsemop_mount);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, mvp, uap, cr));
@@ -2618,7 +2618,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_unmount, vfsop_unmount);
+	vfsop_find(vf, &func, int, &arg0, vfs_unmount, fsemop_unmount);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, flag, cr));
@@ -2632,7 +2632,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_root, vfsop_root);
+	vfsop_find(vf, &func, int, &arg0, vfs_root, fsemop_root);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vpp));
@@ -2646,7 +2646,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_statvfs, vfsop_statvfs);
+	vfsop_find(vf, &func, int, &arg0, vfs_statvfs, fsemop_statvfs);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, sp));
@@ -2660,7 +2660,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_sync, vfsop_sync);
+	vfsop_find(vf, &func, int, &arg0, vfs_sync, fsemop_sync);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, flag, cr));
@@ -2674,7 +2674,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_vget, vfsop_vget);
+	vfsop_find(vf, &func, int, &arg0, vfs_vget, fsemop_vget);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vpp, fidp));
@@ -2688,7 +2688,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_mountroot, vfsop_mountroot);
+	vfsop_find(vf, &func, int, &arg0, vfs_mountroot, fsemop_mountroot);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, reason));
@@ -2702,7 +2702,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, void, &arg0, vfs_freevfs, vfsop_freevfs);
+	vfsop_find(vf, &func, void, &arg0, vfs_freevfs, fsemop_freevfs);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	(*func)(arg0);
@@ -2716,7 +2716,7 @@
 
 	ASSERT(vf != NULL);
 	vf->fa_fnode--;
-	vfsop_find(vf, &func, int, &arg0, vfs_vnstate, vfsop_vnstate);
+	vfsop_find(vf, &func, int, &arg0, vfs_vnstate, fsemop_vnstate);
 	ASSERT(func != NULL);
 	ASSERT(arg0 != NULL);
 	return ((*func)(arg0, vp, nstate));
--- a/usr/src/uts/common/fs/fifofs/fifosubr.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/fifofs/fifosubr.c	Mon Mar 26 17:41:06 2007 -0700
@@ -21,7 +21,7 @@
 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -45,6 +45,7 @@
 #include <sys/sysmacros.h>
 #include <sys/var.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
 #include <sys/signal.h>
--- a/usr/src/uts/common/fs/fifofs/fifovnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/fifofs/fifovnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -23,7 +23,7 @@
 
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -46,6 +46,7 @@
 #include <sys/uio.h>
 #include <sys/vfs.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/pathname.h>
 #include <sys/signal.h>
 #include <sys/user.h>
@@ -110,28 +111,28 @@
 struct vnodeops *fifo_vnodeops;
 
 const fs_operation_def_t fifo_vnodeops_template[] = {
-	VOPNAME_OPEN, fifo_open,
-	VOPNAME_CLOSE, fifo_close,
-	VOPNAME_READ, fifo_read,
-	VOPNAME_WRITE, fifo_write,
-	VOPNAME_IOCTL, fifo_ioctl,
-	VOPNAME_GETATTR, fifo_getattr,
-	VOPNAME_SETATTR, fifo_setattr,
-	VOPNAME_ACCESS, fifo_access,
-	VOPNAME_CREATE, fifo_create,
-	VOPNAME_FSYNC, fifo_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) fifo_inactive,
-	VOPNAME_FID, fifo_fid,
-	VOPNAME_RWLOCK, fifo_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) fifo_rwunlock,
-	VOPNAME_SEEK, fifo_seek,
-	VOPNAME_REALVP, fifo_realvp,
-	VOPNAME_POLL, (fs_generic_func_p) fifo_poll,
-	VOPNAME_PATHCONF, fifo_pathconf,
-	VOPNAME_DISPOSE, fs_error,
-	VOPNAME_SETSECATTR, fifo_setsecattr,
-	VOPNAME_GETSECATTR, fifo_getsecattr,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = fifo_open },
+	VOPNAME_CLOSE,		{ .vop_close = fifo_close },
+	VOPNAME_READ,		{ .vop_read = fifo_read },
+	VOPNAME_WRITE,		{ .vop_write = fifo_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = fifo_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = fifo_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = fifo_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = fifo_access },
+	VOPNAME_CREATE,		{ .vop_create = fifo_create },
+	VOPNAME_FSYNC,		{ .vop_fsync = fifo_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = fifo_inactive },
+	VOPNAME_FID,		{ .vop_fid = fifo_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = fifo_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = fifo_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = fifo_seek },
+	VOPNAME_REALVP,		{ .vop_realvp = fifo_realvp },
+	VOPNAME_POLL,		{ .vop_poll = fifo_poll },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = fifo_pathconf },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = fifo_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = fifo_getsecattr },
+	NULL,			NULL
 };
 
 /*
--- a/usr/src/uts/common/fs/hsfs/hsfs_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/hsfs/hsfs_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -43,6 +43,7 @@
 #include <sys/buf.h>
 #include <sys/pathname.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/file.h>
 #include <sys/uio.h>
@@ -234,13 +235,13 @@
 hsfsinit(int fstype, char *name)
 {
 	static const fs_operation_def_t hsfs_vfsops_template[] = {
-		VFSNAME_MOUNT, hsfs_mount,
-		VFSNAME_UNMOUNT, hsfs_unmount,
-		VFSNAME_ROOT, hsfs_root,
-		VFSNAME_STATVFS, hsfs_statvfs,
-		VFSNAME_VGET, hsfs_vget,
-		VFSNAME_MOUNTROOT, hsfs_mountroot,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = hsfs_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = hsfs_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = hsfs_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = hsfs_statvfs },
+		VFSNAME_VGET,		{ .vfs_vget = hsfs_vget },
+		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = hsfs_mountroot },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/hsfs/hsfs_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/hsfs/hsfs_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -41,6 +41,7 @@
 #include <sys/user.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/stat.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
@@ -1331,26 +1332,26 @@
 
 
 const fs_operation_def_t hsfs_vnodeops_template[] = {
-	VOPNAME_OPEN, hsfs_open,
-	VOPNAME_CLOSE, hsfs_close,
-	VOPNAME_READ, hsfs_read,
-	VOPNAME_GETATTR, hsfs_getattr,
-	VOPNAME_ACCESS, hsfs_access,
-	VOPNAME_LOOKUP, hsfs_lookup,
-	VOPNAME_READDIR, hsfs_readdir,
-	VOPNAME_READLINK, hsfs_readlink,
-	VOPNAME_FSYNC, hsfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) hsfs_inactive,
-	VOPNAME_FID, hsfs_fid,
-	VOPNAME_SEEK, hsfs_seek,
-	VOPNAME_FRLOCK, hsfs_frlock,
-	VOPNAME_GETPAGE, hsfs_getpage,
-	VOPNAME_PUTPAGE, hsfs_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) hsfs_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) hsfs_addmap,
-	VOPNAME_DELMAP, hsfs_delmap,
-	VOPNAME_PATHCONF, hsfs_pathconf,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = hsfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = hsfs_close },
+	VOPNAME_READ,		{ .vop_read = hsfs_read },
+	VOPNAME_GETATTR,	{ .vop_getattr = hsfs_getattr },
+	VOPNAME_ACCESS,		{ .vop_access = hsfs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = hsfs_lookup },
+	VOPNAME_READDIR,	{ .vop_readdir = hsfs_readdir },
+	VOPNAME_READLINK,	{ .vop_readlink = hsfs_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = hsfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = hsfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = hsfs_fid },
+	VOPNAME_SEEK,		{ .vop_seek = hsfs_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = hsfs_frlock },
+	VOPNAME_GETPAGE,	{ .vop_getpage = hsfs_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = hsfs_putpage },
+	VOPNAME_MAP,		{ .vop_map = hsfs_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = hsfs_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = hsfs_delmap },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = hsfs_pathconf },
+	NULL,			NULL
 };
 
 struct vnodeops *hsfs_vnodeops;
--- a/usr/src/uts/common/fs/lofs/lofs_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/lofs/lofs_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -28,6 +28,7 @@
 #include <sys/param.h>
 #include <sys/errno.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/uio.h>
 #include <sys/pathname.h>
@@ -540,14 +541,14 @@
 lofsinit(int fstyp, char *name)
 {
 	static const fs_operation_def_t lo_vfsops_template[] = {
-		VFSNAME_MOUNT, lo_mount,
-		VFSNAME_UNMOUNT, lo_unmount,
-		VFSNAME_ROOT, lo_root,
-		VFSNAME_STATVFS, lo_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) lo_sync,
-		VFSNAME_VGET, lo_vget,
-		VFSNAME_FREEVFS, (fs_generic_func_p) lo_freevfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = lo_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = lo_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = lo_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = lo_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = lo_sync },
+		VFSNAME_VGET,		{ .vfs_vget = lo_vget },
+		VFSNAME_FREEVFS,	{ .vfs_freevfs = lo_freevfs },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/lofs/lofs_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/lofs/lofs_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -30,6 +30,7 @@
 #include <sys/errno.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/uio.h>
 #include <sys/cred.h>
 #include <sys/pathname.h>
@@ -1116,48 +1117,48 @@
 struct vnodeops *lo_vnodeops;
 
 const fs_operation_def_t lo_vnodeops_template[] = {
-	VOPNAME_OPEN, lo_open,
-	VOPNAME_CLOSE, lo_close,
-	VOPNAME_READ, lo_read,
-	VOPNAME_WRITE, lo_write,
-	VOPNAME_IOCTL, lo_ioctl,
-	VOPNAME_SETFL, lo_setfl,
-	VOPNAME_GETATTR, lo_getattr,
-	VOPNAME_SETATTR, lo_setattr,
-	VOPNAME_ACCESS, lo_access,
-	VOPNAME_LOOKUP, lo_lookup,
-	VOPNAME_CREATE, lo_create,
-	VOPNAME_REMOVE, lo_remove,
-	VOPNAME_LINK, lo_link,
-	VOPNAME_RENAME, lo_rename,
-	VOPNAME_MKDIR, lo_mkdir,
-	VOPNAME_RMDIR, lo_rmdir,
-	VOPNAME_READDIR, lo_readdir,
-	VOPNAME_SYMLINK, lo_symlink,
-	VOPNAME_READLINK, lo_readlink,
-	VOPNAME_FSYNC, lo_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) lo_inactive,
-	VOPNAME_FID, lo_fid,
-	VOPNAME_RWLOCK, lo_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) lo_rwunlock,
-	VOPNAME_SEEK, lo_seek,
-	VOPNAME_CMP, lo_cmp,
-	VOPNAME_FRLOCK, lo_frlock,
-	VOPNAME_SPACE, lo_space,
-	VOPNAME_REALVP, lo_realvp,
-	VOPNAME_GETPAGE, lo_getpage,
-	VOPNAME_PUTPAGE, lo_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) lo_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) lo_addmap,
-	VOPNAME_DELMAP, lo_delmap,
-	VOPNAME_POLL, (fs_generic_func_p) lo_poll,
-	VOPNAME_DUMP, lo_dump,
-	VOPNAME_DUMPCTL, fs_error,		/* XXX - why? */
-	VOPNAME_PATHCONF, lo_pathconf,
-	VOPNAME_PAGEIO, lo_pageio,
-	VOPNAME_DISPOSE, (fs_generic_func_p) lo_dispose,
-	VOPNAME_SETSECATTR, lo_setsecattr,
-	VOPNAME_GETSECATTR, lo_getsecattr,
-	VOPNAME_SHRLOCK, lo_shrlock,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = lo_open },
+	VOPNAME_CLOSE,		{ .vop_close = lo_close },
+	VOPNAME_READ,		{ .vop_read = lo_read },
+	VOPNAME_WRITE,		{ .vop_write = lo_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = lo_ioctl },
+	VOPNAME_SETFL,		{ .vop_setfl = lo_setfl },
+	VOPNAME_GETATTR,	{ .vop_getattr = lo_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = lo_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = lo_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = lo_lookup },
+	VOPNAME_CREATE,		{ .vop_create = lo_create },
+	VOPNAME_REMOVE,		{ .vop_remove = lo_remove },
+	VOPNAME_LINK,		{ .vop_link = lo_link },
+	VOPNAME_RENAME,		{ .vop_rename = lo_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = lo_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = lo_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = lo_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = lo_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = lo_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = lo_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = lo_inactive },
+	VOPNAME_FID,		{ .vop_fid = lo_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = lo_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = lo_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = lo_seek },
+	VOPNAME_CMP,		{ .vop_cmp = lo_cmp },
+	VOPNAME_FRLOCK,		{ .vop_frlock = lo_frlock },
+	VOPNAME_SPACE,		{ .vop_space = lo_space },
+	VOPNAME_REALVP,		{ .vop_realvp = lo_realvp },
+	VOPNAME_GETPAGE,	{ .vop_getpage = lo_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = lo_putpage },
+	VOPNAME_MAP,		{ .vop_map = lo_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = lo_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = lo_delmap },
+	VOPNAME_POLL,		{ .vop_poll = lo_poll },
+	VOPNAME_DUMP,		{ .vop_dump = lo_dump },
+	VOPNAME_DUMPCTL,	{ .error = fs_error },	/* XXX - why? */
+	VOPNAME_PATHCONF,	{ .vop_pathconf = lo_pathconf },
+	VOPNAME_PAGEIO,		{ .vop_pageio = lo_pageio },
+	VOPNAME_DISPOSE,	{ .vop_dispose = lo_dispose },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = lo_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = lo_getsecattr },
+	VOPNAME_SHRLOCK,	{ .vop_shrlock = lo_shrlock },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/mntfs/mntvfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/mntfs/mntvfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -39,6 +39,7 @@
 #include <sys/systm.h>
 #include <sys/var.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
 #include <sys/signal.h>
@@ -134,11 +135,11 @@
 mntinit(int fstype, char *name)
 {
 	static const fs_operation_def_t mnt_vfsops_template[] = {
-		VFSNAME_MOUNT, mntmount,
-		VFSNAME_UNMOUNT, mntunmount,
-		VFSNAME_ROOT, mntroot,
-		VFSNAME_STATVFS, mntstatvfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = mntmount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = mntunmount },
+		VFSNAME_ROOT,		{ .vfs_root = mntroot },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = mntstatvfs },
+		NULL,			NULL
 	};
 	extern const fs_operation_def_t mnt_vnodeops_template[];
 	int error;
--- a/usr/src/uts/common/fs/mntfs/mntvnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/mntfs/mntvnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -36,6 +35,7 @@
 #include <sys/sysmacros.h>
 #include <sys/systm.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/fs/mntdata.h>
 #include <fs/fs_subr.h>
 #include <sys/vmsystm.h>
@@ -1133,17 +1133,17 @@
  * /mntfs vnode operations vector
  */
 const fs_operation_def_t mnt_vnodeops_template[] = {
-	VOPNAME_OPEN, mntopen,
-	VOPNAME_CLOSE, mntclose,
-	VOPNAME_READ, mntread,
-	VOPNAME_IOCTL, mntioctl,
-	VOPNAME_GETATTR, mntgetattr,
-	VOPNAME_ACCESS, mntaccess,
-	VOPNAME_FSYNC, mntfsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) mntinactive,
-	VOPNAME_SEEK, mntseek,
-	VOPNAME_POLL, (fs_generic_func_p) mntpoll,
-	VOPNAME_DISPOSE, fs_error,
-	VOPNAME_SHRLOCK, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = mntopen },
+	VOPNAME_CLOSE,		{ .vop_close = mntclose },
+	VOPNAME_READ,		{ .vop_read = mntread },
+	VOPNAME_IOCTL,		{ .vop_ioctl = mntioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = mntgetattr },
+	VOPNAME_ACCESS,		{ .vop_access = mntaccess },
+	VOPNAME_FSYNC,		{ .vop_fsync = mntfsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = mntinactive },
+	VOPNAME_SEEK,		{ .vop_seek = mntseek },
+	VOPNAME_POLL,		{ .vop_poll = mntpoll },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	VOPNAME_SHRLOCK,	{ .error = fs_error },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/namefs/namevfs.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/namefs/namevfs.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -48,6 +48,7 @@
 #include <sys/sysmacros.h>
 #include <sys/var.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
 #include <sys/pcb.h>
@@ -662,17 +663,17 @@
 nameinit(int fstype, char *name)
 {
 	static const fs_operation_def_t nm_vfsops_template[] = {
-		VFSNAME_MOUNT, nm_mount,
-		VFSNAME_UNMOUNT, nm_unmount,
-		VFSNAME_ROOT, nm_root,
-		VFSNAME_STATVFS, nm_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) nm_sync,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = nm_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = nm_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = nm_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = nm_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = nm_sync },
+		NULL,			NULL
 	};
 	static const fs_operation_def_t nm_dummy_vfsops_template[] = {
-		VFSNAME_STATVFS, nm_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) nm_sync,
-		NULL, NULL
+		VFSNAME_STATVFS,	{ .vfs_statvfs = nm_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = nm_sync },
+		NULL,			NULL
 	};
 	int error;
 	int dev;
--- a/usr/src/uts/common/fs/namefs/namevno.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/namefs/namevno.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -24,7 +23,7 @@
 
 
 /*
- * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -50,6 +49,7 @@
 #include <sys/kmem.h>
 #include <sys/uio.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/pcb.h>
 #include <sys/signal.h>
@@ -461,24 +461,24 @@
 struct vnodeops *nm_vnodeops;
 
 const fs_operation_def_t nm_vnodeops_template[] = {
-	VOPNAME_OPEN, nm_open,
-	VOPNAME_CLOSE, nm_close,
-	VOPNAME_READ, nm_read,
-	VOPNAME_WRITE, nm_write,
-	VOPNAME_IOCTL, nm_ioctl,
-	VOPNAME_GETATTR, nm_getattr,
-	VOPNAME_SETATTR, nm_setattr,
-	VOPNAME_ACCESS, nm_access,
-	VOPNAME_CREATE, nm_create,
-	VOPNAME_LINK, nm_link,
-	VOPNAME_FSYNC, nm_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) nm_inactive,
-	VOPNAME_FID, nm_fid,
-	VOPNAME_RWLOCK, nm_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) nm_rwunlock,
-	VOPNAME_SEEK, nm_seek,
-	VOPNAME_REALVP, nm_realvp,
-	VOPNAME_POLL, (fs_generic_func_p) nm_poll,
-	VOPNAME_DISPOSE, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = nm_open },
+	VOPNAME_CLOSE,		{ .vop_close = nm_close },
+	VOPNAME_READ,		{ .vop_read = nm_read },
+	VOPNAME_WRITE,		{ .vop_write = nm_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = nm_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = nm_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = nm_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = nm_access },
+	VOPNAME_CREATE,		{ .vop_create = nm_create },
+	VOPNAME_LINK,		{ .vop_link = nm_link },
+	VOPNAME_FSYNC,		{ .vop_fsync = nm_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = nm_inactive },
+	VOPNAME_FID,		{ .vop_fid = nm_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = nm_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = nm_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = nm_seek },
+	VOPNAME_REALVP,		{ .vop_realvp = nm_realvp },
+	VOPNAME_POLL,		{ .vop_poll = nm_poll },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/nfs/nfs3_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs3_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -35,6 +35,7 @@
 #include <sys/systm.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/pathname.h>
 #include <sys/sysmacros.h>
@@ -155,15 +156,15 @@
 nfs3init(int fstyp, char *name)
 {
 	static const fs_operation_def_t nfs3_vfsops_template[] = {
-		VFSNAME_MOUNT, nfs3_mount,
-		VFSNAME_UNMOUNT, nfs3_unmount,
-		VFSNAME_ROOT, nfs3_root,
-		VFSNAME_STATVFS, nfs3_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) nfs3_sync,
-		VFSNAME_VGET, nfs3_vget,
-		VFSNAME_MOUNTROOT, nfs3_mountroot,
-		VFSNAME_FREEVFS, (fs_generic_func_p)nfs3_freevfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = nfs3_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = nfs3_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = nfs3_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = nfs3_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = nfs3_sync },
+		VFSNAME_VGET,		{ .vfs_vget = nfs3_vget },
+		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = nfs3_mountroot },
+		VFSNAME_FREEVFS,	{ .vfs_freevfs = nfs3_freevfs },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/nfs/nfs3_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs3_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -37,6 +37,7 @@
 #include <sys/time.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/file.h>
 #include <sys/filio.h>
 #include <sys/uio.h>
@@ -216,46 +217,47 @@
 struct vnodeops *nfs3_vnodeops;
 
 const fs_operation_def_t nfs3_vnodeops_template[] = {
-	VOPNAME_OPEN, nfs3_open,
-	VOPNAME_CLOSE, nfs3_close,
-	VOPNAME_READ, nfs3_read,
-	VOPNAME_WRITE, nfs3_write,
-	VOPNAME_IOCTL, nfs3_ioctl,
-	VOPNAME_GETATTR, nfs3_getattr,
-	VOPNAME_SETATTR, nfs3_setattr,
-	VOPNAME_ACCESS, nfs3_access,
-	VOPNAME_LOOKUP, nfs3_lookup,
-	VOPNAME_CREATE, nfs3_create,
-	VOPNAME_REMOVE, nfs3_remove,
-	VOPNAME_LINK, nfs3_link,
-	VOPNAME_RENAME, nfs3_rename,
-	VOPNAME_MKDIR, nfs3_mkdir,
-	VOPNAME_RMDIR, nfs3_rmdir,
-	VOPNAME_READDIR, nfs3_readdir,
-	VOPNAME_SYMLINK, nfs3_symlink,
-	VOPNAME_READLINK, nfs3_readlink,
-	VOPNAME_FSYNC, nfs3_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) nfs3_inactive,
-	VOPNAME_FID, nfs3_fid,
-	VOPNAME_RWLOCK, nfs3_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) nfs3_rwunlock,
-	VOPNAME_SEEK, nfs3_seek,
-	VOPNAME_FRLOCK, nfs3_frlock,
-	VOPNAME_SPACE, nfs3_space,
-	VOPNAME_REALVP, nfs3_realvp,
-	VOPNAME_GETPAGE, nfs3_getpage,
-	VOPNAME_PUTPAGE, nfs3_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) nfs3_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) nfs3_addmap,
-	VOPNAME_DELMAP, nfs3_delmap,
-	VOPNAME_DUMP, nfs_dump,		/* there is no separate nfs3_dump */
-	VOPNAME_PATHCONF, nfs3_pathconf,
-	VOPNAME_PAGEIO, nfs3_pageio,
-	VOPNAME_DISPOSE, (fs_generic_func_p) nfs3_dispose,
-	VOPNAME_SETSECATTR, nfs3_setsecattr,
-	VOPNAME_GETSECATTR, nfs3_getsecattr,
-	VOPNAME_SHRLOCK, nfs3_shrlock,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = nfs3_open },
+	VOPNAME_CLOSE,		{ .vop_close = nfs3_close },
+	VOPNAME_READ,		{ .vop_read = nfs3_read },
+	VOPNAME_WRITE,		{ .vop_write = nfs3_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = nfs3_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = nfs3_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = nfs3_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = nfs3_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = nfs3_lookup },
+	VOPNAME_CREATE,		{ .vop_create = nfs3_create },
+	VOPNAME_REMOVE,		{ .vop_remove = nfs3_remove },
+	VOPNAME_LINK,		{ .vop_link = nfs3_link },
+	VOPNAME_RENAME,		{ .vop_rename = nfs3_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = nfs3_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = nfs3_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = nfs3_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = nfs3_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = nfs3_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = nfs3_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = nfs3_inactive },
+	VOPNAME_FID,		{ .vop_fid = nfs3_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = nfs3_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = nfs3_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = nfs3_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = nfs3_frlock },
+	VOPNAME_SPACE,		{ .vop_space = nfs3_space },
+	VOPNAME_REALVP,		{ .vop_realvp = nfs3_realvp },
+	VOPNAME_GETPAGE,	{ .vop_getpage = nfs3_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = nfs3_putpage },
+	VOPNAME_MAP,		{ .vop_map = nfs3_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = nfs3_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = nfs3_delmap },
+	/* no separate nfs3_dump */
+	VOPNAME_DUMP,		{ .vop_dump = nfs_dump },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = nfs3_pathconf },
+	VOPNAME_PAGEIO,		{ .vop_pageio = nfs3_pageio },
+	VOPNAME_DISPOSE,	{ .vop_dispose = nfs3_dispose },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = nfs3_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = nfs3_getsecattr },
+	VOPNAME_SHRLOCK,	{ .vop_shrlock = nfs3_shrlock },
+	NULL,			NULL
 };
 
 /*
--- a/usr/src/uts/common/fs/nfs/nfs4_srv.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs4_srv.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -36,6 +36,7 @@
 #include <sys/cred.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/uio.h>
 #include <sys/errno.h>
@@ -475,25 +476,25 @@
 #define	nextdp(dp)	((struct dirent64 *)((char *)(dp) + (dp)->d_reclen))
 
 static const fs_operation_def_t nfs4_rd_deleg_tmpl[] = {
-	VOPNAME_OPEN, deleg_rdopen,
-	VOPNAME_WRITE, deleg_write,
-	VOPNAME_SETATTR, deleg_setattr,
-	VOPNAME_RWLOCK, deleg_rd_rwlock,
-	VOPNAME_SPACE, deleg_space,
-	VOPNAME_SETSECATTR, deleg_setsecattr,
-	VOPNAME_VNEVENT, deleg_vnevent,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .femop_open = deleg_rdopen },
+	VOPNAME_WRITE,		{ .femop_write = deleg_write },
+	VOPNAME_SETATTR,	{ .femop_setattr = deleg_setattr },
+	VOPNAME_RWLOCK,		{ .femop_rwlock = deleg_rd_rwlock },
+	VOPNAME_SPACE,		{ .femop_space = deleg_space },
+	VOPNAME_SETSECATTR,	{ .femop_setsecattr = deleg_setsecattr },
+	VOPNAME_VNEVENT,	{ .femop_vnevent = deleg_vnevent },
+	NULL,			NULL
 };
 static const fs_operation_def_t nfs4_wr_deleg_tmpl[] = {
-	VOPNAME_OPEN, deleg_wropen,
-	VOPNAME_READ, deleg_read,
-	VOPNAME_WRITE, deleg_write,
-	VOPNAME_SETATTR, deleg_setattr,
-	VOPNAME_RWLOCK, deleg_wr_rwlock,
-	VOPNAME_SPACE, deleg_space,
-	VOPNAME_SETSECATTR, deleg_setsecattr,
-	VOPNAME_VNEVENT, deleg_vnevent,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .femop_open = deleg_wropen },
+	VOPNAME_READ,		{ .femop_read = deleg_read },
+	VOPNAME_WRITE,		{ .femop_write = deleg_write },
+	VOPNAME_SETATTR,	{ .femop_setattr = deleg_setattr },
+	VOPNAME_RWLOCK,		{ .femop_rwlock = deleg_wr_rwlock },
+	VOPNAME_SPACE,		{ .femop_space = deleg_space },
+	VOPNAME_SETSECATTR,	{ .femop_setsecattr = deleg_setsecattr },
+	VOPNAME_VNEVENT,	{ .femop_vnevent = deleg_vnevent },
+	NULL,			NULL
 };
 
 int
--- a/usr/src/uts/common/fs/nfs/nfs4_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs4_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -35,6 +35,7 @@
 #include <sys/systm.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/pathname.h>
 #include <sys/sysmacros.h>
@@ -175,15 +176,15 @@
 nfs4init(int fstyp, char *name)
 {
 	static const fs_operation_def_t nfs4_vfsops_template[] = {
-		VFSNAME_MOUNT, nfs4_mount,
-		VFSNAME_UNMOUNT, nfs4_unmount,
-		VFSNAME_ROOT, nfs4_root,
-		VFSNAME_STATVFS, nfs4_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) nfs4_sync,
-		VFSNAME_VGET, nfs4_vget,
-		VFSNAME_MOUNTROOT, nfs4_mountroot,
-		VFSNAME_FREEVFS, (fs_generic_func_p)nfs4_freevfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = nfs4_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = nfs4_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = nfs4_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = nfs4_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = nfs4_sync },
+		VFSNAME_VGET,		{ .vfs_vget = nfs4_vget },
+		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = nfs4_mountroot },
+		VFSNAME_FREEVFS,	{ .vfs_freevfs = nfs4_freevfs },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/nfs/nfs4_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs4_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -37,6 +37,7 @@
 #include <sys/time.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/file.h>
 #include <sys/filio.h>
 #include <sys/uio.h>
@@ -363,46 +364,47 @@
 struct vnodeops *nfs4_vnodeops;
 
 const fs_operation_def_t nfs4_vnodeops_template[] = {
-	VOPNAME_OPEN, nfs4_open,
-	VOPNAME_CLOSE, nfs4_close,
-	VOPNAME_READ, nfs4_read,
-	VOPNAME_WRITE, nfs4_write,
-	VOPNAME_IOCTL, nfs4_ioctl,
-	VOPNAME_GETATTR, nfs4_getattr,
-	VOPNAME_SETATTR, nfs4_setattr,
-	VOPNAME_ACCESS, nfs4_access,
-	VOPNAME_LOOKUP, nfs4_lookup,
-	VOPNAME_CREATE, nfs4_create,
-	VOPNAME_REMOVE, nfs4_remove,
-	VOPNAME_LINK, nfs4_link,
-	VOPNAME_RENAME, nfs4_rename,
-	VOPNAME_MKDIR, nfs4_mkdir,
-	VOPNAME_RMDIR, nfs4_rmdir,
-	VOPNAME_READDIR, nfs4_readdir,
-	VOPNAME_SYMLINK, nfs4_symlink,
-	VOPNAME_READLINK, nfs4_readlink,
-	VOPNAME_FSYNC, nfs4_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) nfs4_inactive,
-	VOPNAME_FID, nfs4_fid,
-	VOPNAME_RWLOCK, nfs4_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) nfs4_rwunlock,
-	VOPNAME_SEEK, nfs4_seek,
-	VOPNAME_FRLOCK, nfs4_frlock,
-	VOPNAME_SPACE, nfs4_space,
-	VOPNAME_REALVP, nfs4_realvp,
-	VOPNAME_GETPAGE, nfs4_getpage,
-	VOPNAME_PUTPAGE, nfs4_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) nfs4_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) nfs4_addmap,
-	VOPNAME_DELMAP, nfs4_delmap,
-	VOPNAME_DUMP, nfs_dump,		/* there is no separate nfs4_dump */
-	VOPNAME_PATHCONF, nfs4_pathconf,
-	VOPNAME_PAGEIO, nfs4_pageio,
-	VOPNAME_DISPOSE, (fs_generic_func_p) nfs4_dispose,
-	VOPNAME_SETSECATTR, nfs4_setsecattr,
-	VOPNAME_GETSECATTR, nfs4_getsecattr,
-	VOPNAME_SHRLOCK, nfs4_shrlock,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = nfs4_open },
+	VOPNAME_CLOSE,		{ .vop_close = nfs4_close },
+	VOPNAME_READ,		{ .vop_read = nfs4_read },
+	VOPNAME_WRITE,		{ .vop_write = nfs4_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = nfs4_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = nfs4_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = nfs4_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = nfs4_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = nfs4_lookup },
+	VOPNAME_CREATE,		{ .vop_create = nfs4_create },
+	VOPNAME_REMOVE,		{ .vop_remove = nfs4_remove },
+	VOPNAME_LINK,		{ .vop_link = nfs4_link },
+	VOPNAME_RENAME,		{ .vop_rename = nfs4_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = nfs4_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = nfs4_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = nfs4_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = nfs4_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = nfs4_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = nfs4_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = nfs4_inactive },
+	VOPNAME_FID,		{ .vop_fid = nfs4_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = nfs4_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = nfs4_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = nfs4_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = nfs4_frlock },
+	VOPNAME_SPACE,		{ .vop_space = nfs4_space },
+	VOPNAME_REALVP,		{ .vop_realvp = nfs4_realvp },
+	VOPNAME_GETPAGE,	{ .vop_getpage = nfs4_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = nfs4_putpage },
+	VOPNAME_MAP,		{ .vop_map = nfs4_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = nfs4_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = nfs4_delmap },
+	/* no separate nfs4_dump */
+	VOPNAME_DUMP,		{ .vop_dump = nfs_dump },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = nfs4_pathconf },
+	VOPNAME_PAGEIO,		{ .vop_pageio = nfs4_pageio },
+	VOPNAME_DISPOSE,	{ .vop_dispose = nfs4_dispose },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = nfs4_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = nfs4_getsecattr },
+	VOPNAME_SHRLOCK,	{ .vop_shrlock = nfs4_shrlock },
+	NULL,			NULL
 };
 
 /*
--- a/usr/src/uts/common/fs/nfs/nfs_common.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs_common.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -38,6 +38,7 @@
 #include <sys/time.h>
 #include <sys/utsname.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/pathname.h>
 #include <sys/bootconf.h>
@@ -336,7 +337,7 @@
 nfsdyninit(int fstyp, char *name)
 {
 	static const fs_operation_def_t nfsdyn_vfsops_template[] = {
-		VFSNAME_MOUNTROOT, nfsdyn_mountroot,
+		VFSNAME_MOUNTROOT, { .vfs_mountroot = nfsdyn_mountroot },
 		NULL, NULL
 	};
 	int error;
--- a/usr/src/uts/common/fs/nfs/nfs_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -33,6 +33,7 @@
 #include <sys/systm.h>
 #include <sys/cred.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/pathname.h>
 #include <sys/sysmacros.h>
@@ -157,15 +158,15 @@
 nfsinit(int fstyp, char *name)
 {
 	static const fs_operation_def_t nfs_vfsops_template[] = {
-		VFSNAME_MOUNT, nfs_mount,
-		VFSNAME_UNMOUNT, nfs_unmount,
-		VFSNAME_ROOT, nfs_root,
-		VFSNAME_STATVFS, nfs_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) nfs_sync,
-		VFSNAME_VGET, nfs_vget,
-		VFSNAME_MOUNTROOT, nfs_mountroot,
-		VFSNAME_FREEVFS, (fs_generic_func_p)nfs_freevfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = nfs_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = nfs_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = nfs_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = nfs_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = nfs_sync },
+		VFSNAME_VGET,		{ .vfs_vget = nfs_vget },
+		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = nfs_mountroot },
+		VFSNAME_FREEVFS,	{ .vfs_freevfs = nfs_freevfs },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/nfs/nfs_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
  *	Copyright (c) 1983,1984,1985,1986,1987,1988,1989 AT&T.
@@ -35,6 +35,7 @@
 #include <sys/time.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/file.h>
 #include <sys/filio.h>
 #include <sys/uio.h>
@@ -179,45 +180,45 @@
 struct vnodeops *nfs_vnodeops;
 
 const fs_operation_def_t nfs_vnodeops_template[] = {
-	VOPNAME_OPEN, nfs_open,
-	VOPNAME_CLOSE, nfs_close,
-	VOPNAME_READ, nfs_read,
-	VOPNAME_WRITE, nfs_write,
-	VOPNAME_IOCTL, nfs_ioctl,
-	VOPNAME_GETATTR, nfs_getattr,
-	VOPNAME_SETATTR, nfs_setattr,
-	VOPNAME_ACCESS, nfs_access,
-	VOPNAME_LOOKUP, nfs_lookup,
-	VOPNAME_CREATE, nfs_create,
-	VOPNAME_REMOVE, nfs_remove,
-	VOPNAME_LINK, nfs_link,
-	VOPNAME_RENAME, nfs_rename,
-	VOPNAME_MKDIR, nfs_mkdir,
-	VOPNAME_RMDIR, nfs_rmdir,
-	VOPNAME_READDIR, nfs_readdir,
-	VOPNAME_SYMLINK, nfs_symlink,
-	VOPNAME_READLINK, nfs_readlink,
-	VOPNAME_FSYNC, nfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) nfs_inactive,
-	VOPNAME_FID, nfs_fid,
-	VOPNAME_RWLOCK, nfs_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) nfs_rwunlock,
-	VOPNAME_SEEK, nfs_seek,
-	VOPNAME_FRLOCK, nfs_frlock,
-	VOPNAME_SPACE, nfs_space,
-	VOPNAME_REALVP, nfs_realvp,
-	VOPNAME_GETPAGE, nfs_getpage,
-	VOPNAME_PUTPAGE, nfs_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) nfs_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) nfs_addmap,
-	VOPNAME_DELMAP, nfs_delmap,
-	VOPNAME_DUMP, nfs_dump,
-	VOPNAME_PATHCONF, nfs_pathconf,
-	VOPNAME_PAGEIO, nfs_pageio,
-	VOPNAME_SETSECATTR, nfs_setsecattr,
-	VOPNAME_GETSECATTR, nfs_getsecattr,
-	VOPNAME_SHRLOCK, nfs_shrlock,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = nfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = nfs_close },
+	VOPNAME_READ,		{ .vop_read = nfs_read },
+	VOPNAME_WRITE,		{ .vop_write = nfs_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = nfs_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = nfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = nfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = nfs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = nfs_lookup },
+	VOPNAME_CREATE,		{ .vop_create = nfs_create },
+	VOPNAME_REMOVE,		{ .vop_remove = nfs_remove },
+	VOPNAME_LINK,		{ .vop_link = nfs_link },
+	VOPNAME_RENAME,		{ .vop_rename = nfs_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = nfs_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = nfs_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = nfs_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = nfs_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = nfs_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = nfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = nfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = nfs_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = nfs_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = nfs_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = nfs_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = nfs_frlock },
+	VOPNAME_SPACE,		{ .vop_space = nfs_space },
+	VOPNAME_REALVP,		{ .vop_realvp = nfs_realvp },
+	VOPNAME_GETPAGE,	{ .vop_getpage = nfs_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = nfs_putpage },
+	VOPNAME_MAP,		{ .vop_map = nfs_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = nfs_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = nfs_delmap },
+	VOPNAME_DUMP,		{ .vop_dump = nfs_dump },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = nfs_pathconf },
+	VOPNAME_PAGEIO,		{ .vop_pageio = nfs_pageio },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = nfs_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = nfs_getsecattr },
+	VOPNAME_SHRLOCK,	{ .vop_shrlock = nfs_shrlock },
+	NULL,			NULL
 };
 
 /*
--- a/usr/src/uts/common/fs/objfs/objfs_data.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/objfs/objfs_data.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -38,6 +37,7 @@
 #include <sys/stat.h>
 #include <sys/systm.h>
 #include <sys/sysmacros.h>
+#include <sys/vfs_opreg.h>
 
 /*
  * /system/object/<obj>/object
@@ -751,14 +751,14 @@
 }
 
 const fs_operation_def_t objfs_tops_data[] = {
-	{ VOPNAME_OPEN,		objfs_data_open },
-	{ VOPNAME_CLOSE,	objfs_common_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	objfs_data_getattr },
-	{ VOPNAME_ACCESS,	objfs_data_access },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
-	{ VOPNAME_READ,		objfs_data_read },
-	{ VOPNAME_SEEK,		objfs_data_seek },
-	{ VOPNAME_MAP,		(fs_generic_func_p) gfs_vop_map },
+	{ VOPNAME_OPEN,		{ .vop_open = objfs_data_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = objfs_common_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = objfs_data_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = objfs_data_access } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
+	{ VOPNAME_READ,		{ .vop_read = objfs_data_read } },
+	{ VOPNAME_SEEK,		{ .vop_seek = objfs_data_seek } },
+	{ VOPNAME_MAP,		{ .vop_map = gfs_vop_map } },
 	{ NULL }
 };
--- a/usr/src/uts/common/fs/objfs/objfs_odir.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/objfs/objfs_odir.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -32,6 +31,7 @@
 #include <sys/modctl.h>
 #include <sys/objfs.h>
 #include <sys/objfs_impl.h>
+#include <sys/vfs_opreg.h>
 #include <sys/stat.h>
 
 static gfs_dirent_t objfs_odir_entries[] = {
@@ -78,14 +78,14 @@
 }
 
 const fs_operation_def_t objfs_tops_odir[] = {
-	{ VOPNAME_OPEN,		objfs_dir_open },
-	{ VOPNAME_CLOSE,	objfs_common_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	objfs_odir_getattr },
-	{ VOPNAME_ACCESS,	objfs_dir_access },
-	{ VOPNAME_READDIR,	gfs_vop_readdir },
-	{ VOPNAME_LOOKUP,	gfs_vop_lookup },
-	{ VOPNAME_SEEK,		fs_seek },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = objfs_dir_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = objfs_common_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = objfs_odir_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = objfs_dir_access } },
+	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir } },
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = gfs_vop_lookup } },
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL }
 };
--- a/usr/src/uts/common/fs/objfs/objfs_root.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/objfs/objfs_root.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -34,6 +33,7 @@
 #include <sys/modctl.h>
 #include <sys/objfs.h>
 #include <sys/objfs_impl.h>
+#include <sys/vfs_opreg.h>
 #include <sys/systm.h>
 
 extern int last_module_id;
@@ -156,14 +156,14 @@
 }
 
 const fs_operation_def_t objfs_tops_root[] = {
-	{ VOPNAME_OPEN,		objfs_dir_open },
-	{ VOPNAME_CLOSE,	objfs_common_close },
-	{ VOPNAME_IOCTL,	fs_inval },
-	{ VOPNAME_GETATTR,	objfs_root_getattr },
-	{ VOPNAME_ACCESS,	objfs_dir_access },
-	{ VOPNAME_READDIR,	objfs_root_readdir },
-	{ VOPNAME_LOOKUP,	gfs_vop_lookup },
-	{ VOPNAME_SEEK,		fs_seek },
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p)gfs_vop_inactive },
+	{ VOPNAME_OPEN,		{ .vop_open = objfs_dir_open } },
+	{ VOPNAME_CLOSE,	{ .vop_close = objfs_common_close } },
+	{ VOPNAME_IOCTL,	{ .error = fs_inval } },
+	{ VOPNAME_GETATTR,	{ .vop_getattr = objfs_root_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = objfs_dir_access } },
+	{ VOPNAME_READDIR,	{ .vop_readdir = objfs_root_readdir } },
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = gfs_vop_lookup } },
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek } },
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive } },
 	{ NULL }
 };
--- a/usr/src/uts/common/fs/objfs/objfs_vfs.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/objfs/objfs_vfs.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -32,6 +31,7 @@
 #include <sys/mount.h>
 #include <sys/objfs.h>
 #include <sys/objfs_impl.h>
+#include <sys/vfs_opreg.h>
 #include <sys/policy.h>
 #include <sys/sunddi.h>
 #include <sys/sysmacros.h>
@@ -267,9 +267,9 @@
 }
 
 static const fs_operation_def_t objfs_vfstops[] = {
-	{ VFSNAME_MOUNT,	objfs_mount },
-	{ VFSNAME_UNMOUNT,	objfs_unmount },
-	{ VFSNAME_ROOT,		objfs_root },
-	{ VFSNAME_STATVFS,	objfs_statvfs },
+	{ VFSNAME_MOUNT,	{ .vfs_mount = objfs_mount } },
+	{ VFSNAME_UNMOUNT,	{ .vfs_unmount = objfs_unmount } },
+	{ VFSNAME_ROOT,		{ .vfs_root = objfs_root } },
+	{ VFSNAME_STATVFS,	{ .vfs_statvfs = objfs_statvfs } },
 	{ NULL }
 };
--- a/usr/src/uts/common/fs/pcfs/pc_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/pcfs/pc_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -34,6 +34,7 @@
 #include <sys/disp.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/fdio.h>
 #include <sys/file.h>
@@ -225,14 +226,14 @@
 pcfsinit(int fstype, char *name)
 {
 	static const fs_operation_def_t pcfs_vfsops_template[] = {
-		VFSNAME_MOUNT, pcfs_mount,
-		VFSNAME_UNMOUNT, pcfs_unmount,
-		VFSNAME_ROOT, pcfs_root,
-		VFSNAME_STATVFS, pcfs_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) pcfs_sync,
-		VFSNAME_VGET, pcfs_vget,
-		VFSNAME_FREEVFS, (fs_generic_func_p) pcfs_freevfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = pcfs_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = pcfs_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = pcfs_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = pcfs_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = pcfs_sync },
+		VFSNAME_VGET,		{ .vfs_vget = pcfs_vget },
+		VFSNAME_FREEVFS,	{ .vfs_freevfs = pcfs_freevfs },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/pcfs/pc_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/pcfs/pc_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -33,6 +33,7 @@
 #include <sys/buf.h>
 #include <sys/stat.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/dirent.h>
 #include <sys/vnode.h>
 #include <sys/proc.h>
@@ -123,48 +124,48 @@
 struct vnodeops *pcfs_dvnodeops;
 
 const fs_operation_def_t pcfs_fvnodeops_template[] = {
-	VOPNAME_OPEN, pcfs_open,
-	VOPNAME_CLOSE, pcfs_close,
-	VOPNAME_READ, pcfs_read,
-	VOPNAME_WRITE, pcfs_write,
-	VOPNAME_GETATTR, pcfs_getattr,
-	VOPNAME_SETATTR, pcfs_setattr,
-	VOPNAME_ACCESS, pcfs_access,
-	VOPNAME_FSYNC, pcfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) pcfs_inactive,
-	VOPNAME_FID, pcfs_fid,
-	VOPNAME_SEEK, pcfs_seek,
-	VOPNAME_SPACE, pcfs_space,
-	VOPNAME_GETPAGE, pcfs_getpage,
-	VOPNAME_PUTPAGE, pcfs_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) pcfs_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) pcfs_addmap,
-	VOPNAME_DELMAP, pcfs_delmap,
-	VOPNAME_PATHCONF, pcfs_pathconf,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = pcfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = pcfs_close },
+	VOPNAME_READ,		{ .vop_read = pcfs_read },
+	VOPNAME_WRITE,		{ .vop_write = pcfs_write },
+	VOPNAME_GETATTR,	{ .vop_getattr = pcfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = pcfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = pcfs_access },
+	VOPNAME_FSYNC,		{ .vop_fsync = pcfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = pcfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = pcfs_fid },
+	VOPNAME_SEEK,		{ .vop_seek = pcfs_seek },
+	VOPNAME_SPACE,		{ .vop_space = pcfs_space },
+	VOPNAME_GETPAGE,	{ .vop_getpage = pcfs_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = pcfs_putpage },
+	VOPNAME_MAP,		{ .vop_map = pcfs_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = pcfs_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = pcfs_delmap },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = pcfs_pathconf },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
 
 const fs_operation_def_t pcfs_dvnodeops_template[] = {
-	VOPNAME_OPEN, pcfs_open,
-	VOPNAME_CLOSE, pcfs_close,
-	VOPNAME_GETATTR, pcfs_getattr,
-	VOPNAME_SETATTR, pcfs_setattr,
-	VOPNAME_ACCESS, pcfs_access,
-	VOPNAME_LOOKUP, pcfs_lookup,
-	VOPNAME_CREATE, pcfs_create,
-	VOPNAME_REMOVE, pcfs_remove,
-	VOPNAME_RENAME, pcfs_rename,
-	VOPNAME_MKDIR, pcfs_mkdir,
-	VOPNAME_RMDIR, pcfs_rmdir,
-	VOPNAME_READDIR, pcfs_readdir,
-	VOPNAME_FSYNC, pcfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) pcfs_inactive,
-	VOPNAME_FID, pcfs_fid,
-	VOPNAME_SEEK, pcfs_seek,
-	VOPNAME_PATHCONF, pcfs_pathconf,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = pcfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = pcfs_close },
+	VOPNAME_GETATTR,	{ .vop_getattr = pcfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = pcfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = pcfs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = pcfs_lookup },
+	VOPNAME_CREATE,		{ .vop_create = pcfs_create },
+	VOPNAME_REMOVE,		{ .vop_remove = pcfs_remove },
+	VOPNAME_RENAME,		{ .vop_rename = pcfs_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = pcfs_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = pcfs_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = pcfs_readdir },
+	VOPNAME_FSYNC,		{ .vop_fsync = pcfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = pcfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = pcfs_fid },
+	VOPNAME_SEEK,		{ .vop_seek = pcfs_seek },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = pcfs_pathconf },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
 
 
--- a/usr/src/uts/common/fs/portfs/port.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/portfs/port.c	Mon Mar 26 17:41:06 2007 -0700
@@ -31,6 +31,7 @@
 #include <sys/cred.h>
 #include <sys/modctl.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/sysmacros.h>
 #include <sys/cmn_err.h>
 #include <sys/stat.h>
--- a/usr/src/uts/common/fs/portfs/port_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/portfs/port_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -28,6 +28,7 @@
 
 #include <sys/types.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/kmem.h>
 #include <fs/fs_subr.h>
 #include <sys/proc.h>
@@ -44,19 +45,19 @@
 static void port_inactive(struct vnode *, cred_t *);
 
 const fs_operation_def_t port_vnodeops_template[] = {
-	VOPNAME_OPEN, port_open,
-	VOPNAME_CLOSE, port_close,
-	VOPNAME_GETATTR, port_getattr,
-	VOPNAME_ACCESS, port_access,
-	VOPNAME_INACTIVE, (fs_generic_func_p) port_inactive,
-	VOPNAME_FRLOCK, fs_error,
-	VOPNAME_REALVP, port_realvp,
-	VOPNAME_POLL, (fs_generic_func_p) port_poll,
-	VOPNAME_PATHCONF, fs_error,
-	VOPNAME_DISPOSE, fs_error,
-	VOPNAME_GETSECATTR, fs_error,
-	VOPNAME_SHRLOCK, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = port_open },
+	VOPNAME_CLOSE,		{ .vop_close = port_close },
+	VOPNAME_GETATTR,	{ .vop_getattr = port_getattr },
+	VOPNAME_ACCESS,		{ .vop_access = port_access },
+	VOPNAME_INACTIVE,	{ .vop_inactive = port_inactive },
+	VOPNAME_FRLOCK,		{ .error = fs_error },
+	VOPNAME_REALVP,		{ .vop_realvp = port_realvp },
+	VOPNAME_POLL,		{ .vop_poll = port_poll },
+	VOPNAME_PATHCONF,	{ .error = fs_error },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	VOPNAME_GETSECATTR,	{ .error = fs_error },
+	VOPNAME_SHRLOCK,	{ .error = fs_error },
+	NULL,			NULL
 };
 
 /* ARGSUSED */
--- a/usr/src/uts/common/fs/proc/prvfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/proc/prvfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -44,6 +44,7 @@
 #include <sys/zone.h>
 #include <sys/var.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
 #include <sys/signal.h>
@@ -143,11 +144,11 @@
 prinit(int fstype, char *name)
 {
 	static const fs_operation_def_t pr_vfsops_template[] = {
-		VFSNAME_MOUNT, prmount,
-		VFSNAME_UNMOUNT, prunmount,
-		VFSNAME_ROOT, prroot,
-		VFSNAME_STATVFS, prstatvfs,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = prmount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = prunmount },
+		VFSNAME_ROOT,		{ .vfs_root = prroot },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = prstatvfs },
+		NULL,			NULL
 	};
 	extern const fs_operation_def_t pr_vnodeops_template[];
 	int error;
--- a/usr/src/uts/common/fs/proc/prvnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/proc/prvnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -53,6 +53,7 @@
 #include <sys/poll.h>
 #include <sys/user.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/vnode.h>
 #include <sys/fault.h>
@@ -5927,25 +5928,25 @@
  * /proc vnode operations vector
  */
 const fs_operation_def_t pr_vnodeops_template[] = {
-	VOPNAME_OPEN, propen,
-	VOPNAME_CLOSE, prclose,
-	VOPNAME_READ, prread,
-	VOPNAME_WRITE, prwrite,
-	VOPNAME_IOCTL, prioctl,
-	VOPNAME_GETATTR, prgetattr,
-	VOPNAME_ACCESS, praccess,
-	VOPNAME_LOOKUP, prlookup,
-	VOPNAME_CREATE, prcreate,
-	VOPNAME_READDIR, prreaddir,
-	VOPNAME_READLINK, prreadlink,
-	VOPNAME_FSYNC, prfsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) prinactive,
-	VOPNAME_SEEK, prseek,
-	VOPNAME_CMP, prcmp,
-	VOPNAME_FRLOCK, fs_error,
-	VOPNAME_REALVP, prrealvp,
-	VOPNAME_POLL, (fs_generic_func_p) prpoll,
-	VOPNAME_DISPOSE, fs_error,
-	VOPNAME_SHRLOCK, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = propen },
+	VOPNAME_CLOSE,		{ .vop_close = prclose },
+	VOPNAME_READ,		{ .vop_read = prread },
+	VOPNAME_WRITE,		{ .vop_write = prwrite },
+	VOPNAME_IOCTL,		{ .vop_ioctl = prioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = prgetattr },
+	VOPNAME_ACCESS,		{ .vop_access = praccess },
+	VOPNAME_LOOKUP,		{ .vop_lookup = prlookup },
+	VOPNAME_CREATE,		{ .vop_create = prcreate },
+	VOPNAME_READDIR,	{ .vop_readdir = prreaddir },
+	VOPNAME_READLINK,	{ .vop_readlink = prreadlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = prfsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = prinactive },
+	VOPNAME_SEEK,		{ .vop_seek = prseek },
+	VOPNAME_CMP,		{ .vop_cmp = prcmp },
+	VOPNAME_FRLOCK,		{ .error = fs_error },
+	VOPNAME_REALVP,		{ .vop_realvp = prrealvp },
+	VOPNAME_POLL,		{ .vop_poll = prpoll },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	VOPNAME_SHRLOCK,	{ .error = fs_error },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/sockfs/socksctp.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksctp.c	Mon Mar 26 17:41:06 2007 -0700
@@ -32,6 +32,7 @@
 #include <sys/systm.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/debug.h>
 #include <sys/errno.h>
--- a/usr/src/uts/common/fs/sockfs/socksctpsubr.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksctpsubr.c	Mon Mar 26 17:41:06 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -37,6 +37,7 @@
 #include <sys/sysmacros.h>
 
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 
 #include <sys/socket.h>
 #include <sys/socketvar.h>
--- a/usr/src/uts/common/fs/sockfs/socksctpvnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksctpvnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -35,6 +35,7 @@
 #include <sys/errno.h>
 #include <sys/uio.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/stropts.h>
 #include <sys/cmn_err.h>
@@ -78,22 +79,22 @@
     struct pollhead **);
 
 const fs_operation_def_t socksctp_vnodeops_template[] = {
-	VOPNAME_OPEN, socksctpv_open,
-	VOPNAME_CLOSE, socksctpv_close,
-	VOPNAME_READ, socksctpv_read,
-	VOPNAME_WRITE, socksctpv_write,
-	VOPNAME_IOCTL, socksctpv_ioctl,
-	VOPNAME_SETFL, socksctp_setfl,
-	VOPNAME_GETATTR, socktpi_getattr,
-	VOPNAME_SETATTR, socktpi_setattr,
-	VOPNAME_ACCESS, socktpi_access,
-	VOPNAME_FSYNC, socktpi_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) socksctpv_inactive,
-	VOPNAME_FID, socktpi_fid,
-	VOPNAME_SEEK, socktpi_seek,
-	VOPNAME_POLL, (fs_generic_func_p) socksctpv_poll,
-	VOPNAME_DISPOSE, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = socksctpv_open },
+	VOPNAME_CLOSE,		{ .vop_close = socksctpv_close },
+	VOPNAME_READ,		{ .vop_read = socksctpv_read },
+	VOPNAME_WRITE,		{ .vop_write = socksctpv_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = socksctpv_ioctl },
+	VOPNAME_SETFL,		{ .vop_setfl = socksctp_setfl },
+	VOPNAME_GETATTR,	{ .vop_getattr = socktpi_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = socktpi_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = socktpi_access },
+	VOPNAME_FSYNC,		{ .vop_fsync = socktpi_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = socksctpv_inactive },
+	VOPNAME_FID,		{ .vop_fid = socktpi_fid },
+	VOPNAME_SEEK,		{ .vop_seek = socktpi_seek },
+	VOPNAME_POLL,		{ .vop_poll = socksctpv_poll },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	NULL,			NULL
 };
 struct vnodeops *socksctp_vnodeops;
 
--- a/usr/src/uts/common/fs/sockfs/socksdp.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksdp.c	Mon Mar 26 17:41:06 2007 -0700
@@ -32,6 +32,7 @@
 #include <sys/systm.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/debug.h>
 #include <sys/errno.h>
--- a/usr/src/uts/common/fs/sockfs/socksdpsubr.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksdpsubr.c	Mon Mar 26 17:41:06 2007 -0700
@@ -37,6 +37,7 @@
 #include <sys/sysmacros.h>
 
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 
 #include <sys/socket.h>
 #include <sys/socketvar.h>
--- a/usr/src/uts/common/fs/sockfs/socksdpvnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksdpvnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -35,6 +35,7 @@
 #include <sys/errno.h>
 #include <sys/uio.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/stropts.h>
 #include <sys/cmn_err.h>
@@ -77,22 +78,22 @@
     struct pollhead **);
 
 const fs_operation_def_t socksdp_vnodeops_template[] = {
-	VOPNAME_OPEN, socksdpv_open,
-	VOPNAME_CLOSE, socksdpv_close,
-	VOPNAME_READ, socksdpv_read,
-	VOPNAME_WRITE, socksdpv_write,
-	VOPNAME_IOCTL, socksdpv_ioctl,
-	VOPNAME_SETFL, socksdp_setfl,
-	VOPNAME_GETATTR, socktpi_getattr,
-	VOPNAME_SETATTR, socktpi_setattr,
-	VOPNAME_ACCESS, socktpi_access,
-	VOPNAME_FSYNC, socktpi_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) socksdpv_inactive,
-	VOPNAME_FID, socktpi_fid,
-	VOPNAME_SEEK, socktpi_seek,
-	VOPNAME_POLL, (fs_generic_func_p) socksdpv_poll,
-	VOPNAME_DISPOSE, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = socksdpv_open },
+	VOPNAME_CLOSE,		{ .vop_close = socksdpv_close },
+	VOPNAME_READ,		{ .vop_read = socksdpv_read },
+	VOPNAME_WRITE,		{ .vop_write = socksdpv_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = socksdpv_ioctl },
+	VOPNAME_SETFL,		{ .vop_setfl = socksdp_setfl },
+	VOPNAME_GETATTR,	{ .vop_getattr = socktpi_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = socktpi_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = socktpi_access },
+	VOPNAME_FSYNC,		{ .vop_fsync = socktpi_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = socksdpv_inactive },
+	VOPNAME_FID,		{ .vop_fid = socktpi_fid },
+	VOPNAME_SEEK,		{ .vop_seek = socktpi_seek },
+	VOPNAME_POLL,		{ .vop_poll = socksdpv_poll },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	NULL,			NULL
 };
 struct vnodeops *socksdp_vnodeops;
 
--- a/usr/src/uts/common/fs/sockfs/socksubr.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/socksubr.c	Mon Mar 26 17:41:06 2007 -0700
@@ -36,6 +36,7 @@
 #include <sys/kmem.h>
 #include <sys/sysmacros.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/debug.h>
 #include <sys/errno.h>
--- a/usr/src/uts/common/fs/sockfs/sockvnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/sockfs/sockvnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -48,6 +48,7 @@
 #include <sys/sysmacros.h>
 #include <sys/uio.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/poll.h>
 #include <sys/stropts.h>
@@ -108,22 +109,22 @@
 struct vnodeops *socktpi_vnodeops;
 
 const fs_operation_def_t socktpi_vnodeops_template[] = {
-	VOPNAME_OPEN, socktpi_open,
-	VOPNAME_CLOSE, socktpi_close,
-	VOPNAME_READ, socktpi_read,
-	VOPNAME_WRITE, socktpi_write,
-	VOPNAME_IOCTL, socktpi_ioctl,
-	VOPNAME_SETFL, socktpi_setfl,
-	VOPNAME_GETATTR, socktpi_getattr,
-	VOPNAME_SETATTR, socktpi_setattr,
-	VOPNAME_ACCESS, socktpi_access,
-	VOPNAME_FSYNC, socktpi_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) socktpi_inactive,
-	VOPNAME_FID, socktpi_fid,
-	VOPNAME_SEEK, socktpi_seek,
-	VOPNAME_POLL, (fs_generic_func_p) socktpi_poll,
-	VOPNAME_DISPOSE, fs_error,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = socktpi_open },
+	VOPNAME_CLOSE,		{ .vop_close = socktpi_close },
+	VOPNAME_READ,		{ .vop_read = socktpi_read },
+	VOPNAME_WRITE,		{ .vop_write = socktpi_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = socktpi_ioctl },
+	VOPNAME_SETFL,		{ .vop_setfl = socktpi_setfl },
+	VOPNAME_GETATTR,	{ .vop_getattr = socktpi_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = socktpi_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = socktpi_access },
+	VOPNAME_FSYNC,		{ .vop_fsync = socktpi_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = socktpi_inactive },
+	VOPNAME_FID,		{ .vop_fid = socktpi_fid },
+	VOPNAME_SEEK,		{ .vop_seek = socktpi_seek },
+	VOPNAME_POLL,		{ .vop_poll = socktpi_poll },
+	VOPNAME_DISPOSE,	{ .error = fs_error },
+	NULL,			NULL
 };
 
 /*
--- a/usr/src/uts/common/fs/specfs/specsubr.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/specfs/specsubr.c	Mon Mar 26 17:41:06 2007 -0700
@@ -49,6 +49,7 @@
 #include <sys/kmem.h>
 #include <sys/sysmacros.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/fs/snode.h>
 #include <sys/fs/fifonode.h>
@@ -736,7 +737,7 @@
 specinit(int fstype, char *name)
 {
 	static const fs_operation_def_t spec_vfsops_template[] = {
-		VFSNAME_SYNC, (fs_generic_func_p) spec_sync,
+		VFSNAME_SYNC, { .vfs_sync = spec_sync },
 		NULL, NULL
 	};
 	extern struct vnodeops *spec_vnodeops;
--- a/usr/src/uts/common/fs/specfs/specvnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/specfs/specvnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -63,6 +63,7 @@
 #include <sys/sysmacros.h>
 #include <sys/uio.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/stat.h>
 #include <sys/poll.h>
@@ -155,33 +156,33 @@
 struct vnodeops *spec_vnodeops;
 
 const fs_operation_def_t spec_vnodeops_template[] = {
-	VOPNAME_OPEN, spec_open,
-	VOPNAME_CLOSE, spec_close,
-	VOPNAME_READ, spec_read,
-	VOPNAME_WRITE, spec_write,
-	VOPNAME_IOCTL, spec_ioctl,
-	VOPNAME_GETATTR, spec_getattr,
-	VOPNAME_SETATTR, spec_setattr,
-	VOPNAME_ACCESS, spec_access,
-	VOPNAME_CREATE, spec_create,
-	VOPNAME_FSYNC, spec_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) spec_inactive,
-	VOPNAME_FID, spec_fid,
-	VOPNAME_SEEK, spec_seek,
-	VOPNAME_PATHCONF, spec_pathconf,
-	VOPNAME_FRLOCK, spec_frlock,
-	VOPNAME_REALVP, spec_realvp,
-	VOPNAME_GETPAGE, spec_getpage,
-	VOPNAME_PUTPAGE, spec_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) spec_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) spec_addmap,
-	VOPNAME_DELMAP, spec_delmap,
-	VOPNAME_POLL, (fs_generic_func_p) spec_poll,
-	VOPNAME_DUMP, spec_dump,
-	VOPNAME_PAGEIO, spec_pageio,
-	VOPNAME_SETSECATTR, spec_setsecattr,
-	VOPNAME_GETSECATTR, spec_getsecattr,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = spec_open },
+	VOPNAME_CLOSE,		{ .vop_close = spec_close },
+	VOPNAME_READ,		{ .vop_read = spec_read },
+	VOPNAME_WRITE,		{ .vop_write = spec_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = spec_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = spec_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = spec_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = spec_access },
+	VOPNAME_CREATE,		{ .vop_create = spec_create },
+	VOPNAME_FSYNC,		{ .vop_fsync = spec_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = spec_inactive },
+	VOPNAME_FID,		{ .vop_fid = spec_fid },
+	VOPNAME_SEEK,		{ .vop_seek = spec_seek },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = spec_pathconf },
+	VOPNAME_FRLOCK,		{ .vop_frlock = spec_frlock },
+	VOPNAME_REALVP,		{ .vop_realvp = spec_realvp },
+	VOPNAME_GETPAGE,	{ .vop_getpage = spec_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = spec_putpage },
+	VOPNAME_MAP,		{ .vop_map = spec_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = spec_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = spec_delmap },
+	VOPNAME_POLL,		{ .vop_poll = spec_poll },
+	VOPNAME_DUMP,		{ .vop_dump = spec_dump },
+	VOPNAME_PAGEIO,		{ .vop_pageio = spec_pageio },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = spec_setsecattr },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = spec_getsecattr },
+	NULL,			NULL
 };
 
 /*
--- a/usr/src/uts/common/fs/swapfs/swap_subr.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/swapfs/swap_subr.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -32,6 +31,7 @@
 #include <sys/errno.h>
 #include <sys/kmem.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/swap.h>
 #include <sys/sysmacros.h>
 #include <sys/buf.h>
@@ -167,7 +167,7 @@
 	int i, error;
 
 	static const fs_operation_def_t swap_vfsops[] = {
-		VFSNAME_SYNC, (fs_generic_func_p) swap_sync,
+		VFSNAME_SYNC, { .vfs_sync = swap_sync },
 		NULL, NULL
 	};
 
--- a/usr/src/uts/common/fs/swapfs/swap_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/swapfs/swap_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -32,6 +32,7 @@
 #include <sys/cred.h>
 #include <sys/errno.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/cmn_err.h>
 #include <sys/swap.h>
 #include <sys/mman.h>
@@ -75,16 +76,16 @@
     size_t *lenp, int flags, struct cred *cr);
 
 const fs_operation_def_t swap_vnodeops_template[] = {
-	VOPNAME_INACTIVE, (fs_generic_func_p) swap_inactive,
-	VOPNAME_GETPAGE, swap_getpage,
-	VOPNAME_PUTPAGE, swap_putpage,
-	VOPNAME_DISPOSE, (fs_generic_func_p) swap_dispose,
-	VOPNAME_SETFL, fs_error,
-	VOPNAME_POLL, fs_error,
-	VOPNAME_PATHCONF, fs_error,
-	VOPNAME_GETSECATTR, fs_error,
-	VOPNAME_SHRLOCK, fs_error,
-	NULL, NULL
+	VOPNAME_INACTIVE,	{ .vop_inactive = swap_inactive },
+	VOPNAME_GETPAGE,	{ .vop_getpage = swap_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = swap_putpage },
+	VOPNAME_DISPOSE,	{ .vop_dispose = swap_dispose },
+	VOPNAME_SETFL,		{ .error = fs_error },
+	VOPNAME_POLL,		{ .error = fs_error },
+	VOPNAME_PATHCONF,	{ .error = fs_error },
+	VOPNAME_GETSECATTR,	{ .error = fs_error },
+	VOPNAME_SHRLOCK,	{ .error = fs_error },
+	NULL,			NULL
 };
 
 vnodeops_t *swap_vnodeops;
--- a/usr/src/uts/common/fs/tmpfs/tmp_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/tmpfs/tmp_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -32,6 +32,7 @@
 #include <sys/time.h>
 #include <sys/pathname.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/stat.h>
 #include <sys/uio.h>
@@ -173,12 +174,12 @@
 tmpfsinit(int fstype, char *name)
 {
 	static const fs_operation_def_t tmp_vfsops_template[] = {
-		VFSNAME_MOUNT, tmp_mount,
-		VFSNAME_UNMOUNT, tmp_unmount,
-		VFSNAME_ROOT, tmp_root,
-		VFSNAME_STATVFS, tmp_statvfs,
-		VFSNAME_VGET, tmp_vget,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = tmp_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = tmp_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = tmp_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = tmp_statvfs },
+		VFSNAME_VGET,		{ .vfs_vget = tmp_vget },
+		NULL,			NULL
 	};
 	int error;
 	extern  void    tmpfs_hash_init();
--- a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -33,6 +33,7 @@
 #include <sys/user.h>
 #include <sys/time.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/file.h>
 #include <sys/fcntl.h>
@@ -2304,37 +2305,37 @@
 struct vnodeops *tmp_vnodeops;
 
 const fs_operation_def_t tmp_vnodeops_template[] = {
-	VOPNAME_OPEN, tmp_open,
-	VOPNAME_CLOSE, tmp_close,
-	VOPNAME_READ, tmp_read,
-	VOPNAME_WRITE, tmp_write,
-	VOPNAME_IOCTL, tmp_ioctl,
-	VOPNAME_GETATTR, tmp_getattr,
-	VOPNAME_SETATTR, tmp_setattr,
-	VOPNAME_ACCESS, tmp_access,
-	VOPNAME_LOOKUP, tmp_lookup,
-	VOPNAME_CREATE, tmp_create,
-	VOPNAME_REMOVE, tmp_remove,
-	VOPNAME_LINK, tmp_link,
-	VOPNAME_RENAME, tmp_rename,
-	VOPNAME_MKDIR, tmp_mkdir,
-	VOPNAME_RMDIR, tmp_rmdir,
-	VOPNAME_READDIR, tmp_readdir,
-	VOPNAME_SYMLINK, tmp_symlink,
-	VOPNAME_READLINK, tmp_readlink,
-	VOPNAME_FSYNC, tmp_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) tmp_inactive,
-	VOPNAME_FID, tmp_fid,
-	VOPNAME_RWLOCK, tmp_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) tmp_rwunlock,
-	VOPNAME_SEEK, tmp_seek,
-	VOPNAME_SPACE, tmp_space,
-	VOPNAME_GETPAGE, tmp_getpage,
-	VOPNAME_PUTPAGE, tmp_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) tmp_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) tmp_addmap,
-	VOPNAME_DELMAP, tmp_delmap,
-	VOPNAME_PATHCONF, tmp_pathconf,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = tmp_open },
+	VOPNAME_CLOSE,		{ .vop_close = tmp_close },
+	VOPNAME_READ,		{ .vop_read = tmp_read },
+	VOPNAME_WRITE,		{ .vop_write = tmp_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = tmp_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = tmp_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = tmp_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = tmp_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = tmp_lookup },
+	VOPNAME_CREATE,		{ .vop_create = tmp_create },
+	VOPNAME_REMOVE,		{ .vop_remove = tmp_remove },
+	VOPNAME_LINK,		{ .vop_link = tmp_link },
+	VOPNAME_RENAME,		{ .vop_rename = tmp_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = tmp_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = tmp_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = tmp_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = tmp_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = tmp_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = tmp_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = tmp_inactive },
+	VOPNAME_FID,		{ .vop_fid = tmp_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = tmp_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = tmp_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = tmp_seek },
+	VOPNAME_SPACE,		{ .vop_space = tmp_space },
+	VOPNAME_GETPAGE,	{ .vop_getpage = tmp_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = tmp_putpage },
+	VOPNAME_MAP,		{ .vop_map = tmp_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = tmp_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = tmp_delmap },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = tmp_pathconf },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/udfs/udf_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/udfs/udf_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -37,6 +37,7 @@
 #include <sys/user.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/stat.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
@@ -1897,14 +1898,14 @@
 udfinit(int fstype, char *name)
 {
 	static const fs_operation_def_t udf_vfsops_template[] = {
-		VFSNAME_MOUNT, udf_mount,
-		VFSNAME_UNMOUNT, udf_unmount,
-		VFSNAME_ROOT, udf_root,
-		VFSNAME_STATVFS, udf_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) udf_sync,
-		VFSNAME_VGET, udf_vget,
-		VFSNAME_MOUNTROOT, udf_mountroot,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = udf_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = udf_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = udf_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = udf_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = udf_sync },
+		VFSNAME_VGET,		{ .vfs_vget = udf_vget },
+		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = udf_mountroot },
+		NULL,			NULL
 	};
 	extern struct vnodeops *udf_vnodeops;
 	extern const fs_operation_def_t udf_vnodeops_template[];
--- a/usr/src/uts/common/fs/udfs/udf_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/udfs/udf_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -38,6 +37,7 @@
 #include <sys/user.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/stat.h>
 #include <sys/vnode.h>
 #include <sys/mode.h>
@@ -188,41 +188,41 @@
 struct vnodeops *udf_vnodeops;
 
 const fs_operation_def_t udf_vnodeops_template[] = {
-	VOPNAME_OPEN, udf_open,
-	VOPNAME_CLOSE, udf_close,
-	VOPNAME_READ, udf_read,
-	VOPNAME_WRITE, udf_write,
-	VOPNAME_IOCTL, udf_ioctl,
-	VOPNAME_GETATTR, udf_getattr,
-	VOPNAME_SETATTR, udf_setattr,
-	VOPNAME_ACCESS, udf_access,
-	VOPNAME_LOOKUP, udf_lookup,
-	VOPNAME_CREATE, udf_create,
-	VOPNAME_REMOVE, udf_remove,
-	VOPNAME_LINK, udf_link,
-	VOPNAME_RENAME, udf_rename,
-	VOPNAME_MKDIR, udf_mkdir,
-	VOPNAME_RMDIR, udf_rmdir,
-	VOPNAME_READDIR, udf_readdir,
-	VOPNAME_SYMLINK, udf_symlink,
-	VOPNAME_READLINK, udf_readlink,
-	VOPNAME_FSYNC, udf_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) udf_inactive,
-	VOPNAME_FID, udf_fid,
-	VOPNAME_RWLOCK, udf_rwlock,
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) udf_rwunlock,
-	VOPNAME_SEEK, udf_seek,
-	VOPNAME_FRLOCK, udf_frlock,
-	VOPNAME_SPACE, udf_space,
-	VOPNAME_GETPAGE, udf_getpage,
-	VOPNAME_PUTPAGE, udf_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) udf_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) udf_addmap,
-	VOPNAME_DELMAP, udf_delmap,
-	VOPNAME_PATHCONF, udf_l_pathconf,
-	VOPNAME_PAGEIO, udf_pageio,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = udf_open },
+	VOPNAME_CLOSE,		{ .vop_close = udf_close },
+	VOPNAME_READ,		{ .vop_read = udf_read },
+	VOPNAME_WRITE,		{ .vop_write = udf_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = udf_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = udf_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = udf_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = udf_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = udf_lookup },
+	VOPNAME_CREATE,		{ .vop_create = udf_create },
+	VOPNAME_REMOVE,		{ .vop_remove = udf_remove },
+	VOPNAME_LINK,		{ .vop_link = udf_link },
+	VOPNAME_RENAME,		{ .vop_rename = udf_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = udf_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = udf_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = udf_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = udf_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = udf_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = udf_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = udf_inactive },
+	VOPNAME_FID,		{ .vop_fid = udf_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = udf_rwlock },
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = udf_rwunlock },
+	VOPNAME_SEEK,		{ .vop_seek = udf_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = udf_frlock },
+	VOPNAME_SPACE,		{ .vop_space = udf_space },
+	VOPNAME_GETPAGE,	{ .vop_getpage = udf_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = udf_putpage },
+	VOPNAME_MAP,		{ .vop_map = udf_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = udf_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = udf_delmap },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = udf_l_pathconf },
+	VOPNAME_PAGEIO,		{ .vop_pageio = udf_pageio },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
 
 /* ARGSUSED */
--- a/usr/src/uts/common/fs/ufs/ufs_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ufs/ufs_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -53,6 +53,7 @@
 #include <sys/buf.h>
 #include <sys/pathname.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/file.h>
 #include <sys/atomic.h>
@@ -2033,14 +2034,14 @@
 ufsinit(int fstype, char *name)
 {
 	static const fs_operation_def_t ufs_vfsops_template[] = {
-		VFSNAME_MOUNT, ufs_mount,
-		VFSNAME_UNMOUNT, ufs_unmount,
-		VFSNAME_ROOT, ufs_root,
-		VFSNAME_STATVFS, ufs_statvfs,
-		VFSNAME_SYNC, (fs_generic_func_p) ufs_sync,
-		VFSNAME_VGET, ufs_vget,
-		VFSNAME_MOUNTROOT, ufs_mountroot,
-		NULL, NULL
+		VFSNAME_MOUNT,		{ .vfs_mount = ufs_mount },
+		VFSNAME_UNMOUNT,	{ .vfs_unmount = ufs_unmount },
+		VFSNAME_ROOT,		{ .vfs_root = ufs_root },
+		VFSNAME_STATVFS,	{ .vfs_statvfs = ufs_statvfs },
+		VFSNAME_SYNC,		{ .vfs_sync = ufs_sync },
+		VFSNAME_VGET,		{ .vfs_vget = ufs_vget },
+		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = ufs_mountroot },
+		NULL,			NULL
 	};
 	int error;
 
--- a/usr/src/uts/common/fs/ufs/ufs_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/ufs/ufs_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -46,6 +46,7 @@
 #include <sys/user.h>
 #include <sys/buf.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/proc.h>
 #include <sys/disp.h>
@@ -171,47 +172,48 @@
  */
 struct vnodeops *ufs_vnodeops;
 
+/* NOTE: "not blkd" below  means that the operation isn't blocked by lockfs */
 const fs_operation_def_t ufs_vnodeops_template[] = {
-	VOPNAME_OPEN, ufs_open,	/* will not be blocked by lockfs */
-	VOPNAME_CLOSE, ufs_close,	/* will not be blocked by lockfs */
-	VOPNAME_READ, ufs_read,
-	VOPNAME_WRITE, ufs_write,
-	VOPNAME_IOCTL, ufs_ioctl,
-	VOPNAME_GETATTR, ufs_getattr,
-	VOPNAME_SETATTR, ufs_setattr,
-	VOPNAME_ACCESS, ufs_access,
-	VOPNAME_LOOKUP, ufs_lookup,
-	VOPNAME_CREATE, ufs_create,
-	VOPNAME_REMOVE, ufs_remove,
-	VOPNAME_LINK, ufs_link,
-	VOPNAME_RENAME, ufs_rename,
-	VOPNAME_MKDIR, ufs_mkdir,
-	VOPNAME_RMDIR, ufs_rmdir,
-	VOPNAME_READDIR, ufs_readdir,
-	VOPNAME_SYMLINK, ufs_symlink,
-	VOPNAME_READLINK, ufs_readlink,
-	VOPNAME_FSYNC, ufs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) ufs_inactive,  /* not blocked */
-	VOPNAME_FID, ufs_fid,
-	VOPNAME_RWLOCK, ufs_rwlock, /* not blocked */
-	VOPNAME_RWUNLOCK, (fs_generic_func_p) ufs_rwunlock,  /* not blocked */
-	VOPNAME_SEEK, ufs_seek,
-	VOPNAME_FRLOCK, ufs_frlock,
-	VOPNAME_SPACE, ufs_space,
-	VOPNAME_GETPAGE, ufs_getpage,
-	VOPNAME_PUTPAGE, ufs_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) ufs_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) ufs_addmap,	/* not blocked */
-	VOPNAME_DELMAP, ufs_delmap,	/* will not be blocked by lockfs */
-	VOPNAME_POLL, (fs_generic_func_p) ufs_poll,	/* not blocked */
-	VOPNAME_DUMP, ufs_dump,
-	VOPNAME_PATHCONF, ufs_l_pathconf,
-	VOPNAME_PAGEIO, ufs_pageio,
-	VOPNAME_DUMPCTL, ufs_dumpctl,
-	VOPNAME_GETSECATTR, ufs_getsecattr,
-	VOPNAME_SETSECATTR, ufs_setsecattr,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = ufs_open },	/* not blkd */
+	VOPNAME_CLOSE,		{ .vop_close = ufs_close },	/* not blkd */
+	VOPNAME_READ,		{ .vop_read = ufs_read },
+	VOPNAME_WRITE,		{ .vop_write = ufs_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = ufs_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = ufs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = ufs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = ufs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = ufs_lookup },
+	VOPNAME_CREATE,		{ .vop_create = ufs_create },
+	VOPNAME_REMOVE,		{ .vop_remove = ufs_remove },
+	VOPNAME_LINK,		{ .vop_link = ufs_link },
+	VOPNAME_RENAME,		{ .vop_rename = ufs_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = ufs_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = ufs_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = ufs_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = ufs_symlink },
+	VOPNAME_READLINK,	{ .vop_readlink = ufs_readlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = ufs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = ufs_inactive }, /* not blkd */
+	VOPNAME_FID,		{ .vop_fid = ufs_fid },
+	VOPNAME_RWLOCK,		{ .vop_rwlock = ufs_rwlock },	/* not blkd */
+	VOPNAME_RWUNLOCK,	{ .vop_rwunlock = ufs_rwunlock }, /* not blkd */
+	VOPNAME_SEEK,		{ .vop_seek = ufs_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = ufs_frlock },
+	VOPNAME_SPACE,		{ .vop_space = ufs_space },
+	VOPNAME_GETPAGE,	{ .vop_getpage = ufs_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = ufs_putpage },
+	VOPNAME_MAP,		{ .vop_map = ufs_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = ufs_addmap },	/* not blkd */
+	VOPNAME_DELMAP,		{ .vop_delmap = ufs_delmap },	/* not blkd */
+	VOPNAME_POLL,		{ .vop_poll = ufs_poll },	/* not blkd */
+	VOPNAME_DUMP,		{ .vop_dump = ufs_dump },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = ufs_l_pathconf },
+	VOPNAME_PAGEIO,		{ .vop_pageio = ufs_pageio },
+	VOPNAME_DUMPCTL,	{ .vop_dumpctl = ufs_dumpctl },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = ufs_getsecattr },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = ufs_setsecattr },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
 
 #define	MAX_BACKFILE_COUNT	9999
--- a/usr/src/uts/common/fs/vfs.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/vfs.c	Mon Mar 26 17:41:06 2007 -0700
@@ -50,6 +50,7 @@
 #include <sys/proc.h>
 #include <sys/mount.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/fem.h>
 #include <sys/mntent.h>
 #include <sys/stat.h>
@@ -3768,12 +3769,6 @@
 }
 
 /*
- * Use old-style function prototype for vfsstray() so
- * that we can use it anywhere in the vfsops structure.
- */
-int vfsstray();
-
-/*
  * Entries for (illegal) fstype 0.
  */
 /* ARGSUSED */
@@ -3784,17 +3779,6 @@
 	return (0);
 }
 
-vfsops_t vfs_strayops = {
-	vfsstray,
-	vfsstray,
-	vfsstray,
-	vfsstray,
-	vfsstray_sync,
-	vfsstray,
-	vfsstray,
-	vfsstray
-};
-
 /*
  * Entries for (illegal) fstype 0.
  */
@@ -3838,23 +3822,36 @@
 vfsinit(void)
 {
 	struct vfssw *vswp;
+	vfsops_t *stray_vfsops;
 	int error;
 	extern int vopstats_enabled;
 	extern void vopstats_startup();
 
 	static const fs_operation_def_t EIO_vfsops_template[] = {
-		VFSNAME_MOUNT,		vfs_EIO,
-		VFSNAME_UNMOUNT,	vfs_EIO,
-		VFSNAME_ROOT,		vfs_EIO,
-		VFSNAME_STATVFS,	vfs_EIO,
-		VFSNAME_SYNC, (fs_generic_func_p) vfs_EIO_sync,
-		VFSNAME_VGET,		vfs_EIO,
-		VFSNAME_MOUNTROOT,	vfs_EIO,
-		VFSNAME_FREEVFS,	vfs_EIO,
-		VFSNAME_VNSTATE,	vfs_EIO,
+		VFSNAME_MOUNT,		{ .error = vfs_EIO },
+		VFSNAME_UNMOUNT,	{ .error = vfs_EIO },
+		VFSNAME_ROOT,		{ .error = vfs_EIO },
+		VFSNAME_STATVFS,	{ .error = vfs_EIO },
+		VFSNAME_SYNC, 		{ .vfs_sync = vfs_EIO_sync },
+		VFSNAME_VGET,		{ .error = vfs_EIO },
+		VFSNAME_MOUNTROOT,	{ .error = vfs_EIO },
+		VFSNAME_FREEVFS,	{ .error = vfs_EIO },
+		VFSNAME_VNSTATE,	{ .error = vfs_EIO },
 		NULL, NULL
 	};
 
+	static const fs_operation_def_t stray_vfsops_template[] = {
+		VFSNAME_MOUNT,		{ .error = vfsstray },
+		VFSNAME_UNMOUNT,	{ .error = vfsstray },
+		VFSNAME_ROOT,		{ .error = vfsstray },
+		VFSNAME_STATVFS,	{ .error = vfsstray },
+		VFSNAME_SYNC, 		{ .vfs_sync = vfsstray_sync },
+		VFSNAME_VGET,		{ .error = vfsstray },
+		VFSNAME_MOUNTROOT,	{ .error = vfsstray },
+		VFSNAME_FREEVFS,	{ .error = vfsstray },
+		VFSNAME_VNSTATE,	{ .error = vfsstray },
+		NULL, NULL
+	};
 
 	/* Initialize the vnode cache (file systems may use it during init). */
 
@@ -3865,8 +3862,8 @@
 	fem_init();
 
 	/* Initialize the dummy stray file system type. */
-
-	vfssw[0].vsw_vfsops = vfs_strayops;
+	error = vfs_makefsops(stray_vfsops_template, &stray_vfsops);
+	vfssw[0].vsw_vfsops = *stray_vfsops; /* structure copy */
 
 	/* Initialize the dummy EIO file system. */
 	error = vfs_makefsops(EIO_vfsops_template, &EIO_vfsops);
@@ -3970,8 +3967,10 @@
 {
 	int i, num_trans, num_ops, used;
 
-	/* Count the number of translations and the number of supplied */
-	/* operations. */
+	/*
+	 * Count the number of translations and the number of supplied
+	 * operations.
+	 */
 
 	{
 		const fs_operation_trans_def_t *p;
@@ -4017,13 +4016,15 @@
 			}
 		}
 
-		/* If the file system is using a "placeholder" for default */
-		/* or error functions, grab the appropriate function out of */
-		/* the translation table.  If the file system didn't supply */
-		/* this operation at all, use the default function. */
+		/*
+		 * If the file system is using a "placeholder" for default
+		 * or error functions, grab the appropriate function out of
+		 * the translation table.  If the file system didn't supply
+		 * this operation at all, use the default function.
+		 */
 
 		if (found) {
-			result = operations[j].func;
+			result = operations[j].func.fs_generic;
 			if (result == fs_default) {
 				result = translation[i].defaultFunc;
 			} else if (result == fs_error) {
--- a/usr/src/uts/common/fs/vnode.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/vnode.c	Mon Mar 26 17:41:06 2007 -0700
@@ -49,6 +49,7 @@
 #include <sys/file.h>
 #include <sys/pathname.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/rwstlock.h>
 #include <sys/fem.h>
--- a/usr/src/uts/common/fs/zfs/zfs_ctldir.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/zfs_ctldir.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -59,6 +59,7 @@
 #include <sys/zfs_ctldir.h>
 #include <sys/zfs_ioctl.h>
 #include <sys/zfs_vfsops.h>
+#include <sys/vfs_opreg.h>
 #include <sys/gfs.h>
 #include <sys/stat.h>
 #include <sys/dmu.h>
@@ -384,16 +385,16 @@
 }
 
 static const fs_operation_def_t zfsctl_tops_root[] = {
-	{ VOPNAME_OPEN,		zfsctl_common_open			},
-	{ VOPNAME_CLOSE,	zfsctl_common_close			},
-	{ VOPNAME_IOCTL,	fs_inval				},
-	{ VOPNAME_GETATTR,	zfsctl_root_getattr			},
-	{ VOPNAME_ACCESS,	zfsctl_common_access			},
-	{ VOPNAME_READDIR,	gfs_vop_readdir				},
-	{ VOPNAME_LOOKUP,	zfsctl_root_lookup			},
-	{ VOPNAME_SEEK,		fs_seek					},
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) gfs_vop_inactive	},
-	{ VOPNAME_FID,		zfsctl_common_fid			},
+	{ VOPNAME_OPEN,		{ .vop_open = zfsctl_common_open }	},
+	{ VOPNAME_CLOSE,	{ .vop_close = zfsctl_common_close }	},
+	{ VOPNAME_IOCTL,	{ .error = fs_inval }			},
+	{ VOPNAME_GETATTR,	{ .vop_getattr = zfsctl_root_getattr }	},
+	{ VOPNAME_ACCESS,	{ .vop_access = zfsctl_common_access }	},
+	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir } 	},
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = zfsctl_root_lookup }	},
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek }			},
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = gfs_vop_inactive }	},
+	{ VOPNAME_FID,		{ .vop_fid = zfsctl_common_fid	}	},
 	{ NULL }
 };
 
@@ -788,18 +789,18 @@
 }
 
 static const fs_operation_def_t zfsctl_tops_snapdir[] = {
-	{ VOPNAME_OPEN,		zfsctl_common_open			},
-	{ VOPNAME_CLOSE,	zfsctl_common_close			},
-	{ VOPNAME_IOCTL,	fs_inval				},
-	{ VOPNAME_GETATTR,	zfsctl_snapdir_getattr			},
-	{ VOPNAME_ACCESS,	zfsctl_common_access			},
-	{ VOPNAME_RENAME,	zfsctl_snapdir_rename			},
-	{ VOPNAME_RMDIR,	zfsctl_snapdir_remove			},
-	{ VOPNAME_READDIR,	gfs_vop_readdir				},
-	{ VOPNAME_LOOKUP,	zfsctl_snapdir_lookup			},
-	{ VOPNAME_SEEK,		fs_seek					},
-	{ VOPNAME_INACTIVE,	(fs_generic_func_p) zfsctl_snapdir_inactive },
-	{ VOPNAME_FID,		zfsctl_common_fid			},
+	{ VOPNAME_OPEN,		{ .vop_open = zfsctl_common_open }	},
+	{ VOPNAME_CLOSE,	{ .vop_close = zfsctl_common_close }	},
+	{ VOPNAME_IOCTL,	{ .error = fs_inval }			},
+	{ VOPNAME_GETATTR,	{ .vop_getattr = zfsctl_snapdir_getattr } },
+	{ VOPNAME_ACCESS,	{ .vop_access = zfsctl_common_access }	},
+	{ VOPNAME_RENAME,	{ .vop_rename = zfsctl_snapdir_rename }	},
+	{ VOPNAME_RMDIR,	{ .vop_rmdir = zfsctl_snapdir_remove }	},
+	{ VOPNAME_READDIR,	{ .vop_readdir = gfs_vop_readdir }	},
+	{ VOPNAME_LOOKUP,	{ .vop_lookup = zfsctl_snapdir_lookup }	},
+	{ VOPNAME_SEEK,		{ .vop_seek = fs_seek }			},
+	{ VOPNAME_INACTIVE,	{ .vop_inactive = zfsctl_snapdir_inactive } },
+	{ VOPNAME_FID,		{ .vop_fid = zfsctl_common_fid }	},
 	{ NULL }
 };
 
@@ -868,7 +869,7 @@
  * be covered.
  */
 static const fs_operation_def_t zfsctl_tops_snapshot[] = {
-	VOPNAME_INACTIVE, (fs_generic_func_p) zfsctl_snapshot_inactive,
+	VOPNAME_INACTIVE, { .vop_inactive =  zfsctl_snapshot_inactive },
 	NULL, NULL
 };
 
--- a/usr/src/uts/common/fs/zfs/zfs_vfsops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/zfs_vfsops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -34,6 +34,7 @@
 #include <sys/acl.h>
 #include <sys/vnode.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/mntent.h>
 #include <sys/mount.h>
 #include <sys/cmn_err.h>
@@ -75,20 +76,20 @@
 static void zfs_objset_close(zfsvfs_t *zfsvfs);
 
 static const fs_operation_def_t zfs_vfsops_template[] = {
-	VFSNAME_MOUNT, zfs_mount,
-	VFSNAME_MOUNTROOT, zfs_mountroot,
-	VFSNAME_UNMOUNT, zfs_umount,
-	VFSNAME_ROOT, zfs_root,
-	VFSNAME_STATVFS, zfs_statvfs,
-	VFSNAME_SYNC, (fs_generic_func_p) zfs_sync,
-	VFSNAME_VGET, zfs_vget,
-	VFSNAME_FREEVFS, (fs_generic_func_p) zfs_freevfs,
-	NULL, NULL
+	VFSNAME_MOUNT,		{ .vfs_mount = zfs_mount },
+	VFSNAME_MOUNTROOT,	{ .vfs_mountroot = zfs_mountroot },
+	VFSNAME_UNMOUNT,	{ .vfs_unmount = zfs_umount },
+	VFSNAME_ROOT,		{ .vfs_root = zfs_root },
+	VFSNAME_STATVFS,	{ .vfs_statvfs = zfs_statvfs },
+	VFSNAME_SYNC,		{ .vfs_sync = zfs_sync },
+	VFSNAME_VGET,		{ .vfs_vget = zfs_vget },
+	VFSNAME_FREEVFS,	{ .vfs_freevfs = zfs_freevfs },
+	NULL,			NULL
 };
 
 static const fs_operation_def_t zfs_vfsops_eio_template[] = {
-	VFSNAME_FREEVFS, (fs_generic_func_p) zfs_freevfs,
-	NULL, NULL
+	VFSNAME_FREEVFS,	{ .vfs_freevfs =  zfs_freevfs },
+	NULL,			NULL
 };
 
 /*
--- a/usr/src/uts/common/fs/zfs/zfs_vnops.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/zfs_vnops.c	Mon Mar 26 17:41:06 2007 -0700
@@ -32,6 +32,7 @@
 #include <sys/sysmacros.h>
 #include <sys/resource.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/file.h>
 #include <sys/stat.h>
@@ -3662,31 +3663,31 @@
  */
 vnodeops_t *zfs_dvnodeops;
 const fs_operation_def_t zfs_dvnodeops_template[] = {
-	VOPNAME_OPEN, zfs_open,
-	VOPNAME_CLOSE, zfs_close,
-	VOPNAME_READ, zfs_isdir,
-	VOPNAME_WRITE, zfs_isdir,
-	VOPNAME_IOCTL, zfs_ioctl,
-	VOPNAME_GETATTR, zfs_getattr,
-	VOPNAME_SETATTR, zfs_setattr,
-	VOPNAME_ACCESS, zfs_access,
-	VOPNAME_LOOKUP, zfs_lookup,
-	VOPNAME_CREATE, zfs_create,
-	VOPNAME_REMOVE, zfs_remove,
-	VOPNAME_LINK, zfs_link,
-	VOPNAME_RENAME, zfs_rename,
-	VOPNAME_MKDIR, zfs_mkdir,
-	VOPNAME_RMDIR, zfs_rmdir,
-	VOPNAME_READDIR, zfs_readdir,
-	VOPNAME_SYMLINK, zfs_symlink,
-	VOPNAME_FSYNC, zfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) zfs_inactive,
-	VOPNAME_FID, zfs_fid,
-	VOPNAME_SEEK, zfs_seek,
-	VOPNAME_PATHCONF, zfs_pathconf,
-	VOPNAME_GETSECATTR, zfs_getsecattr,
-	VOPNAME_SETSECATTR, zfs_setsecattr,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = zfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = zfs_close },
+	VOPNAME_READ,		{ .error = zfs_isdir },
+	VOPNAME_WRITE,		{ .error = zfs_isdir },
+	VOPNAME_IOCTL,		{ .vop_ioctl = zfs_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = zfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = zfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = zfs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = zfs_lookup },
+	VOPNAME_CREATE,		{ .vop_create = zfs_create },
+	VOPNAME_REMOVE,		{ .vop_remove = zfs_remove },
+	VOPNAME_LINK,		{ .vop_link = zfs_link },
+	VOPNAME_RENAME,		{ .vop_rename = zfs_rename },
+	VOPNAME_MKDIR,		{ .vop_mkdir = zfs_mkdir },
+	VOPNAME_RMDIR,		{ .vop_rmdir = zfs_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = zfs_readdir },
+	VOPNAME_SYMLINK,	{ .vop_symlink = zfs_symlink },
+	VOPNAME_FSYNC,		{ .vop_fsync = zfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = zfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = zfs_fid },
+	VOPNAME_SEEK,		{ .vop_seek = zfs_seek },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = zfs_pathconf },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = zfs_getsecattr },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = zfs_setsecattr },
+	NULL,			NULL
 };
 
 /*
@@ -3694,32 +3695,32 @@
  */
 vnodeops_t *zfs_fvnodeops;
 const fs_operation_def_t zfs_fvnodeops_template[] = {
-	VOPNAME_OPEN, zfs_open,
-	VOPNAME_CLOSE, zfs_close,
-	VOPNAME_READ, zfs_read,
-	VOPNAME_WRITE, zfs_write,
-	VOPNAME_IOCTL, zfs_ioctl,
-	VOPNAME_GETATTR, zfs_getattr,
-	VOPNAME_SETATTR, zfs_setattr,
-	VOPNAME_ACCESS, zfs_access,
-	VOPNAME_LOOKUP, zfs_lookup,
-	VOPNAME_RENAME, zfs_rename,
-	VOPNAME_FSYNC, zfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p)zfs_inactive,
-	VOPNAME_FID, zfs_fid,
-	VOPNAME_SEEK, zfs_seek,
-	VOPNAME_FRLOCK, zfs_frlock,
-	VOPNAME_SPACE, zfs_space,
-	VOPNAME_GETPAGE, zfs_getpage,
-	VOPNAME_PUTPAGE, zfs_putpage,
-	VOPNAME_MAP, (fs_generic_func_p) zfs_map,
-	VOPNAME_ADDMAP, (fs_generic_func_p) zfs_addmap,
-	VOPNAME_DELMAP, zfs_delmap,
-	VOPNAME_PATHCONF, zfs_pathconf,
-	VOPNAME_GETSECATTR, zfs_getsecattr,
-	VOPNAME_SETSECATTR, zfs_setsecattr,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = zfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = zfs_close },
+	VOPNAME_READ,		{ .vop_read = zfs_read },
+	VOPNAME_WRITE,		{ .vop_write = zfs_write },
+	VOPNAME_IOCTL,		{ .vop_ioctl = zfs_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = zfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = zfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = zfs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = zfs_lookup },
+	VOPNAME_RENAME,		{ .vop_rename = zfs_rename },
+	VOPNAME_FSYNC,		{ .vop_fsync = zfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = zfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = zfs_fid },
+	VOPNAME_SEEK,		{ .vop_seek = zfs_seek },
+	VOPNAME_FRLOCK,		{ .vop_frlock = zfs_frlock },
+	VOPNAME_SPACE,		{ .vop_space = zfs_space },
+	VOPNAME_GETPAGE,	{ .vop_getpage = zfs_getpage },
+	VOPNAME_PUTPAGE,	{ .vop_putpage = zfs_putpage },
+	VOPNAME_MAP,		{ .vop_map = zfs_map },
+	VOPNAME_ADDMAP,		{ .vop_addmap = zfs_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = zfs_delmap },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = zfs_pathconf },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = zfs_getsecattr },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = zfs_setsecattr },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
 
 /*
@@ -3727,16 +3728,16 @@
  */
 vnodeops_t *zfs_symvnodeops;
 const fs_operation_def_t zfs_symvnodeops_template[] = {
-	VOPNAME_GETATTR, zfs_getattr,
-	VOPNAME_SETATTR, zfs_setattr,
-	VOPNAME_ACCESS, zfs_access,
-	VOPNAME_RENAME, zfs_rename,
-	VOPNAME_READLINK, zfs_readlink,
-	VOPNAME_INACTIVE, (fs_generic_func_p) zfs_inactive,
-	VOPNAME_FID, zfs_fid,
-	VOPNAME_PATHCONF, zfs_pathconf,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_GETATTR,	{ .vop_getattr = zfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = zfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = zfs_access },
+	VOPNAME_RENAME,		{ .vop_rename = zfs_rename },
+	VOPNAME_READLINK,	{ .vop_readlink = zfs_readlink },
+	VOPNAME_INACTIVE,	{ .vop_inactive = zfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = zfs_fid },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = zfs_pathconf },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
 
 /*
@@ -3752,30 +3753,30 @@
  */
 vnodeops_t *zfs_xdvnodeops;
 const fs_operation_def_t zfs_xdvnodeops_template[] = {
-	VOPNAME_OPEN, zfs_open,
-	VOPNAME_CLOSE, zfs_close,
-	VOPNAME_IOCTL, zfs_ioctl,
-	VOPNAME_GETATTR, zfs_getattr,
-	VOPNAME_SETATTR, zfs_setattr,
-	VOPNAME_ACCESS, zfs_access,
-	VOPNAME_LOOKUP, zfs_lookup,
-	VOPNAME_CREATE, zfs_create,
-	VOPNAME_REMOVE, zfs_remove,
-	VOPNAME_LINK, zfs_link,
-	VOPNAME_RENAME, zfs_rename,
-	VOPNAME_MKDIR, zfs_inval,
-	VOPNAME_RMDIR, zfs_rmdir,
-	VOPNAME_READDIR, zfs_readdir,
-	VOPNAME_SYMLINK, zfs_inval,
-	VOPNAME_FSYNC, zfs_fsync,
-	VOPNAME_INACTIVE, (fs_generic_func_p) zfs_inactive,
-	VOPNAME_FID, zfs_fid,
-	VOPNAME_SEEK, zfs_seek,
-	VOPNAME_PATHCONF, zfs_pathconf,
-	VOPNAME_GETSECATTR, zfs_getsecattr,
-	VOPNAME_SETSECATTR, zfs_setsecattr,
-	VOPNAME_VNEVENT, fs_vnevent_support,
-	NULL, NULL
+	VOPNAME_OPEN,		{ .vop_open = zfs_open },
+	VOPNAME_CLOSE,		{ .vop_close = zfs_close },
+	VOPNAME_IOCTL,		{ .vop_ioctl = zfs_ioctl },
+	VOPNAME_GETATTR,	{ .vop_getattr = zfs_getattr },
+	VOPNAME_SETATTR,	{ .vop_setattr = zfs_setattr },
+	VOPNAME_ACCESS,		{ .vop_access = zfs_access },
+	VOPNAME_LOOKUP,		{ .vop_lookup = zfs_lookup },
+	VOPNAME_CREATE,		{ .vop_create = zfs_create },
+	VOPNAME_REMOVE,		{ .vop_remove = zfs_remove },
+	VOPNAME_LINK,		{ .vop_link = zfs_link },
+	VOPNAME_RENAME,		{ .vop_rename = zfs_rename },
+	VOPNAME_MKDIR,		{ .error = zfs_inval },
+	VOPNAME_RMDIR,		{ .vop_rmdir = zfs_rmdir },
+	VOPNAME_READDIR,	{ .vop_readdir = zfs_readdir },
+	VOPNAME_SYMLINK,	{ .error = zfs_inval },
+	VOPNAME_FSYNC,		{ .vop_fsync = zfs_fsync },
+	VOPNAME_INACTIVE,	{ .vop_inactive = zfs_inactive },
+	VOPNAME_FID,		{ .vop_fid = zfs_fid },
+	VOPNAME_SEEK,		{ .vop_seek = zfs_seek },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = zfs_pathconf },
+	VOPNAME_GETSECATTR,	{ .vop_getsecattr = zfs_getsecattr },
+	VOPNAME_SETSECATTR,	{ .vop_setsecattr = zfs_setsecattr },
+	VOPNAME_VNEVENT,	{ .vop_vnevent = fs_vnevent_support },
+	NULL,			NULL
 };
 
 /*
@@ -3783,7 +3784,7 @@
  */
 vnodeops_t *zfs_evnodeops;
 const fs_operation_def_t zfs_evnodeops_template[] = {
-	VOPNAME_INACTIVE, (fs_generic_func_p) zfs_inactive,
-	VOPNAME_PATHCONF, zfs_pathconf,
-	NULL, NULL
+	VOPNAME_INACTIVE,	{ .vop_inactive = zfs_inactive },
+	VOPNAME_PATHCONF,	{ .vop_pathconf = zfs_pathconf },
+	NULL,			NULL
 };
--- a/usr/src/uts/common/fs/zfs/zfs_znode.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/zfs_znode.c	Mon Mar 26 17:41:06 2007 -0700
@@ -35,6 +35,7 @@
 #include <sys/mntent.h>
 #include <sys/mkdev.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/vnode.h>
 #include <sys/file.h>
 #include <sys/kmem.h>
--- a/usr/src/uts/common/io/physmem.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/io/physmem.c	Mon Mar 26 17:41:06 2007 -0700
@@ -44,6 +44,7 @@
 #include <sys/fcntl.h>
 #include <sys/vmsystm.h>
 #include <sys/physmem.h>
+#include <sys/vfs_opreg.h>
 
 static dev_info_t		*physmem_dip = NULL;
 
@@ -108,11 +109,11 @@
 static void physmem_inactive(vnode_t *vp, cred_t *crp);
 
 const fs_operation_def_t physmem_vnodeops_template[] = {
-	VOPNAME_GETPAGE, physmem_getpage,
-	VOPNAME_ADDMAP, (fs_generic_func_p) physmem_addmap,
-	VOPNAME_DELMAP, physmem_delmap,
-	VOPNAME_INACTIVE, (fs_generic_func_p) physmem_inactive,
-	NULL, NULL
+	VOPNAME_GETPAGE,	{ .vop_getpage = physmem_getpage },
+	VOPNAME_ADDMAP,		{ .vop_addmap = physmem_addmap },
+	VOPNAME_DELMAP,		{ .vop_delmap = physmem_delmap },
+	VOPNAME_INACTIVE,	{ .vop_inactive = physmem_inactive },
+	NULL,			NULL
 };
 
 vnodeops_t *physmem_vnodeops = NULL;
--- a/usr/src/uts/common/os/vfs_conf.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/os/vfs_conf.c	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,8 +31,6 @@
 #include <sys/vfs.h>
 #include <sys/t_lock.h>
 
-extern struct vfsops vfs_strayops;	/* XXX move here from vfs.c ? */
-
 extern int swapinit(int fstype, char *name);
 
 /*
--- a/usr/src/uts/common/sys/Makefile	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/sys/Makefile	Mon Mar 26 17:41:06 2007 -0700
@@ -479,7 +479,7 @@
 	syscall.h		\
 	sysconf.h		\
 	sysconfig.h		\
-	sysevent.h	\
+	sysevent.h		\
 	sysevent_impl.h         \
 	sysinfo.h		\
 	syslog.h		\
@@ -546,6 +546,7 @@
 	var.h			\
 	varargs.h		\
 	vfs.h			\
+	vfs_opreg.h		\
 	vfstab.h		\
 	vgareg.h		\
 	videodev2.h		\
--- a/usr/src/uts/common/sys/fem.h	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/sys/fem.h	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -43,6 +42,8 @@
 extern "C" {
 #endif
 
+#ifdef	_KERNEL
+
 struct fs_operation_def;	/* from vfs.h */
 
 /*
@@ -90,7 +91,6 @@
 typedef struct fsem    fsem_t;
 
 typedef int femop_t();
-typedef int vop_t();
 
 /*
  * The following enumerations specify the conditions
@@ -141,107 +141,128 @@
 	struct fem_list *femh_list;
 };
 
+/*
+ * FEM_OPS defines all the FEM operations.  It is used to define
+ * the fem structure (below) and the fs_func_p union (vfs_opreg.h).
+ */
+#define	FEM_OPS								\
+	int (*femop_open)(femarg_t *vf, int mode, cred_t *cr);		\
+	int (*femop_close)(femarg_t *vf, int flag, int count,		\
+			offset_t offset, cred_t *cr);			\
+	int (*femop_read)(femarg_t *vf, uio_t *uiop, int ioflag,	\
+			cred_t *cr, struct caller_context *ct);		\
+	int (*femop_write)(femarg_t *vf, uio_t *uiop, int ioflag,	\
+			cred_t *cr, struct caller_context *ct);		\
+	int (*femop_ioctl)(femarg_t *vf, int cmd, intptr_t arg,		\
+			int flag, cred_t *cr, int *rvalp);		\
+	int (*femop_setfl)(femarg_t *vf, int oflags, int nflags,	\
+			cred_t *cr);					\
+	int (*femop_getattr)(femarg_t *vf, vattr_t *vap, int flags,	\
+			cred_t *cr);					\
+	int (*femop_setattr)(femarg_t *vf, vattr_t *vap, int flags,	\
+			cred_t *cr, caller_context_t *ct);		\
+	int (*femop_access)(femarg_t *vf, int mode, int flags,		\
+			cred_t *cr);					\
+	int (*femop_lookup)(femarg_t *vf, char *nm, vnode_t **vpp,	\
+			pathname_t *pnp, int flags, vnode_t *rdir,	\
+			cred_t *cr);					\
+	int (*femop_create)(femarg_t *vf, char *name, vattr_t *vap,	\
+			vcexcl_t excl, int mode, vnode_t **vpp,		\
+			cred_t *cr, int flag);				\
+	int (*femop_remove)(femarg_t *vf, char *nm, cred_t *cr);	\
+	int (*femop_link)(femarg_t *vf, vnode_t *svp, char *tnm,	\
+			cred_t *cr);					\
+	int (*femop_rename)(femarg_t *vf, char *snm, vnode_t *tdvp,	\
+			char *tnm, cred_t *cr);				\
+	int (*femop_mkdir)(femarg_t *vf, char *dirname, vattr_t *vap,	\
+			vnode_t **vpp, cred_t *cr);			\
+	int (*femop_rmdir)(femarg_t *vf, char *nm, vnode_t *cdir,	\
+			cred_t *cr);					\
+	int (*femop_readdir)(femarg_t *vf, uio_t *uiop, cred_t *cr,	\
+			int *eofp);					\
+	int (*femop_symlink)(femarg_t *vf, char *linkname,		\
+			vattr_t *vap, char *target, cred_t *cr);	\
+	int (*femop_readlink)(femarg_t *vf, uio_t *uiop, cred_t *cr);	\
+	int (*femop_fsync)(femarg_t *vf, int syncflag, cred_t *cr);	\
+	void (*femop_inactive)(femarg_t *vf, cred_t *cr);		\
+	int (*femop_fid)(femarg_t *vf, fid_t *fidp);			\
+	int (*femop_rwlock)(femarg_t *vf, int write_lock,		\
+			caller_context_t *ct);				\
+	void (*femop_rwunlock)(femarg_t *vf, int write_lock,		\
+			caller_context_t *ct);				\
+	int (*femop_seek)(femarg_t *vf, offset_t ooff,			\
+			offset_t *noffp);				\
+	int (*femop_cmp)(femarg_t *vf, vnode_t *vp2);			\
+	int (*femop_frlock)(femarg_t *vf, int cmd, struct flock64 *bfp,	\
+			int flag, offset_t offset,			\
+			struct flk_callback *flk_cbp, cred_t *cr);	\
+	int (*femop_space)(femarg_t *vf, int cmd, struct flock64 *bfp,	\
+			int flag, offset_t offset, cred_t *cr,		\
+			caller_context_t *ct);				\
+	int (*femop_realvp)(femarg_t *vf, vnode_t **vpp);		\
+	int (*femop_getpage)(femarg_t *vf, offset_t off, size_t len,	\
+			uint_t *protp, struct page **plarr,		\
+			size_t plsz, struct seg *seg, caddr_t addr,	\
+			enum seg_rw rw,	cred_t *cr);			\
+	int (*femop_putpage)(femarg_t *vf, offset_t off, size_t len,	\
+			int flags, cred_t *cr);				\
+	int (*femop_map)(femarg_t *vf, offset_t off, struct as *as,	\
+			caddr_t *addrp, size_t len, uchar_t prot,	\
+			uchar_t maxprot, uint_t flags, cred_t *cr);	\
+	int (*femop_addmap)(femarg_t *vf, offset_t off, struct as *as,	\
+			caddr_t addr, size_t len, uchar_t prot,		\
+			uchar_t maxprot, uint_t flags, cred_t *cr);	\
+	int (*femop_delmap)(femarg_t *vf, offset_t off, struct as *as,	\
+			caddr_t addr, size_t len, uint_t prot,		\
+			uint_t maxprot, uint_t flags, cred_t *cr);	\
+	int (*femop_poll)(femarg_t *vf, short events, int anyyet,	\
+			short *reventsp, struct pollhead **phpp);	\
+	int (*femop_dump)(femarg_t *vf, caddr_t addr, int lbdn,		\
+			int dblks); 					\
+	int (*femop_pathconf)(femarg_t *vf, int cmd, ulong_t *valp,	\
+			cred_t *cr);					\
+	int (*femop_pageio)(femarg_t *vf, struct page *pp,		\
+			u_offset_t io_off, size_t io_len, int flags,	\
+			cred_t *cr);					\
+	int (*femop_dumpctl)(femarg_t *vf, int action, int *blkp);	\
+	void (*femop_dispose)(femarg_t *vf, struct page *pp, int flag,	\
+			int dn, cred_t *cr);				\
+	int (*femop_setsecattr)(femarg_t *vf, vsecattr_t *vsap,		\
+			int flag, cred_t *cr);				\
+	int (*femop_getsecattr)(femarg_t *vf, vsecattr_t *vsap,		\
+			int flag, cred_t *cr);				\
+	int (*femop_shrlock)(femarg_t *vf, int cmd,			\
+			struct shrlock *shr, int flag, cred_t *cr);	\
+	int (*femop_vnevent)(femarg_t *vf, vnevent_t vnevent)	/* NB: No ";" */
+
 struct fem {
 	const char *name;
 	const struct fs_operation_def *templ;
-	int (*vsop_open)(femarg_t *vf, int mode, cred_t *cr);
-	int (*vsop_close)(femarg_t *vf, int flag, int count,
-			offset_t offset, cred_t *cr);
-	int (*vsop_read)(femarg_t *vf, uio_t *uiop, int ioflag, cred_t *cr,
-			struct caller_context *ct);
-	int (*vsop_write)(femarg_t *vf, uio_t *uiop, int ioflag,
-			cred_t *cr, struct caller_context *ct);
-	int (*vsop_ioctl)(femarg_t *vf, int cmd, intptr_t arg, int flag,
-			cred_t *cr, int *rvalp);
-	int (*vsop_setfl)(femarg_t *vf, int oflags, int nflags, cred_t *cr);
-	int (*vsop_getattr)(femarg_t *vf, vattr_t *vap, int flags,
-			cred_t *cr);
-	int (*vsop_setattr)(femarg_t *vf, vattr_t *vap, int flags,
-			cred_t *cr, caller_context_t *ct);
-	int (*vsop_access)(femarg_t *vf, int mode, int flags, cred_t *cr);
-	int (*vsop_lookup)(femarg_t *vf, char *nm, vnode_t **vpp,
-			pathname_t *pnp, int flags, vnode_t *rdir,
-			cred_t *cr);
-	int (*vsop_create)(femarg_t *vf, char *name, vattr_t *vap,
-			vcexcl_t excl, int mode, vnode_t **vpp, cred_t *cr,
-			int flag);
-	int (*vsop_remove)(femarg_t *vf, char *nm, cred_t *cr);
-	int (*vsop_link)(femarg_t *vf, vnode_t *svp, char *tnm, cred_t *cr);
-	int (*vsop_rename)(femarg_t *vf, char *snm, vnode_t *tdvp,
-			char *tnm, cred_t *cr);
-	int (*vsop_mkdir)(femarg_t *vf, char *dirname, vattr_t *vap,
-			vnode_t **vpp, cred_t *cr);
-	int (*vsop_rmdir)(femarg_t *vf, char *nm, vnode_t *cdir,
-			cred_t *cr);
-	int (*vsop_readdir)(femarg_t *vf, uio_t *uiop, cred_t *cr,
-			int *eofp);
-	int (*vsop_symlink)(femarg_t *vf, char *linkname, vattr_t *vap,
-			char *target, cred_t *cr);
-	int (*vsop_readlink)(femarg_t *vf, uio_t *uiop, cred_t *cr);
-	int (*vsop_fsync)(femarg_t *vf, int syncflag, cred_t *cr);
-	void (*vsop_inactive)(femarg_t *vf, cred_t *cr);
-	int (*vsop_fid)(femarg_t *vf, fid_t *fidp);
-	int (*vsop_rwlock)(femarg_t *vf, int write_lock,
-			caller_context_t *ct);
-	void (*vsop_rwunlock)(femarg_t *vf, int write_lock,
-			caller_context_t *ct);
-	int (*vsop_seek)(femarg_t *vf, offset_t ooff, offset_t *noffp);
-	int (*vsop_cmp)(femarg_t *vf, vnode_t *vp2);
-	int (*vsop_frlock)(femarg_t *vf, int cmd, struct flock64 *bfp,
-			int flag, offset_t offset,
-			struct flk_callback *flk_cbp, cred_t *cr);
-	int (*vsop_space)(femarg_t *vf, int cmd, struct flock64 *bfp,
-			int flag, offset_t offset, cred_t *cr,
-			caller_context_t *ct);
-	int (*vsop_realvp)(femarg_t *vf, vnode_t **vpp);
-	int (*vsop_getpage)(femarg_t *vf, offset_t off, size_t len,
-			uint_t *protp, struct page **plarr, size_t plsz,
-			struct seg *seg, caddr_t addr, enum seg_rw rw,
-			cred_t *cr);
-	int (*vsop_putpage)(femarg_t *vf, offset_t off, size_t len,
-			int flags, cred_t *cr);
-	int (*vsop_map)(femarg_t *vf, offset_t off, struct as *as,
-			caddr_t *addrp, size_t len, uchar_t prot,
-			uchar_t maxprot, uint_t flags, cred_t *cr);
-	int (*vsop_addmap)(femarg_t *vf, offset_t off, struct as *as,
-			caddr_t addr, size_t len, uchar_t prot,
-			uchar_t maxprot, uint_t flags, cred_t *cr);
-	int (*vsop_delmap)(femarg_t *vf, offset_t off, struct as *as,
-			caddr_t addr, size_t len, uint_t prot,
-			uint_t maxprot, uint_t flags, cred_t *cr);
-	int (*vsop_poll)(femarg_t *vf, short events, int anyyet,
-			short *reventsp, struct pollhead **phpp);
-	int (*vsop_dump)(femarg_t *vf, caddr_t addr, int lbdn, int dblks);
-	int (*vsop_pathconf)(femarg_t *vf, int cmd, ulong_t *valp,
-			cred_t *cr);
-	int (*vsop_pageio)(femarg_t *vf, struct page *pp,
-			u_offset_t io_off, size_t io_len, int flags,
-			cred_t *cr);
-	int (*vsop_dumpctl)(femarg_t *vf, int action, int *blkp);
-	void (*vsop_dispose)(femarg_t *vf, struct page *pp, int flag,
-			int dn, cred_t *cr);
-	int (*vsop_setsecattr)(femarg_t *vf, vsecattr_t *vsap, int flag,
-			cred_t *cr);
-	int (*vsop_getsecattr)(femarg_t *vf, vsecattr_t *vsap, int flag,
-			cred_t *cr);
-	int (*vsop_shrlock)(femarg_t *vf, int cmd, struct shrlock *shr,
-			int flag, cred_t *cr);
-	int (*vsop_vnevent)(femarg_t *vf, vnevent_t vnevent);
+	FEM_OPS;	/* Signatures of all FEM operations (femops) */
 };
 
+/*
+ * FSEM_OPS defines all the FSEM operations.  It is used to define
+ * the fsem structure (below) and the fs_func_p union (vfs_opreg.h).
+ */
+#define	FSEM_OPS							\
+	int (*fsemop_mount)(fsemarg_t *vf, vnode_t *mvp,		\
+			struct mounta *uap, cred_t *cr);		\
+	int (*fsemop_unmount)(fsemarg_t *vf, int flag, cred_t *cr);	\
+	int (*fsemop_root)(fsemarg_t *vf, vnode_t **vpp);		\
+	int (*fsemop_statvfs)(fsemarg_t *vf, statvfs64_t *sp);		\
+	int (*fsemop_sync)(fsemarg_t *vf, short flag, cred_t *cr);	\
+	int (*fsemop_vget)(fsemarg_t *vf, vnode_t **vpp, fid_t *fidp);	\
+	int (*fsemop_mountroot)(fsemarg_t *vf,				\
+			enum whymountroot reason);			\
+	void (*fsemop_freevfs)(fsemarg_t *vf);				\
+	int (*fsemop_vnstate)(fsemarg_t *vf, vnode_t *vp,		\
+			vntrans_t nstate)		/* NB: No ";" */
+
 struct fsem {
 	const char *name;
 	const struct fs_operation_def *templ;
-	int (*vfsop_mount)(fsemarg_t *vf, vnode_t *mvp, struct mounta *uap,
-			cred_t *cr);
-	int (*vfsop_unmount)(fsemarg_t *vf, int flag, cred_t *cr);
-	int (*vfsop_root)(fsemarg_t *vf, vnode_t **vpp);
-	int (*vfsop_statvfs)(fsemarg_t *vf, statvfs64_t *sp);
-	int (*vfsop_sync)(fsemarg_t *vf, short flag, cred_t *cr);
-	int (*vfsop_vget)(fsemarg_t *vf, vnode_t **vpp, fid_t *fidp);
-	int (*vfsop_mountroot)(fsemarg_t *vf, enum whymountroot reason);
-	void (*vfsop_freevfs)(fsemarg_t *vf);
-	int (*vfsop_vnstate)(fsemarg_t *vf, vnode_t *vp, vntrans_t nstate);
+	FSEM_OPS;	/* Signatures of all FSEM operations (fsemops) */
 };
 
 extern int vnext_open(femarg_t *vf, int mode, cred_t *cr);
@@ -357,6 +378,7 @@
 extern vfsops_t *fsem_getvfsops(struct vfs *v);
 extern void fsem_setvfsops(struct vfs *v, struct vfsops *nops);
 
+#endif /* _KERNEL */
 
 #ifdef	__cplusplus
 }
--- a/usr/src/uts/common/sys/fs/sdev_impl.h	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/sys/fs/sdev_impl.h	Mon Mar 26 17:41:06 2007 -0700
@@ -35,6 +35,7 @@
 #include <rpc/rpc.h>
 #include <sys/dirent.h>
 #include <sys/vfs.h>
+#include <sys/vfs_opreg.h>
 #include <sys/list.h>
 #include <sys/nvpair.h>
 
--- a/usr/src/uts/common/sys/gfs.h	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/sys/gfs.h	Mon Mar 26 17:41:06 2007 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -31,6 +30,7 @@
 
 #include <sys/types.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/mutex.h>
 #include <sys/dirent.h>
 #include <sys/uio.h>
--- a/usr/src/uts/common/sys/vfs.h	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/sys/vfs.h	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -310,20 +310,26 @@
 };
 typedef enum vntrans vntrans_t;
 
+/*
+ * VFS_OPS defines all the vfs operations.  It is used to define
+ * the vfsops structure (below) and the fs_func_p union (vfs_opreg.h).
+ */
+#define	VFS_OPS								\
+	int	(*vfs_mount)(vfs_t *, vnode_t *, struct mounta *, cred_t *); \
+	int	(*vfs_unmount)(vfs_t *, int, cred_t *);			\
+	int	(*vfs_root)(vfs_t *, vnode_t **);			\
+	int	(*vfs_statvfs)(vfs_t *, statvfs64_t *);			\
+	int	(*vfs_sync)(vfs_t *, short, cred_t *);			\
+	int	(*vfs_vget)(vfs_t *, vnode_t **, fid_t *);		\
+	int	(*vfs_mountroot)(vfs_t *, enum whymountroot);		\
+	void	(*vfs_freevfs)(vfs_t *);				\
+	int	(*vfs_vnstate)(vfs_t *, vnode_t *, vntrans_t)	/* NB: No ";" */
 
 /*
  * Operations supported on virtual file system.
  */
 struct vfsops {
-	int	(*vfs_mount)(vfs_t *, vnode_t *, struct mounta *, cred_t *);
-	int	(*vfs_unmount)(vfs_t *, int, cred_t *);
-	int	(*vfs_root)(vfs_t *, vnode_t **);
-	int	(*vfs_statvfs)(vfs_t *, statvfs64_t *);
-	int	(*vfs_sync)(vfs_t *, short, cred_t *);
-	int	(*vfs_vget)(vfs_t *, vnode_t **, fid_t *);
-	int	(*vfs_mountroot)(vfs_t *, enum whymountroot);
-	int	(*vfs_freevfs)(vfs_t *);
-	int	(*vfs_vnstate)(vfs_t *, vnode_t *, vntrans_t);
+	VFS_OPS;	/* Signature of all vfs operations (vfsops) */
 };
 
 extern int	fsop_mount(vfs_t *, vnode_t *, struct mounta *, cred_t *);
@@ -391,17 +397,6 @@
 };
 
 /*
- * Generic operations vector types (used for vfs/vnode ops registration).
- */
-
-extern int fs_default();		/* "default" function placeholder */
-extern int fs_error();			/* "error" function placeholder */
-
-int fs_build_vector(void *vector, int *unused_ops,
-    const fs_operation_trans_def_t *translation,
-    const fs_operation_def_t *operations);
-
-/*
  * flags for vfssw and vfsdef
  */
 #define	VSW_HASPROTO	0x01	/* struct has a mount options prototype */
@@ -421,8 +416,6 @@
 struct statvfsa;
 struct fstatvfsa;
 
-int	vfs_setfsops(int, const fs_operation_def_t *, vfsops_t **);
-int	vfs_makefsops(const fs_operation_def_t *, vfsops_t **);
 void	vfs_freevfsops(vfsops_t *);
 int	vfs_freevfsops_by_type(int);
 void	vfs_setops(vfs_t *, vfsops_t *);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/uts/common/sys/vfs_opreg.h	Mon Mar 26 17:41:06 2007 -0700
@@ -0,0 +1,116 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_VFS_OPREG_H
+#define	_SYS_VFS_OPREG_H
+
+#pragma ident	"%Z%%M%	%I%	%E% SMI"
+
+#include <sys/vfs.h>
+#include <sys/fem.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+
+/*
+ * The following union allows us to use C99's "designated initializer"
+ * feature so that we can have strong typechecking for the operations
+ * used in the the fs_operation_def structures.
+ */
+
+typedef union fs_func {
+	fs_generic_func_p fs_generic;	/* Generic function signature */
+	int (*error)();			/* Signature of error function */
+	VFS_OPS;		/* Signatures of all vfs operations (vfsops) */
+	VNODE_OPS;		/* Signatures of all vnode operations (vops) */
+	FEM_OPS;		/* Signatures of all FEM operations (femops) */
+	FSEM_OPS;		/* Signatures of all FSEM ops (fsemops) */
+} fs_func_p;
+
+/*
+ * File systems use arrays of fs_operation_def structures to form
+ * name/value pairs of operations.  These arrays get passed to:
+ *
+ * 	- vn_make_ops() to create vnodeops
+ * 	- vfs_makefsops()/vfs_setfsops() to create vfsops.
+ */
+typedef struct fs_operation_def {
+	char *name;			/* name of operation (NULL at end) */
+	fs_func_p func;			/* function implementing operation */
+} fs_operation_def_t;
+
+/*
+ * The operation registration mechanism uses two master tables of operations:
+ * one for vnode operations (vn_ops_table[]) and one for vfs operations
+ * (vfs_ops_table[]).  These tables are arrays of fs_operation_trans_def
+ * structures.  They contain all of the information necessary for the system
+ * to populate an operations structure (e.g., vnodeops, vfsops).
+ *
+ * File systems call registration routines (vfs_setfsops(), vfs_makefsops(),
+ * and vn_make_ops()) and pass in their operations specification tables
+ * (arrays of fs_operation_def structures).  These routines use the master
+ * table(s) of operations to build a vnodeops or vfsops structure.
+ */
+typedef struct fs_operation_trans_def {
+	char *name;			/* name of operation (NULL at end) */
+	int offset;			/* byte offset within ops vector */
+	fs_generic_func_p defaultFunc;	/* default function */
+	fs_generic_func_p errorFunc; 	/* error function */
+} fs_operation_trans_def_t;
+
+/*
+ * Generic operations vector types (used for vfs/vnode ops registration).
+ */
+
+extern int fs_default();		/* "default" function placeholder */
+extern int fs_error();			/* "error" function placeholder */
+
+int fs_build_vector(void *vector, int *unused_ops,
+    const fs_operation_trans_def_t *translation,
+    const fs_operation_def_t *operations);
+
+/*
+ * Public operations.
+ */
+
+int	vn_make_ops(const char *, const struct fs_operation_def *,
+		vnodeops_t **);
+void	vn_freevnodeops(vnodeops_t *);
+
+int	vfs_setfsops(int, const fs_operation_def_t *, vfsops_t **);
+int	vfs_makefsops(const fs_operation_def_t *, vfsops_t **);
+void	vfs_freevfsops(vfsops_t *);
+int	vfs_freevfsops_by_type(int);
+
+#endif /* _KERNEL */
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _SYS_VFS_OPREG_H */
--- a/usr/src/uts/common/sys/vnode.h	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/sys/vnode.h	Mon Mar 26 17:41:06 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -59,41 +59,6 @@
 extern "C" {
 #endif
 
-
-typedef int (*fs_generic_func_p) ();
-
-/*
- * File systems use arrays of fs_operation_def structures to form
- * name/value pairs of operations.  These arrays get passed to:
- *
- * 	- vn_make_ops() to create vnodeops
- * 	- vfs_makefsops()/vfs_setfsops() to create vfsops.
- */
-typedef struct fs_operation_def {
-	char *name;			/* name of operation (NULL at end) */
-	fs_generic_func_p func;		/* function implementing operation */
-} fs_operation_def_t;
-
-/*
- * The operation registration mechanism uses two master tables of operations:
- * one for vnode operations (vn_ops_table[]) and one for vfs operations
- * (vfs_ops_table[]).  These tables are arrays of fs_operation_trans_def
- * structures.  They contain all of the information necessary for the system
- * to populate an operations structure (e.g., vnodeops, vfsops).
- *
- * File systems call registration routines (vfs_setfsops(), vfs_makefsops(),
- * and vn_make_ops()) and pass in their operations specification tables
- * (arrays of fs_operation_def structures).  These routines use the master
- * table(s) of operations to build a vnodeops or vfsops structure.
- */
-typedef struct fs_operation_trans_def {
-	char *name;			/* name of operation (NULL at end) */
-	int offset;			/* byte offset within ops vector */
-	fs_generic_func_p defaultFunc;	/* default function */
-	fs_generic_func_p errorFunc; 	/* error function */
-} fs_operation_trans_def_t;
-
-
 /*
  * Statistics for all vnode operations.
  * All operations record number of ops (since boot/mount/zero'ed).
@@ -562,74 +527,98 @@
 struct as;
 struct pollhead;
 
+#ifdef	_KERNEL
+
 /*
- * Operations on vnodes.  Note: File systems should never operate directly
+ * VNODE_OPS defines all the vnode operations.  It is used to define
+ * the vnodeops structure (below) and the fs_func_p union (vfs_opreg.h).
+ */
+#define	VNODE_OPS							\
+	int	(*vop_open)(vnode_t **, int, cred_t *);			\
+	int	(*vop_close)(vnode_t *, int, int, offset_t, cred_t *);	\
+	int	(*vop_read)(vnode_t *, uio_t *, int, cred_t *,		\
+				caller_context_t *);			\
+	int	(*vop_write)(vnode_t *, uio_t *, int, cred_t *,		\
+				caller_context_t *);			\
+	int	(*vop_ioctl)(vnode_t *, int, intptr_t, int, cred_t *,	\
+				int *);					\
+	int	(*vop_setfl)(vnode_t *, int, int, cred_t *);		\
+	int	(*vop_getattr)(vnode_t *, vattr_t *, int, cred_t *);	\
+	int	(*vop_setattr)(vnode_t *, vattr_t *, int, cred_t *,	\
+				caller_context_t *);			\
+	int	(*vop_access)(vnode_t *, int, int, cred_t *);		\
+	int	(*vop_lookup)(vnode_t *, char *, vnode_t **,		\
+				struct pathname *,			\
+				int, vnode_t *, cred_t *);		\
+	int	(*vop_create)(vnode_t *, char *, vattr_t *, vcexcl_t,	\
+				int, vnode_t **, cred_t *, int);	\
+	int	(*vop_remove)(vnode_t *, char *, cred_t *);		\
+	int	(*vop_link)(vnode_t *, vnode_t *, char *, cred_t *);	\
+	int	(*vop_rename)(vnode_t *, char *, vnode_t *, char *,	\
+				cred_t *);				\
+	int	(*vop_mkdir)(vnode_t *, char *, vattr_t *, vnode_t **,	\
+				cred_t *);				\
+	int	(*vop_rmdir)(vnode_t *, char *, vnode_t *, cred_t *);	\
+	int	(*vop_readdir)(vnode_t *, uio_t *, cred_t *, int *);	\
+	int	(*vop_symlink)(vnode_t *, char *, vattr_t *, char *,	\
+				cred_t *);				\
+	int	(*vop_readlink)(vnode_t *, uio_t *, cred_t *);		\
+	int	(*vop_fsync)(vnode_t *, int, cred_t *);			\
+	void	(*vop_inactive)(vnode_t *, cred_t *);			\
+	int	(*vop_fid)(vnode_t *, struct fid *);			\
+	int	(*vop_rwlock)(vnode_t *, int, caller_context_t *);	\
+	void	(*vop_rwunlock)(vnode_t *, int, caller_context_t *);	\
+	int	(*vop_seek)(vnode_t *, offset_t, offset_t *);		\
+	int	(*vop_cmp)(vnode_t *, vnode_t *);			\
+	int	(*vop_frlock)(vnode_t *, int, struct flock64 *,		\
+				int, offset_t,				\
+				struct flk_callback *, cred_t *);	\
+	int	(*vop_space)(vnode_t *, int, struct flock64 *,		\
+				int, offset_t,				\
+				cred_t *, caller_context_t *);		\
+	int	(*vop_realvp)(vnode_t *, vnode_t **);			\
+	int	(*vop_getpage)(vnode_t *, offset_t, size_t, uint_t *,	\
+				struct page **, size_t, struct seg *,	\
+				caddr_t, enum seg_rw, cred_t *);	\
+	int	(*vop_putpage)(vnode_t *, offset_t, size_t,		\
+				int, cred_t *);				\
+	int	(*vop_map)(vnode_t *, offset_t, struct as *,		\
+				caddr_t *, size_t,			\
+				uchar_t, uchar_t, uint_t, cred_t *);	\
+	int	(*vop_addmap)(vnode_t *, offset_t, struct as *,		\
+				caddr_t, size_t,			\
+				uchar_t, uchar_t, uint_t, cred_t *);	\
+	int	(*vop_delmap)(vnode_t *, offset_t, struct as *,		\
+				caddr_t, size_t,			\
+				uint_t, uint_t, uint_t, cred_t *);	\
+	int	(*vop_poll)(vnode_t *, short, int, short *,		\
+				struct pollhead **);			\
+	int	(*vop_dump)(vnode_t *, caddr_t, int, int);		\
+	int	(*vop_pathconf)(vnode_t *, int, ulong_t *, cred_t *);	\
+	int	(*vop_pageio)(vnode_t *, struct page *,			\
+				u_offset_t, size_t, int, cred_t *);	\
+	int	(*vop_dumpctl)(vnode_t *, int, int *);			\
+	void	(*vop_dispose)(vnode_t *, struct page *,		\
+				int, int, cred_t *);			\
+	int	(*vop_setsecattr)(vnode_t *, vsecattr_t *,		\
+				int, cred_t *);				\
+	int	(*vop_getsecattr)(vnode_t *, vsecattr_t *,		\
+				int, cred_t *);				\
+	int	(*vop_shrlock)(vnode_t *, int, struct shrlock *,	\
+				int, cred_t *);				\
+	int	(*vop_vnevent)(vnode_t *, vnevent_t)	/* NB: No ";" */
+
+/*
+ * Operations on vnodes.  Note: File systems must never operate directly
  * on a 'vnodeops' structure -- it WILL change in future releases!  They
- * should use vn_make_ops() to create the structure.
+ * must use vn_make_ops() to create the structure.
  */
 typedef struct vnodeops {
 	const char *vnop_name;
-	int	(*vop_open)(vnode_t **, int, cred_t *);
-	int	(*vop_close)(vnode_t *, int, int, offset_t, cred_t *);
-	int	(*vop_read)(vnode_t *, uio_t *, int, cred_t *,
-				caller_context_t *);
-	int	(*vop_write)(vnode_t *, uio_t *, int, cred_t *,
-				caller_context_t *);
-	int	(*vop_ioctl)(vnode_t *, int, intptr_t, int, cred_t *, int *);
-	int	(*vop_setfl)(vnode_t *, int, int, cred_t *);
-	int	(*vop_getattr)(vnode_t *, vattr_t *, int, cred_t *);
-	int	(*vop_setattr)(vnode_t *, vattr_t *, int, cred_t *,
-				caller_context_t *);
-	int	(*vop_access)(vnode_t *, int, int, cred_t *);
-	int	(*vop_lookup)(vnode_t *, char *, vnode_t **, struct pathname *,
-				int, vnode_t *, cred_t *);
-	int	(*vop_create)(vnode_t *, char *, vattr_t *, vcexcl_t, int,
-				vnode_t **, cred_t *, int);
-	int	(*vop_remove)(vnode_t *, char *, cred_t *);
-	int	(*vop_link)(vnode_t *, vnode_t *, char *, cred_t *);
-	int	(*vop_rename)(vnode_t *, char *, vnode_t *, char *, cred_t *);
-	int	(*vop_mkdir)(vnode_t *, char *, vattr_t *, vnode_t **,
-				cred_t *);
-	int	(*vop_rmdir)(vnode_t *, char *, vnode_t *, cred_t *);
-	int	(*vop_readdir)(vnode_t *, uio_t *, cred_t *, int *);
-	int	(*vop_symlink)(vnode_t *, char *, vattr_t *, char *, cred_t *);
-	int	(*vop_readlink)(vnode_t *, uio_t *, cred_t *);
-	int	(*vop_fsync)(vnode_t *, int, cred_t *);
-	void	(*vop_inactive)(vnode_t *, cred_t *);
-	int	(*vop_fid)(vnode_t *, struct fid *);
-	int	(*vop_rwlock)(vnode_t *, int, caller_context_t *);
-	void	(*vop_rwunlock)(vnode_t *, int, caller_context_t *);
-	int	(*vop_seek)(vnode_t *, offset_t, offset_t *);
-	int	(*vop_cmp)(vnode_t *, vnode_t *);
-	int	(*vop_frlock)(vnode_t *, int, struct flock64 *, int, offset_t,
-				struct flk_callback *, cred_t *);
-	int	(*vop_space)(vnode_t *, int, struct flock64 *, int, offset_t,
-				cred_t *, caller_context_t *);
-	int	(*vop_realvp)(vnode_t *, vnode_t **);
-	int	(*vop_getpage)(vnode_t *, offset_t, size_t, uint_t *,
-				struct page **, size_t, struct seg *,
-				caddr_t, enum seg_rw, cred_t *);
-	int	(*vop_putpage)(vnode_t *, offset_t, size_t, int, cred_t *);
-	int	(*vop_map)(vnode_t *, offset_t, struct as *, caddr_t *, size_t,
-				uchar_t, uchar_t, uint_t, cred_t *);
-	int	(*vop_addmap)(vnode_t *, offset_t, struct as *, caddr_t, size_t,
-				uchar_t, uchar_t, uint_t, cred_t *);
-	int	(*vop_delmap)(vnode_t *, offset_t, struct as *, caddr_t, size_t,
-				uint_t, uint_t, uint_t, cred_t *);
-	int	(*vop_poll)(vnode_t *, short, int, short *, struct pollhead **);
-	int	(*vop_dump)(vnode_t *, caddr_t, int, int);
-	int	(*vop_pathconf)(vnode_t *, int, ulong_t *, cred_t *);
-	int	(*vop_pageio)(vnode_t *, struct page *, u_offset_t, size_t,
-				int, cred_t *);
-	int	(*vop_dumpctl)(vnode_t *, int, int *);
-	void	(*vop_dispose)(vnode_t *, struct page *, int, int, cred_t *);
-	int	(*vop_setsecattr)(vnode_t *, vsecattr_t *, int, cred_t *);
-	int	(*vop_getsecattr)(vnode_t *, vsecattr_t *, int, cred_t *);
-	int	(*vop_shrlock)(vnode_t *, int, struct shrlock *, int, cred_t *);
-	int	(*vop_vnevent)(vnode_t *, vnevent_t);
+	VNODE_OPS;	/* Signatures of all vnode operations (vops) */
 } vnodeops_t;
 
-#ifdef	_KERNEL
+typedef int (*fs_generic_func_p) ();	/* Generic vop/vfsop/femop/fsemop ptr */
 
 extern int	fop_open(vnode_t **, int, cred_t *);
 extern int	fop_close(vnode_t *, int, int, offset_t, cred_t *);
@@ -876,7 +865,6 @@
 void	vn_create_cache(void);
 void	vn_destroy_cache(void);
 
-int	vn_make_ops(const char *, const fs_operation_def_t *, vnodeops_t **);
 void	vn_freevnodeops(vnodeops_t *);
 
 int	vn_open(char *pnamep, enum uio_seg seg, int filemode, int createmode,
--- a/usr/src/uts/common/vm/page_retire.c	Mon Mar 26 12:01:20 2007 -0700
+++ b/usr/src/uts/common/vm/page_retire.c	Mon Mar 26 17:41:06 2007 -0700
@@ -130,6 +130,7 @@
 #include <sys/systm.h>
 #include <sys/mman.h>
 #include <sys/vnode.h>
+#include <sys/vfs_opreg.h>
 #include <sys/cmn_err.h>
 #include <sys/ksynch.h>
 #include <sys/thread.h>
@@ -851,7 +852,9 @@
 void
 page_retire_init(void)
 {
-	const fs_operation_def_t retired_vnodeops_template[] = {NULL, NULL};
+	const fs_operation_def_t retired_vnodeops_template[] = {
+		{ NULL, NULL }
+	};
 	struct vnodeops *vops;
 	kstat_t *ksp;