]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/vfs/vnode_if.c
xnu-6153.11.26.tar.gz
[apple/xnu.git] / bsd / vfs / vnode_if.c
index df30827aec99ff66f8d5b30f3fddd906d2539304..a29e14f2447680c3a7cbe841e3b7bc87fd273ac5 100644 (file)
@@ -1,9 +1,8 @@
-
 /*
- * Copyright (c) 2000-2002 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2019 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
- * 
+ *
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
  * unlawful or unlicensed copies of an Apple operating system, or to
  * circumvent, violate, or enable the circumvention or violation of, any
  * terms of an Apple operating system software license agreement.
- * 
+ *
  * Please obtain a copy of the License at
  * http://www.opensource.apple.com/apsl/ and read it before using this file.
- * 
+ *
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
@@ -23,7 +22,7 @@
  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  * Please see the License for the specific language governing rights and
  * limitations under the License.
- * 
+ *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
@@ -90,7 +89,7 @@ struct vnodeop_desc vnop_default_desc = {
 
 
 int vnop_lookup_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_lookup_args,a_dvp),
+       VOPARG_OFFSETOF(struct vnop_lookup_args, a_dvp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_lookup_desc = {
@@ -106,8 +105,26 @@ struct vnodeop_desc vnop_lookup_desc = {
        NULL
 };
 
+int vnop_compound_open_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_compound_open_args, a_dvp),
+       VDESC_NO_OFFSET
+};
+
+struct vnodeop_desc vnop_compound_open_desc = {
+       0,
+       "vnop_compound_open",
+       0 | VDESC_VP0_WILLRELE,
+       vnop_compound_open_vp_offsets,
+       VOPARG_OFFSETOF(struct vnop_compound_open_args, a_vpp),
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_compound_open_args, a_cnp),
+       VOPARG_OFFSETOF(struct vnop_compound_open_args, a_context),
+       NULL
+};
+
 int vnop_create_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_create_args,a_dvp),
+       VOPARG_OFFSETOF(struct vnop_create_args, a_dvp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_create_desc = {
@@ -124,7 +141,7 @@ struct vnodeop_desc vnop_create_desc = {
 };
 
 int vnop_whiteout_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_whiteout_args,a_dvp),
+       VOPARG_OFFSETOF(struct vnop_whiteout_args, a_dvp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_whiteout_desc = {
@@ -141,24 +158,24 @@ struct vnodeop_desc vnop_whiteout_desc = {
 };
 
 int vnop_mknod_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_mknod_args,a_dvp),
-       VDESC_NO_OFFSET
+       VOPARG_OFFSETOF(struct vnop_mknod_args, a_dvp),
+       VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_mknod_desc = {
-       0,
-       "vnop_mknod",
-       0 | VDESC_VP0_WILLRELE | VDESC_VPP_WILLRELE,
-       vnop_mknod_vp_offsets,
-       VOPARG_OFFSETOF(struct vnop_mknod_args, a_vpp),
-       VDESC_NO_OFFSET,
-       VDESC_NO_OFFSET,
-       VOPARG_OFFSETOF(struct vnop_mknod_args, a_cnp),
-       VOPARG_OFFSETOF(struct vnop_mknod_args, a_context),
-       NULL
+       0,
+       "vnop_mknod",
+       0 | VDESC_VP0_WILLRELE | VDESC_VPP_WILLRELE,
+       vnop_mknod_vp_offsets,
+       VOPARG_OFFSETOF(struct vnop_mknod_args, a_vpp),
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_mknod_args, a_cnp),
+       VOPARG_OFFSETOF(struct vnop_mknod_args, a_context),
+       NULL
 };
 
 int vnop_open_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_open_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_open_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_open_desc = {
@@ -175,7 +192,7 @@ struct vnodeop_desc vnop_open_desc = {
 };
 
 int vnop_close_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_close_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_close_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_close_desc = {
@@ -192,7 +209,7 @@ struct vnodeop_desc vnop_close_desc = {
 };
 
 int vnop_access_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_access_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_access_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_access_desc = {
@@ -209,7 +226,7 @@ struct vnodeop_desc vnop_access_desc = {
 };
 
 int vnop_getattr_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_getattr_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_getattr_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_getattr_desc = {
@@ -226,7 +243,7 @@ struct vnodeop_desc vnop_getattr_desc = {
 };
 
 int vnop_setattr_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_setattr_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_setattr_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_setattr_desc = {
@@ -243,7 +260,7 @@ struct vnodeop_desc vnop_setattr_desc = {
 };
 
 int vnop_read_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_read_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_read_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_read_desc = {
@@ -260,7 +277,7 @@ struct vnodeop_desc vnop_read_desc = {
 };
 
 int vnop_write_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_write_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_write_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_write_desc = {
@@ -277,7 +294,7 @@ struct vnodeop_desc vnop_write_desc = {
 };
 
 int vnop_ioctl_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_ioctl_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_ioctl_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_ioctl_desc = {
@@ -294,7 +311,7 @@ struct vnodeop_desc vnop_ioctl_desc = {
 };
 
 int vnop_select_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_select_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_select_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_select_desc = {
@@ -311,8 +328,8 @@ struct vnodeop_desc vnop_select_desc = {
 };
 
 int vnop_exchange_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_exchange_args,a_fvp),
-       VOPARG_OFFSETOF(struct vnop_exchange_args,a_tvp),
+       VOPARG_OFFSETOF(struct vnop_exchange_args, a_fvp),
+       VOPARG_OFFSETOF(struct vnop_exchange_args, a_tvp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_exchange_desc = {
@@ -329,7 +346,7 @@ struct vnodeop_desc vnop_exchange_desc = {
 };
 
 int vnop_kqfilt_add_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_kqfilt_add_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_kqfilt_add_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_kqfilt_add_desc = {
@@ -346,7 +363,7 @@ struct vnodeop_desc vnop_kqfilt_add_desc = {
 };
 
 int vnop_kqfilt_remove_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_kqfilt_remove_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_kqfilt_remove_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_kqfilt_remove_desc = {
@@ -362,8 +379,25 @@ struct vnodeop_desc vnop_kqfilt_remove_desc = {
        NULL
 };
 
+int vnop_monitor_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_monitor_args, a_vp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_monitor_desc = {
+       0,
+       "vnop_monitor",
+       0,
+       vnop_monitor_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_monitor_args, a_context),
+       NULL
+};
+
 int vnop_setlabel_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_setlabel_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_setlabel_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_setlabel_desc = {
@@ -380,7 +414,7 @@ struct vnodeop_desc vnop_setlabel_desc = {
 };
 
 int vnop_revoke_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_revoke_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_revoke_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_revoke_desc = {
@@ -396,9 +430,25 @@ struct vnodeop_desc vnop_revoke_desc = {
        NULL
 };
 
+int vnop_mmap_check_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_mmap_check_args, a_vp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_mmap_check_desc = {
+       0,
+       "vnop_mmap_check",
+       0,
+       vnop_mmap_check_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       NULL
+};
 
 int vnop_mmap_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_mmap_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_mmap_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_mmap_desc = {
@@ -414,9 +464,8 @@ struct vnodeop_desc vnop_mmap_desc = {
        NULL
 };
 
-
 int vnop_mnomap_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_mnomap_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_mnomap_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_mnomap_desc = {
@@ -432,9 +481,8 @@ struct vnodeop_desc vnop_mnomap_desc = {
        NULL
 };
 
-
 int vnop_fsync_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_fsync_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_fsync_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_fsync_desc = {
@@ -451,8 +499,8 @@ struct vnodeop_desc vnop_fsync_desc = {
 };
 
 int vnop_remove_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_remove_args,a_dvp),
-       VOPARG_OFFSETOF(struct vnop_remove_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_remove_args, a_dvp),
+       VOPARG_OFFSETOF(struct vnop_remove_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_remove_desc = {
@@ -468,9 +516,26 @@ struct vnodeop_desc vnop_remove_desc = {
        NULL
 };
 
+int vnop_remove_extended_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_remove_args, a_dvp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_compound_remove_desc = {
+       0,
+       "vnop_compound_remove",
+       0,
+       vnop_remove_vp_offsets,
+       VOPARG_OFFSETOF(struct vnop_compound_remove_args, a_vpp),
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_remove_args, a_cnp),
+       VOPARG_OFFSETOF(struct vnop_remove_args, a_context),
+       NULL
+};
+
 int vnop_link_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_link_args,a_vp),
-       VOPARG_OFFSETOF(struct vnop_link_args,a_tdvp),
+       VOPARG_OFFSETOF(struct vnop_link_args, a_vp),
+       VOPARG_OFFSETOF(struct vnop_link_args, a_tdvp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_link_desc = {
@@ -487,10 +552,10 @@ struct vnodeop_desc vnop_link_desc = {
 };
 
 int vnop_rename_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_rename_args,a_fdvp),
-       VOPARG_OFFSETOF(struct vnop_rename_args,a_fvp),
-       VOPARG_OFFSETOF(struct vnop_rename_args,a_tdvp),
-       VOPARG_OFFSETOF(struct vnop_rename_args,a_tvp),
+       VOPARG_OFFSETOF(struct vnop_rename_args, a_fdvp),
+       VOPARG_OFFSETOF(struct vnop_rename_args, a_fvp),
+       VOPARG_OFFSETOF(struct vnop_rename_args, a_tdvp),
+       VOPARG_OFFSETOF(struct vnop_rename_args, a_tvp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_rename_desc = {
@@ -506,26 +571,84 @@ struct vnodeop_desc vnop_rename_desc = {
        NULL
 };
 
+int vnop_renamex_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_renamex_args, a_fdvp),
+       VOPARG_OFFSETOF(struct vnop_renamex_args, a_fvp),
+       VOPARG_OFFSETOF(struct vnop_renamex_args, a_tdvp),
+       VOPARG_OFFSETOF(struct vnop_renamex_args, a_tvp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_renamex_desc = {
+       0,
+       "vnop_renamex",
+       0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLRELE | VDESC_VP3_WILLRELE,
+       vnop_renamex_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_renamex_args, a_fcnp),
+       VOPARG_OFFSETOF(struct vnop_renamex_args, a_context),
+       NULL
+};
+
+int vnop_compound_rename_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_compound_rename_args, a_fdvp),
+       VOPARG_OFFSETOF(struct vnop_compound_rename_args, a_fvpp),
+       VOPARG_OFFSETOF(struct vnop_compound_rename_args, a_tdvp),
+       VOPARG_OFFSETOF(struct vnop_compound_rename_args, a_tvpp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_compound_rename_desc = {
+       0,
+       "vnop_compound_rename",
+       0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLRELE | VDESC_VP3_WILLRELE,
+       vnop_compound_rename_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_compound_rename_args, a_fcnp),
+       VOPARG_OFFSETOF(struct vnop_compound_rename_args, a_context),
+       NULL
+};
+
 int vnop_mkdir_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_mkdir_args,a_dvp),
-       VDESC_NO_OFFSET
+       VOPARG_OFFSETOF(struct vnop_mkdir_args, a_dvp),
+       VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_mkdir_desc = {
-       0,
-       "vnop_mkdir",
-       0 | VDESC_VP0_WILLRELE,
-       vnop_mkdir_vp_offsets,
-       VOPARG_OFFSETOF(struct vnop_mkdir_args, a_vpp),
-       VDESC_NO_OFFSET,
-       VDESC_NO_OFFSET,
-       VOPARG_OFFSETOF(struct vnop_mkdir_args, a_cnp),
-       VOPARG_OFFSETOF(struct vnop_mkdir_args, a_context),
-       NULL
+       0,
+       "vnop_mkdir",
+       0 | VDESC_VP0_WILLRELE,
+       vnop_mkdir_vp_offsets,
+       VOPARG_OFFSETOF(struct vnop_mkdir_args, a_vpp),
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_mkdir_args, a_cnp),
+       VOPARG_OFFSETOF(struct vnop_mkdir_args, a_context),
+       NULL
+};
+
+int vnop_compound_mkdir_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_compound_mkdir_args, a_dvp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_compound_mkdir_desc = {
+       0,
+       "vnop_compound_mkdir",
+       0 | VDESC_VP0_WILLRELE,
+       vnop_compound_mkdir_vp_offsets,
+       VOPARG_OFFSETOF(struct vnop_compound_mkdir_args, a_vpp),
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_compound_mkdir_args, a_cnp),
+       VOPARG_OFFSETOF(struct vnop_compound_mkdir_args, a_context),
+       NULL
 };
 
+
 int vnop_rmdir_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_rmdir_args,a_dvp),
-       VOPARG_OFFSETOF(struct vnop_rmdir_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_rmdir_args, a_dvp),
+       VOPARG_OFFSETOF(struct vnop_rmdir_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_rmdir_desc = {
@@ -541,25 +664,42 @@ struct vnodeop_desc vnop_rmdir_desc = {
        NULL
 };
 
+int vnop_compound_rmdir_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_compound_rmdir_args, a_dvp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_compound_rmdir_desc = {
+       0,
+       "vnop_compound_rmdir",
+       0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE,
+       vnop_rmdir_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_compound_rmdir_args, a_cnp),
+       VOPARG_OFFSETOF(struct vnop_compound_rmdir_args, a_context),
+       NULL
+};
+
 int vnop_symlink_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_symlink_args,a_dvp),
-       VDESC_NO_OFFSET
+       VOPARG_OFFSETOF(struct vnop_symlink_args, a_dvp),
+       VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_symlink_desc = {
-       0,
-       "vnop_symlink",
-       0 | VDESC_VP0_WILLRELE | VDESC_VPP_WILLRELE,
-       vnop_symlink_vp_offsets,
-       VOPARG_OFFSETOF(struct vnop_symlink_args, a_vpp),
-       VDESC_NO_OFFSET,
-       VDESC_NO_OFFSET,
-       VOPARG_OFFSETOF(struct vnop_symlink_args, a_cnp),
-       VOPARG_OFFSETOF(struct vnop_symlink_args, a_context),
-       NULL
+       0,
+       "vnop_symlink",
+       0 | VDESC_VP0_WILLRELE | VDESC_VPP_WILLRELE,
+       vnop_symlink_vp_offsets,
+       VOPARG_OFFSETOF(struct vnop_symlink_args, a_vpp),
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_symlink_args, a_cnp),
+       VOPARG_OFFSETOF(struct vnop_symlink_args, a_context),
+       NULL
 };
 
 int vnop_readdir_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_readdir_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_readdir_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_readdir_desc = {
@@ -576,7 +716,7 @@ struct vnodeop_desc vnop_readdir_desc = {
 };
 
 int vnop_readdirattr_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_readdirattr_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_readdirattr_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_readdirattr_desc = {
@@ -592,8 +732,25 @@ struct vnodeop_desc vnop_readdirattr_desc = {
        NULL
 };
 
+int vnop_getattrlistbulk_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_getattrlistbulk_args, a_vp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_getattrlistbulk_desc = {
+       0,
+       "vnop_getattrlistbulk",
+       0,
+       vnop_getattrlistbulk_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VOPARG_OFFSETOF(struct vnop_getattrlistbulk_args, a_context),
+       NULL
+};
+
 int vnop_readlink_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_readlink_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_readlink_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_readlink_desc = {
@@ -610,7 +767,7 @@ struct vnodeop_desc vnop_readlink_desc = {
 };
 
 int vnop_inactive_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_inactive_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_inactive_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_inactive_desc = {
@@ -627,7 +784,7 @@ struct vnodeop_desc vnop_inactive_desc = {
 };
 
 int vnop_reclaim_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_reclaim_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_reclaim_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_reclaim_desc = {
@@ -644,7 +801,7 @@ struct vnodeop_desc vnop_reclaim_desc = {
 };
 
 int vnop_pathconf_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_pathconf_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_pathconf_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_pathconf_desc = {
@@ -661,7 +818,7 @@ struct vnodeop_desc vnop_pathconf_desc = {
 };
 
 int vnop_advlock_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_advlock_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_advlock_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_advlock_desc = {
@@ -678,7 +835,7 @@ struct vnodeop_desc vnop_advlock_desc = {
 };
 
 int vnop_allocate_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_allocate_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_allocate_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_allocate_desc = {
@@ -695,7 +852,7 @@ struct vnodeop_desc vnop_allocate_desc = {
 };
 
 int vnop_pagein_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_pagein_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_pagein_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_pagein_desc = {
@@ -712,7 +869,7 @@ struct vnodeop_desc vnop_pagein_desc = {
 };
 
 int vnop_pageout_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_pageout_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_pageout_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_pageout_desc = {
@@ -729,7 +886,7 @@ struct vnodeop_desc vnop_pageout_desc = {
 };
 
 int vnop_searchfs_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_searchfs_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_searchfs_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_searchfs_desc = {
@@ -746,26 +903,44 @@ struct vnodeop_desc vnop_searchfs_desc = {
 };
 
 int vnop_copyfile_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_copyfile_args,a_fvp),
-       VOPARG_OFFSETOF(struct vnop_copyfile_args,a_tdvp),
-       VOPARG_OFFSETOF(struct vnop_copyfile_args,a_tvp),
+       VOPARG_OFFSETOF(struct vnop_copyfile_args, a_fvp),
+       VOPARG_OFFSETOF(struct vnop_copyfile_args, a_tdvp),
+       VOPARG_OFFSETOF(struct vnop_copyfile_args, a_tvp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_copyfile_desc = {
-       0,
-       "vnop_copyfile",
-       0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLRELE,
-       vnop_copyfile_vp_offsets,
-       VDESC_NO_OFFSET,
-       VDESC_NO_OFFSET,
-       VDESC_NO_OFFSET,
-       VOPARG_OFFSETOF(struct vnop_copyfile_args, a_tcnp),
-       VDESC_NO_OFFSET,
-       NULL
+       .vdesc_offset = 0,
+       .vdesc_name = "vnop_copyfile",
+       .vdesc_flags = 0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLRELE,
+       .vdesc_vp_offsets = vnop_copyfile_vp_offsets,
+       .vdesc_vpp_offset = VDESC_NO_OFFSET,
+       .vdesc_cred_offset = VDESC_NO_OFFSET,
+       .vdesc_proc_offset = VDESC_NO_OFFSET,
+       .vdesc_componentname_offset = VOPARG_OFFSETOF(struct vnop_copyfile_args, a_tcnp),
+       .vdesc_context_offset = VDESC_NO_OFFSET,
+       .vdesc_transports = NULL
+};
+
+int vnop_clonefile_vp_offsets[] = {
+       VOPARG_OFFSETOF(struct vnop_clonefile_args, a_fvp),
+       VOPARG_OFFSETOF(struct vnop_clonefile_args, a_dvp),
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_clonefile_desc = {
+       .vdesc_offset = 0,
+       .vdesc_name = "vnop_clonefile",
+       .vdesc_flags = 0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VPP_WILLRELE,
+       .vdesc_vp_offsets = vnop_clonefile_vp_offsets,
+       .vdesc_vpp_offset = VOPARG_OFFSETOF(struct vnop_clonefile_args, a_vpp),
+       .vdesc_cred_offset = VDESC_NO_OFFSET,
+       .vdesc_proc_offset = VDESC_NO_OFFSET,
+       .vdesc_componentname_offset = VOPARG_OFFSETOF(struct vnop_clonefile_args, a_cnp),
+       .vdesc_context_offset = VOPARG_OFFSETOF(struct vnop_clonefile_args, a_context),
+       .vdesc_transports = NULL
 };
 
 int vop_getxattr_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_getxattr_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_getxattr_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_getxattr_desc = {
@@ -782,7 +957,7 @@ struct vnodeop_desc vnop_getxattr_desc = {
 };
 
 int vop_setxattr_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_setxattr_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_setxattr_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_setxattr_desc = {
@@ -799,7 +974,7 @@ struct vnodeop_desc vnop_setxattr_desc = {
 };
 
 int vop_removexattr_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_removexattr_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_removexattr_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_removexattr_desc = {
@@ -816,7 +991,7 @@ struct vnodeop_desc vnop_removexattr_desc = {
 };
 
 int vop_listxattr_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_listxattr_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_listxattr_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_listxattr_desc = {
@@ -833,7 +1008,7 @@ struct vnodeop_desc vnop_listxattr_desc = {
 };
 
 int vnop_blktooff_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_blktooff_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_blktooff_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_blktooff_desc = {
@@ -850,7 +1025,7 @@ struct vnodeop_desc vnop_blktooff_desc = {
 };
 
 int vnop_offtoblk_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_offtoblk_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_offtoblk_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_offtoblk_desc = {
@@ -867,7 +1042,7 @@ struct vnodeop_desc vnop_offtoblk_desc = {
 };
 
 int vnop_blockmap_vp_offsets[] = {
-       VOPARG_OFFSETOF(struct vnop_blockmap_args,a_vp),
+       VOPARG_OFFSETOF(struct vnop_blockmap_args, a_vp),
        VDESC_NO_OFFSET
 };
 struct vnodeop_desc vnop_blockmap_desc = {
@@ -935,10 +1110,53 @@ struct vnodeop_desc vnop_removenamedstream_desc = {
        NULL
 };
 #else
-/* These symbols are in the exports list so they need to always be defined. */
-int vnop_getnamedstream_desc;
-int vnop_makenamedstream_desc;
-int vnop_removenamedstream_desc;
+int vnop_getnamedstream_vp_offsets[] = {
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_getnamedstream_desc = {
+       0,
+       "vnop_getnamedstream",
+       VDESC_DISABLED, /* flags */
+       vnop_getnamedstream_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       NULL
+};
+
+int vnop_makenamedstream_vp_offsets[] = {
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_makenamedstream_desc = {
+       0,
+       "vnop_makenamedstream",
+       VDESC_DISABLED, /* flags */
+       vnop_makenamedstream_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       NULL
+};
+
+int vnop_removenamedstream_vp_offsets[] = {
+       VDESC_NO_OFFSET
+};
+struct vnodeop_desc vnop_removenamedstream_desc = {
+       0,
+       "vnop_removenamedstream",
+       VDESC_DISABLED, /* flags */
+       vnop_removenamedstream_vp_offsets,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       VDESC_NO_OFFSET,
+       NULL
+};
 #endif
 
 /* Special cases: */
@@ -978,15 +1196,16 @@ struct vnodeop_desc vnop_bwrite_desc = {
 /* End of special cases. */
 
 struct vnodeop_desc *vfs_op_descs[] = {
-       &vnop_default_desc,     /* MUST BE FIRST */
-       &vnop_strategy_desc,    /* XXX: SPECIAL CASE */
-       &vnop_bwrite_desc,      /* XXX: SPECIAL CASE */
+       &vnop_default_desc,     /* MUST BE FIRST */
+       &vnop_strategy_desc,    /* XXX: SPECIAL CASE */
+       &vnop_bwrite_desc,      /* XXX: SPECIAL CASE */
 
        &vnop_lookup_desc,
        &vnop_create_desc,
        &vnop_mknod_desc,
        &vnop_whiteout_desc,
        &vnop_open_desc,
+       &vnop_compound_open_desc,
        &vnop_close_desc,
        &vnop_access_desc,
        &vnop_getattr_desc,
@@ -1000,17 +1219,24 @@ struct vnodeop_desc *vfs_op_descs[] = {
        &vnop_kqfilt_remove_desc,
        &vnop_setlabel_desc,
        &vnop_revoke_desc,
+       &vnop_mmap_check_desc,
        &vnop_mmap_desc,
        &vnop_mnomap_desc,
        &vnop_fsync_desc,
        &vnop_remove_desc,
+       &vnop_compound_remove_desc,
        &vnop_link_desc,
        &vnop_rename_desc,
+       &vnop_renamex_desc,
+       &vnop_compound_rename_desc,
        &vnop_mkdir_desc,
+       &vnop_compound_mkdir_desc,
        &vnop_rmdir_desc,
+       &vnop_compound_rmdir_desc,
        &vnop_symlink_desc,
        &vnop_readdir_desc,
        &vnop_readdirattr_desc,
+       &vnop_getattrlistbulk_desc,
        &vnop_readlink_desc,
        &vnop_inactive_desc,
        &vnop_reclaim_desc,
@@ -1021,6 +1247,7 @@ struct vnodeop_desc *vfs_op_descs[] = {
        &vnop_pageout_desc,
        &vnop_searchfs_desc,
        &vnop_copyfile_desc,
+       &vnop_clonefile_desc,
        &vnop_getxattr_desc,
        &vnop_setxattr_desc,
        &vnop_removexattr_desc,
@@ -1028,11 +1255,18 @@ struct vnodeop_desc *vfs_op_descs[] = {
        &vnop_blktooff_desc,
        &vnop_offtoblk_desc,
        &vnop_blockmap_desc,
-#if NAMEDSTREAMS
+       &vnop_monitor_desc,
+#if !defined(NAMEDSTREAMS)
+       /*
+        * We define the named streams ops descriptors as we _always_ have to
+        * have symbols with their names, and as such we really really need
+        * those symbols to be valid operations descriptors. However if
+        * named streams support is not enabled, we flag these descriptors
+        * as ignored.
+        */
+#endif
        &vnop_getnamedstream_desc,
        &vnop_makenamedstream_desc,
        &vnop_removenamedstream_desc,
-#endif
        NULL
 };
-