]> git.saurik.com Git - apple/xnu.git/blobdiff - security/mac_vfs.c
xnu-6153.11.26.tar.gz
[apple/xnu.git] / security / mac_vfs.c
index 81b311012fb7a1abbc5b9821b3c904b6c6b7470a..95afa830b40c0e0c9e5bc2bf33c95072de63294f 100644 (file)
@@ -63,6 +63,7 @@
  */
 
 #include <kern/kalloc.h>
+#include <libkern/OSAtomic.h>
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -80,6 +81,8 @@
 #include <sys/reason.h>
 #include <sys/uio_internal.h>
 #include <sys/vnode_internal.h>
+#include <sys/kdebug.h>
+
 
 #include <miscfs/devfs/devfsdefs.h>
 #include <miscfs/devfs/fdesc.h>
 /* convert {R,W,X}_OK values to V{READ,WRITE,EXEC} */
 #define ACCESS_MODE_TO_VNODE_MASK(m)    (m << 6)
 
+
+/*
+ * Optional tracing of policy operations. Define VFS_TRACE_POLICY_OPS to trace the operations.
+ *
+ * Along with DBG_FSYSTEM and DBG_VFS, dcode in the macros below is used to construct
+ * KDBG_EVENTID(DBG_FSYSTEM, DBG_VFS, dcode) global event id, see bsd/sys/kdebug.h.
+ * Note that dcode is multiplied by 4 and ORed as part of the construction. See bsd/kern/trace_codes
+ * for list of system-wide {global event id, name} pairs. Currently DBG_VFS event ids are in range
+ * [0x3130000, 0x313016C].
+ */
+
+//#define VFS_TRACE_POLICY_OPS
+
+#ifdef VFS_TRACE_POLICY_OPS
+#define DBG_VFS_CODE(dcode)                     FSDBG_CODE(DBG_VFS, dcode)
+#define VFS_KERNEL_DEBUG_START0(dcode)          KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_START, 0, 0, 0, 0, 0)
+#define VFS_KERNEL_DEBUG_END0(dcode)            KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_END, 0, 0, 0, 0, 0)
+#define VFS_KERNEL_DEBUG_START1(dcode, darg)    KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_START, darg, 0, 0, 0, 0)
+#define VFS_KERNEL_DEBUG_END1(dcode, darg)      KERNEL_DEBUG_CONSTANT(DBG_VFS_CODE(dcode) | DBG_FUNC_END, darg, 0, 0, 0, 0)
+#else
+#define VFS_KERNEL_DEBUG_START0(dcode)          do {} while (0)
+#define VFS_KERNEL_DEBUG_END0(dcode)            do {} while (0)
+#define VFS_KERNEL_DEBUG_START1(dcode, darg)    do {} while (0)
+#define VFS_KERNEL_DEBUG_END1(dcode, darg)      do {} while (0)
+#endif
+
 static struct label *
 mac_devfsdirent_label_alloc(void)
 {
@@ -98,7 +127,9 @@ mac_devfsdirent_label_alloc(void)
        if (label == NULL) {
                return NULL;
        }
+       VFS_KERNEL_DEBUG_START0(0);
        MAC_PERFORM(devfs_label_init, label);
+       VFS_KERNEL_DEBUG_END0(0);
        return label;
 }
 
@@ -117,7 +148,9 @@ mac_mount_label_alloc(void)
        if (label == NULL) {
                return NULL;
        }
+       VFS_KERNEL_DEBUG_START0(1);
        MAC_PERFORM(mount_label_init, label);
+       VFS_KERNEL_DEBUG_END0(1);
        return label;
 }
 
@@ -136,7 +169,10 @@ mac_vnode_label_alloc(void)
        if (label == NULL) {
                return NULL;
        }
+       VFS_KERNEL_DEBUG_START0(2);
        MAC_PERFORM(vnode_label_init, label);
+       VFS_KERNEL_DEBUG_END0(2);
+       OSIncrementAtomic(&mac_vnode_label_count);
        return label;
 }
 
@@ -149,7 +185,21 @@ mac_vnode_label_init(vnode_t vp)
 int
 mac_vnode_label_init_needed(vnode_t vp)
 {
+#if CONFIG_MACF_LAZY_VNODE_LABELS
+       (void)vp;
+       return false;
+#else
        return mac_label_vnodes != 0 && vp->v_label == NULL;
+#endif
+}
+
+struct label *
+mac_vnode_label_allocate(vnode_t vp)
+{
+       if (mac_vnode_label_init_needed(vp)) {
+               vp->v_label = mac_vnode_label_alloc();
+       }
+       return vp->v_label;
 }
 
 /*
@@ -161,12 +211,21 @@ void
 mac_vnode_label_recycle(vnode_t vp)
 {
        MAC_PERFORM(vnode_label_recycle, vp->v_label);
+#if CONFIG_MACF_LAZY_VNODE_LABELS
+       if (vp->v_label) {
+               mac_vnode_label_destroy(vp);
+               vp->v_label = NULL;
+               vp->v_lflag &= ~VL_LABELED;
+       }
+#endif
 }
 
 static void
 mac_devfs_label_free(struct label *label)
 {
+       VFS_KERNEL_DEBUG_START1(3, label);
        MAC_PERFORM(devfs_label_destroy, label);
+       VFS_KERNEL_DEBUG_END1(3, label);
        mac_labelzone_free(label);
 }
 
@@ -182,7 +241,9 @@ mac_devfs_label_destroy(struct devnode *de)
 static void
 mac_mount_label_free(struct label *label)
 {
+       VFS_KERNEL_DEBUG_START1(4, label);
        MAC_PERFORM(mount_label_destroy, label);
+       VFS_KERNEL_DEBUG_END1(4, label);
        mac_labelzone_free(label);
 }
 
@@ -198,11 +259,15 @@ mac_mount_label_destroy(struct mount *mp)
 void
 mac_vnode_label_free(struct label *label)
 {
-       MAC_PERFORM(vnode_label_destroy, label);
-       mac_labelzone_free(label);
+       if (label != NULL) {
+               VFS_KERNEL_DEBUG_START1(5, label);
+               MAC_PERFORM(vnode_label_destroy, label);
+               VFS_KERNEL_DEBUG_END1(5, label);
+               mac_labelzone_free(label);
+               OSDecrementAtomic(&mac_vnode_label_count);
+       }
 }
 
-#ifndef __APPLE__
 void
 mac_vnode_label_destroy(struct vnode *vp)
 {
@@ -211,16 +276,17 @@ mac_vnode_label_destroy(struct vnode *vp)
                vp->v_label = NULL;
        }
 }
-#endif
 
 void
 mac_vnode_label_copy(struct label *src, struct label *dest)
 {
+       VFS_KERNEL_DEBUG_START1(6, src);
        if (src == NULL) {
                MAC_PERFORM(vnode_label_init, dest);
        } else {
                MAC_PERFORM(vnode_label_copy, src, dest);
        }
+       VFS_KERNEL_DEBUG_END1(6, src);
 }
 
 int
@@ -287,7 +353,9 @@ mac_devfs_label_copy(struct label *src, struct label *dest)
        }
 #endif
 
+       VFS_KERNEL_DEBUG_START1(7, src);
        MAC_PERFORM(devfs_label_copy, src, dest);
+       VFS_KERNEL_DEBUG_END1(7, src);
 }
 
 void
@@ -301,8 +369,10 @@ mac_devfs_label_update(struct mount *mp, struct devnode *de,
        }
 #endif
 
+       VFS_KERNEL_DEBUG_START1(8, vp);
        MAC_PERFORM(devfs_label_update, mp, de, de->dn_label, vp,
            vp->v_label);
+       VFS_KERNEL_DEBUG_END1(8, vp);
 }
 
 int
@@ -348,10 +418,12 @@ mac_vnode_label_associate_devfs(struct mount *mp, struct devnode *de,
        }
 #endif
 
+       VFS_KERNEL_DEBUG_START1(9, vp);
        MAC_PERFORM(vnode_label_associate_devfs,
            mp, mp ? mp->mnt_mntlabel : NULL,
            de, de->dn_label,
            vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(9, vp);
 }
 
 int
@@ -359,8 +431,10 @@ mac_vnode_label_associate_extattr(struct mount *mp, struct vnode *vp)
 {
        int error;
 
+       VFS_KERNEL_DEBUG_START1(10, vp);
        MAC_CHECK(vnode_label_associate_extattr, mp, mp->mnt_mntlabel, vp,
            vp->v_label);
+       VFS_KERNEL_DEBUG_END1(10, vp);
 
        return error;
 }
@@ -378,8 +452,10 @@ mac_vnode_label_associate_singlelabel(struct mount *mp, struct vnode *vp)
                return;
        }
 
+       VFS_KERNEL_DEBUG_START1(11, vp);
        MAC_PERFORM(vnode_label_associate_singlelabel, mp,
            mp ? mp->mnt_mntlabel : NULL, vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(11, vp);
 }
 
 int
@@ -399,8 +475,10 @@ mac_vnode_notify_create(vfs_context_t ctx, struct mount *mp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(12, vp);
        MAC_CHECK(vnode_notify_create, cred, mp, mp->mnt_mntlabel,
            dvp, dvp->v_label, vp, vp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(12, vp);
 
        return error;
 }
@@ -421,8 +499,10 @@ mac_vnode_notify_rename(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(13, vp);
        MAC_PERFORM(vnode_notify_rename, cred, vp, vp->v_label,
            dvp, dvp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(13, vp);
 }
 
 void
@@ -440,7 +520,9 @@ mac_vnode_notify_open(vfs_context_t ctx, struct vnode *vp, int acc_flags)
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(14, vp);
        MAC_PERFORM(vnode_notify_open, cred, vp, vp->v_label, acc_flags);
+       VFS_KERNEL_DEBUG_END1(14, vp);
 }
 
 void
@@ -459,7 +541,9 @@ mac_vnode_notify_link(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(15, vp);
        MAC_PERFORM(vnode_notify_link, cred, dvp, dvp->v_label, vp, vp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(15, vp);
 }
 
 void
@@ -477,7 +561,9 @@ mac_vnode_notify_deleteextattr(vfs_context_t ctx, struct vnode *vp, const char *
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(16, vp);
        MAC_PERFORM(vnode_notify_deleteextattr, cred, vp, vp->v_label, name);
+       VFS_KERNEL_DEBUG_END1(16, vp);
 }
 
 void
@@ -495,7 +581,9 @@ mac_vnode_notify_setacl(vfs_context_t ctx, struct vnode *vp, struct kauth_acl *a
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(17, vp);
        MAC_PERFORM(vnode_notify_setacl, cred, vp, vp->v_label, acl);
+       VFS_KERNEL_DEBUG_END1(17, vp);
 }
 
 void
@@ -513,7 +601,9 @@ mac_vnode_notify_setattrlist(vfs_context_t ctx, struct vnode *vp, struct attrlis
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(18, vp);
        MAC_PERFORM(vnode_notify_setattrlist, cred, vp, vp->v_label, alist);
+       VFS_KERNEL_DEBUG_END1(18, vp);
 }
 
 void
@@ -531,7 +621,9 @@ mac_vnode_notify_setextattr(vfs_context_t ctx, struct vnode *vp, const char *nam
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(19, vp);
        MAC_PERFORM(vnode_notify_setextattr, cred, vp, vp->v_label, name, uio);
+       VFS_KERNEL_DEBUG_END1(19, vp);
 }
 
 void
@@ -549,7 +641,9 @@ mac_vnode_notify_setflags(vfs_context_t ctx, struct vnode *vp, u_long flags)
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(20, vp);
        MAC_PERFORM(vnode_notify_setflags, cred, vp, vp->v_label, flags);
+       VFS_KERNEL_DEBUG_END1(20, vp);
 }
 
 void
@@ -567,7 +661,9 @@ mac_vnode_notify_setmode(vfs_context_t ctx, struct vnode *vp, mode_t mode)
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(21, vp);
        MAC_PERFORM(vnode_notify_setmode, cred, vp, vp->v_label, mode);
+       VFS_KERNEL_DEBUG_END1(21, vp);
 }
 
 void
@@ -585,7 +681,9 @@ mac_vnode_notify_setowner(vfs_context_t ctx, struct vnode *vp, uid_t uid, gid_t
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(22, vp);
        MAC_PERFORM(vnode_notify_setowner, cred, vp, vp->v_label, uid, gid);
+       VFS_KERNEL_DEBUG_END1(22, vp);
 }
 
 void
@@ -603,7 +701,9 @@ mac_vnode_notify_setutimes(vfs_context_t ctx, struct vnode *vp, struct timespec
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(23, vp);
        MAC_PERFORM(vnode_notify_setutimes, cred, vp, vp->v_label, atime, mtime);
+       VFS_KERNEL_DEBUG_END1(23, vp);
 }
 
 void
@@ -621,7 +721,9 @@ mac_vnode_notify_truncate(vfs_context_t ctx, kauth_cred_t file_cred, struct vnod
        if (!mac_cred_check_enforce(cred)) {
                return;
        }
+       VFS_KERNEL_DEBUG_START1(24, vp);
        MAC_PERFORM(vnode_notify_truncate, cred, file_cred, vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(24, vp);
 }
 
 /*
@@ -645,8 +747,10 @@ mac_vnode_label_update_extattr(struct mount *mp, struct vnode *vp,
                return;
        }
 
+       VFS_KERNEL_DEBUG_START1(25, vp);
        MAC_PERFORM(vnode_label_update_extattr, mp, mp->mnt_mntlabel, vp,
            vp->v_label, name);
+       VFS_KERNEL_DEBUG_END1(25, vp);
        if (error == 0) {
                return;
        }
@@ -678,7 +782,9 @@ mac_vnode_label_store(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(26, vp);
        MAC_CHECK(vnode_label_store, cred, vp, vp->v_label, intlabel);
+       VFS_KERNEL_DEBUG_END1(26, vp);
 
        return error;
 }
@@ -710,6 +816,7 @@ mac_cred_label_update_execve(vfs_context_t ctx, kauth_cred_t new, struct vnode *
         *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
         *     spawnattrlen as an argument to the hook.
         */
+       VFS_KERNEL_DEBUG_START1(27, vp);
        {
                struct mac_policy_conf *mpc;
                u_int i;
@@ -756,6 +863,7 @@ mac_cred_label_update_execve(vfs_context_t ctx, kauth_cred_t new, struct vnode *
                }
        }
        *labelupdateerror = error;
+       VFS_KERNEL_DEBUG_END1(27, vp);
 }
 
 int
@@ -775,6 +883,7 @@ mac_cred_check_label_update_execve(vfs_context_t ctx, struct vnode *vp, off_t of
 
        cred = vfs_context_ucred(ctx);
 
+       VFS_KERNEL_DEBUG_START1(28, vp);
        /*
         * NB: Cannot use MAC_BOOLEAN macro because we need a sequence point after
         *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
@@ -820,6 +929,7 @@ mac_cred_check_label_update_execve(vfs_context_t ctx, struct vnode *vp, off_t of
                        mac_policy_list_unbusy();
                }
        }
+       VFS_KERNEL_DEBUG_END1(28, vp);
 
        return result;
 }
@@ -844,7 +954,9 @@ mac_vnode_check_access(vfs_context_t ctx, struct vnode *vp,
        }
        /* Convert {R,W,X}_OK values to V{READ,WRITE,EXEC} for entry points */
        mask = ACCESS_MODE_TO_VNODE_MASK(acc_mode);
+       VFS_KERNEL_DEBUG_START1(29, vp);
        MAC_CHECK(vnode_check_access, cred, vp, vp->v_label, mask);
+       VFS_KERNEL_DEBUG_END1(29, vp);
        return error;
 }
 
@@ -864,7 +976,9 @@ mac_vnode_check_chdir(vfs_context_t ctx, struct vnode *dvp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(30, dvp);
        MAC_CHECK(vnode_check_chdir, cred, dvp, dvp->v_label);
+       VFS_KERNEL_DEBUG_END1(30, dvp);
        return error;
 }
 
@@ -885,7 +999,9 @@ mac_vnode_check_chroot(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(31, dvp);
        MAC_CHECK(vnode_check_chroot, cred, dvp, dvp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(31, dvp);
        return error;
 }
 
@@ -906,8 +1022,10 @@ mac_vnode_check_clone(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(32, dvp);
        MAC_CHECK(vnode_check_clone, cred, dvp, dvp->v_label, vp,
            vp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(32, dvp);
        return error;
 }
 int
@@ -927,7 +1045,9 @@ mac_vnode_check_create(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(33, dvp);
        MAC_CHECK(vnode_check_create, cred, dvp, dvp->v_label, cnp, vap);
+       VFS_KERNEL_DEBUG_END1(33, dvp);
        return error;
 }
 
@@ -948,8 +1068,10 @@ mac_vnode_check_unlink(vfs_context_t ctx, struct vnode *dvp, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(34, dvp);
        MAC_CHECK(vnode_check_unlink, cred, dvp, dvp->v_label, vp,
            vp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(34, dvp);
        return error;
 }
 #if 0
@@ -970,7 +1092,9 @@ mac_vnode_check_deleteacl(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(35, dvp);
        MAC_CHECK(vnode_check_deleteacl, cred, vp, vp->v_label, type);
+       VFS_KERNEL_DEBUG_END1(35, dvp);
        return error;
 }
 #endif
@@ -992,7 +1116,9 @@ mac_vnode_check_deleteextattr(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(36, vp);
        MAC_CHECK(vnode_check_deleteextattr, cred, vp, vp->v_label, name);
+       VFS_KERNEL_DEBUG_END1(36, vp);
        return error;
 }
 int
@@ -1012,8 +1138,10 @@ mac_vnode_check_exchangedata(vfs_context_t ctx,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(37, v1);
        MAC_CHECK(vnode_check_exchangedata, cred, v1, v1->v_label,
            v2, v2->v_label);
+       VFS_KERNEL_DEBUG_END1(37, v1);
 
        return error;
 }
@@ -1035,7 +1163,9 @@ mac_vnode_check_getacl(vfs_context_t ctx, struct vnode *vp, acl_type_t type)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(38, vp);
        MAC_CHECK(vnode_check_getacl, cred, vp, vp->v_label, type);
+       VFS_KERNEL_DEBUG_END1(38, vp);
        return error;
 }
 #endif
@@ -1057,7 +1187,9 @@ mac_vnode_check_getattr(vfs_context_t ctx, struct ucred *file_cred,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(39, vp);
        MAC_CHECK(vnode_check_getattr, cred, file_cred, vp, vp->v_label, va);
+       VFS_KERNEL_DEBUG_END1(39, vp);
        return error;
 }
 
@@ -1078,7 +1210,9 @@ mac_vnode_check_getattrlist(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(40, vp);
        MAC_CHECK(vnode_check_getattrlist, cred, vp, vp->v_label, alist);
+       VFS_KERNEL_DEBUG_END1(40, vp);
 
        /* Falsify results instead of returning error? */
        return error;
@@ -1105,6 +1239,7 @@ mac_vnode_check_exec(vfs_context_t ctx, struct vnode *vp,
         *     calling exec_spawnattr_getmacpolicyinfo() and before passing the
         *     spawnattrlen as an argument to the hook.
         */
+       VFS_KERNEL_DEBUG_START1(41, vp);
        {
                struct mac_policy_conf *mpc;
                u_int i;
@@ -1153,6 +1288,7 @@ mac_vnode_check_exec(vfs_context_t ctx, struct vnode *vp,
                        mac_policy_list_unbusy();
                }
        }
+       VFS_KERNEL_DEBUG_END1(41, vp);
 
        return error;
 }
@@ -1173,7 +1309,9 @@ mac_vnode_check_fsgetpath(vfs_context_t ctx, struct vnode *vp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(42, vp);
        MAC_CHECK(vnode_check_fsgetpath, cred, vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(42, vp);
        return error;
 }
 
@@ -1199,8 +1337,10 @@ mac_vnode_check_signature(struct vnode *vp, struct cs_blob *cs_blob,
        }
 #endif
 
+       VFS_KERNEL_DEBUG_START1(43, vp);
        MAC_CHECK(vnode_check_signature, vp, vp->v_label, cpu_type, cs_blob,
            cs_flags, signer_type, flags, &fatal_failure_desc, &fatal_failure_desc_len);
+       VFS_KERNEL_DEBUG_END1(43, vp);
 
        if (fatal_failure_desc_len) {
                // A fatal code signature validation failure occured, formulate a crash
@@ -1305,7 +1445,9 @@ mac_vnode_check_getacl(vfs_context_t ctx, struct vnode *vp, acl_type_t type)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(44, vp);
        MAC_CHECK(vnode_check_getacl, cred, vp, vp->v_label, type);
+       VFS_KERNEL_DEBUG_END1(44, vp);
        return error;
 }
 #endif
@@ -1327,8 +1469,10 @@ mac_vnode_check_getextattr(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(45, vp);
        MAC_CHECK(vnode_check_getextattr, cred, vp, vp->v_label,
            name, uio);
+       VFS_KERNEL_DEBUG_END1(45, vp);
        return error;
 }
 
@@ -1348,7 +1492,9 @@ mac_vnode_check_ioctl(vfs_context_t ctx, struct vnode *vp, u_int cmd)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(46, vp);
        MAC_CHECK(vnode_check_ioctl, cred, vp, vp->v_label, cmd);
+       VFS_KERNEL_DEBUG_END1(46, vp);
        return error;
 }
 
@@ -1369,8 +1515,10 @@ mac_vnode_check_kqfilter(vfs_context_t ctx, kauth_cred_t file_cred,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(47, vp);
        MAC_CHECK(vnode_check_kqfilter, cred, file_cred, kn, vp,
            vp->v_label);
+       VFS_KERNEL_DEBUG_END1(47, vp);
 
        return error;
 }
@@ -1392,8 +1540,10 @@ mac_vnode_check_link(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(48, vp);
        MAC_CHECK(vnode_check_link, cred, dvp, dvp->v_label, vp,
            vp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(48, vp);
        return error;
 }
 
@@ -1413,7 +1563,9 @@ mac_vnode_check_listextattr(vfs_context_t ctx, struct vnode *vp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(49, vp);
        MAC_CHECK(vnode_check_listextattr, cred, vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(49, vp);
        return error;
 }
 
@@ -1434,7 +1586,9 @@ mac_vnode_check_lookup_preflight(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(50, dvp);
        MAC_CHECK(vnode_check_lookup_preflight, cred, dvp, dvp->v_label, path, pathlen);
+       VFS_KERNEL_DEBUG_END1(50, dvp);
        return error;
 }
 
@@ -1455,7 +1609,9 @@ mac_vnode_check_lookup(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(51, dvp);
        MAC_CHECK(vnode_check_lookup, cred, dvp, dvp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(51, dvp);
        return error;
 }
 
@@ -1475,7 +1631,9 @@ mac_vnode_check_open(vfs_context_t ctx, struct vnode *vp, int acc_mode)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(52, vp);
        MAC_CHECK(vnode_check_open, cred, vp, vp->v_label, acc_mode);
+       VFS_KERNEL_DEBUG_END1(52, vp);
        return error;
 }
 
@@ -1496,8 +1654,10 @@ mac_vnode_check_read(vfs_context_t ctx, struct ucred *file_cred,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(53, vp);
        MAC_CHECK(vnode_check_read, cred, file_cred, vp,
            vp->v_label);
+       VFS_KERNEL_DEBUG_END1(53, vp);
 
        return error;
 }
@@ -1518,7 +1678,9 @@ mac_vnode_check_readdir(vfs_context_t ctx, struct vnode *dvp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(54, dvp);
        MAC_CHECK(vnode_check_readdir, cred, dvp, dvp->v_label);
+       VFS_KERNEL_DEBUG_END1(54, dvp);
        return error;
 }
 
@@ -1538,7 +1700,9 @@ mac_vnode_check_readlink(vfs_context_t ctx, struct vnode *vp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(55, vp);
        MAC_CHECK(vnode_check_readlink, cred, vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(55, vp);
        return error;
 }
 
@@ -1559,7 +1723,9 @@ mac_vnode_check_label_update(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(56, vp);
        MAC_CHECK(vnode_check_label_update, cred, vp, vp->v_label, newlabel);
+       VFS_KERNEL_DEBUG_END1(56, vp);
 
        return error;
 }
@@ -1583,21 +1749,25 @@ mac_vnode_check_rename(vfs_context_t ctx, struct vnode *dvp,
                return 0;
        }
 
+       VFS_KERNEL_DEBUG_START1(57, vp);
        MAC_CHECK(vnode_check_rename_from, cred, dvp, dvp->v_label, vp,
            vp->v_label, cnp);
        if (error) {
+               VFS_KERNEL_DEBUG_END1(57, vp);
                return error;
        }
 
        MAC_CHECK(vnode_check_rename_to, cred, tdvp, tdvp->v_label, tvp,
            tvp != NULL ? tvp->v_label : NULL, dvp == tdvp, tcnp);
        if (error) {
+               VFS_KERNEL_DEBUG_END1(57, vp);
                return error;
        }
 
        MAC_CHECK(vnode_check_rename, cred, dvp, dvp->v_label, vp,
            vp->v_label, cnp, tdvp, tdvp->v_label, tvp,
            tvp != NULL ? tvp->v_label : NULL, tcnp);
+       VFS_KERNEL_DEBUG_END1(57, vp);
        return error;
 }
 
@@ -1617,7 +1787,9 @@ mac_vnode_check_revoke(vfs_context_t ctx, struct vnode *vp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(58, vp);
        MAC_CHECK(vnode_check_revoke, cred, vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(58, vp);
        return error;
 }
 
@@ -1637,7 +1809,9 @@ mac_vnode_check_searchfs(vfs_context_t ctx, struct vnode *vp, struct attrlist *a
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(59, vp);
        MAC_CHECK(vnode_check_searchfs, cred, vp, vp->v_label, alist);
+       VFS_KERNEL_DEBUG_END1(59, vp);
        return error;
 }
 
@@ -1657,7 +1831,9 @@ mac_vnode_check_select(vfs_context_t ctx, struct vnode *vp, int which)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(60, vp);
        MAC_CHECK(vnode_check_select, cred, vp, vp->v_label, which);
+       VFS_KERNEL_DEBUG_END1(60, vp);
        return error;
 }
 
@@ -1678,7 +1854,9 @@ mac_vnode_check_setacl(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(61, vp);
        MAC_CHECK(vnode_check_setacl, cred, vp, vp->v_label, acl);
+       VFS_KERNEL_DEBUG_END1(61, vp);
        return error;
 }
 
@@ -1699,7 +1877,9 @@ mac_vnode_check_setattrlist(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(62, vp);
        MAC_CHECK(vnode_check_setattrlist, cred, vp, vp->v_label, alist);
+       VFS_KERNEL_DEBUG_END1(62, vp);
        return error;
 }
 
@@ -1720,8 +1900,10 @@ mac_vnode_check_setextattr(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(63, vp);
        MAC_CHECK(vnode_check_setextattr, cred, vp, vp->v_label,
            name, uio);
+       VFS_KERNEL_DEBUG_END1(63, vp);
        return error;
 }
 
@@ -1741,7 +1923,9 @@ mac_vnode_check_setflags(vfs_context_t ctx, struct vnode *vp, u_long flags)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(64, vp);
        MAC_CHECK(vnode_check_setflags, cred, vp, vp->v_label, flags);
+       VFS_KERNEL_DEBUG_END1(64, vp);
        return error;
 }
 
@@ -1761,7 +1945,9 @@ mac_vnode_check_setmode(vfs_context_t ctx, struct vnode *vp, mode_t mode)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(65, vp);
        MAC_CHECK(vnode_check_setmode, cred, vp, vp->v_label, mode);
+       VFS_KERNEL_DEBUG_END1(65, vp);
        return error;
 }
 
@@ -1782,7 +1968,9 @@ mac_vnode_check_setowner(vfs_context_t ctx, struct vnode *vp, uid_t uid,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(66, vp);
        MAC_CHECK(vnode_check_setowner, cred, vp, vp->v_label, uid, gid);
+       VFS_KERNEL_DEBUG_END1(66, vp);
        return error;
 }
 
@@ -1803,8 +1991,10 @@ mac_vnode_check_setutimes(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(67, vp);
        MAC_CHECK(vnode_check_setutimes, cred, vp, vp->v_label, atime,
            mtime);
+       VFS_KERNEL_DEBUG_END1(67, vp);
        return error;
 }
 
@@ -1825,8 +2015,10 @@ mac_vnode_check_stat(vfs_context_t ctx, struct ucred *file_cred,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(68, vp);
        MAC_CHECK(vnode_check_stat, cred, file_cred, vp,
            vp->v_label);
+       VFS_KERNEL_DEBUG_END1(68, vp);
        return error;
 }
 
@@ -1847,7 +2039,9 @@ mac_vnode_check_trigger_resolve(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(69, dvp);
        MAC_CHECK(vnode_check_trigger_resolve, cred, dvp, dvp->v_label, cnp);
+       VFS_KERNEL_DEBUG_END1(69, dvp);
        return error;
 }
 
@@ -1868,8 +2062,10 @@ mac_vnode_check_truncate(vfs_context_t ctx, struct ucred *file_cred,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(70, vp);
        MAC_CHECK(vnode_check_truncate, cred, file_cred, vp,
            vp->v_label);
+       VFS_KERNEL_DEBUG_END1(70, vp);
 
        return error;
 }
@@ -1891,7 +2087,9 @@ mac_vnode_check_write(vfs_context_t ctx, struct ucred *file_cred,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(71, vp);
        MAC_CHECK(vnode_check_write, cred, file_cred, vp, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(71, vp);
 
        return error;
 }
@@ -1913,7 +2111,9 @@ mac_vnode_check_uipc_bind(vfs_context_t ctx, struct vnode *dvp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(72, dvp);
        MAC_CHECK(vnode_check_uipc_bind, cred, dvp, dvp->v_label, cnp, vap);
+       VFS_KERNEL_DEBUG_END1(72, dvp);
        return error;
 }
 
@@ -1933,7 +2133,9 @@ mac_vnode_check_uipc_connect(vfs_context_t ctx, struct vnode *vp, struct socket
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(73, vp);
        MAC_CHECK(vnode_check_uipc_connect, cred, vp, vp->v_label, (socket_t) so);
+       VFS_KERNEL_DEBUG_END1(73, vp);
        return error;
 }
 
@@ -1955,7 +2157,9 @@ mac_vnode_label_update(vfs_context_t ctx, struct vnode *vp, struct label *newlab
                tmpl = NULL;
        }
 
+       VFS_KERNEL_DEBUG_START1(74, vp);
        MAC_PERFORM(vnode_label_update, cred, vp, vp->v_label, newlabel);
+       VFS_KERNEL_DEBUG_END1(74, vp);
        vnode_unlock(vp);
 
        if (tmpl != NULL) {
@@ -1975,7 +2179,9 @@ mac_vnode_find_sigs(struct proc *p, struct vnode *vp, off_t offset)
        }
 #endif
 
+       VFS_KERNEL_DEBUG_START1(75, vp);
        MAC_CHECK(vnode_find_sigs, p, vp, offset, vp->v_label);
+       VFS_KERNEL_DEBUG_END1(75, vp);
 
        return error;
 }
@@ -2026,7 +2232,9 @@ mac_mount_label_associate(vfs_context_t ctx, struct mount *mp)
                }
        }
 
+       VFS_KERNEL_DEBUG_START1(76, mp);
        MAC_PERFORM(mount_label_associate, cred, mp, mp->mnt_mntlabel);
+       VFS_KERNEL_DEBUG_END1(76, mp);
 #if DEBUG
        printf("MAC Framework enabling %s support: %s -> %s (%s)\n",
            mp->mnt_flag & MNT_MULTILABEL ? "multilabel" : "singlelabel",
@@ -2053,7 +2261,32 @@ mac_mount_check_mount(vfs_context_t ctx, struct vnode *vp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(77, vp);
        MAC_CHECK(mount_check_mount, cred, vp, vp->v_label, cnp, vfc_name);
+       VFS_KERNEL_DEBUG_END1(77, vp);
+
+       return error;
+}
+
+int
+mac_mount_check_mount_late(vfs_context_t ctx, struct mount *mp)
+{
+       kauth_cred_t cred;
+       int error;
+
+#if SECURITY_MAC_CHECK_ENFORCE
+       /* 21167099 - only check if we allow write */
+       if (!mac_vnode_enforce) {
+               return 0;
+       }
+#endif
+       cred = vfs_context_ucred(ctx);
+       if (!mac_cred_check_enforce(cred)) {
+               return 0;
+       }
+       VFS_KERNEL_DEBUG_START1(78, mp);
+       MAC_CHECK(mount_check_mount_late, cred, mp);
+       VFS_KERNEL_DEBUG_END1(78, mp);
 
        return error;
 }
@@ -2075,7 +2308,9 @@ mac_mount_check_snapshot_create(vfs_context_t ctx, struct mount *mp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(79, mp);
        MAC_CHECK(mount_check_snapshot_create, cred, mp, name);
+       VFS_KERNEL_DEBUG_END1(79, mp);
        return error;
 }
 
@@ -2096,7 +2331,9 @@ mac_mount_check_snapshot_delete(vfs_context_t ctx, struct mount *mp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(80, mp);
        MAC_CHECK(mount_check_snapshot_delete, cred, mp, name);
+       VFS_KERNEL_DEBUG_END1(80, mp);
        return error;
 }
 
@@ -2117,7 +2354,9 @@ mac_mount_check_snapshot_revert(vfs_context_t ctx, struct mount *mp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(81, mp);
        MAC_CHECK(mount_check_snapshot_revert, cred, mp, name);
+       VFS_KERNEL_DEBUG_END1(81, mp);
        return error;
 }
 
@@ -2137,7 +2376,9 @@ mac_mount_check_remount(vfs_context_t ctx, struct mount *mp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(82, mp);
        MAC_CHECK(mount_check_remount, cred, mp, mp->mnt_mntlabel);
+       VFS_KERNEL_DEBUG_END1(82, mp);
 
        return error;
 }
@@ -2158,7 +2399,9 @@ mac_mount_check_umount(vfs_context_t ctx, struct mount *mp)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(83, mp);
        MAC_CHECK(mount_check_umount, cred, mp, mp->mnt_mntlabel);
+       VFS_KERNEL_DEBUG_END1(83, mp);
 
        return error;
 }
@@ -2180,7 +2423,9 @@ mac_mount_check_getattr(vfs_context_t ctx, struct mount *mp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(84, mp);
        MAC_CHECK(mount_check_getattr, cred, mp, mp->mnt_mntlabel, vfa);
+       VFS_KERNEL_DEBUG_END1(84, mp);
        return error;
 }
 
@@ -2201,7 +2446,9 @@ mac_mount_check_setattr(vfs_context_t ctx, struct mount *mp,
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(85, mp);
        MAC_CHECK(mount_check_setattr, cred, mp, mp->mnt_mntlabel, vfa);
+       VFS_KERNEL_DEBUG_END1(85, mp);
        return error;
 }
 
@@ -2221,7 +2468,9 @@ mac_mount_check_stat(vfs_context_t ctx, struct mount *mount)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(86, mount);
        MAC_CHECK(mount_check_stat, cred, mount, mount->mnt_mntlabel);
+       VFS_KERNEL_DEBUG_END1(86, mount);
 
        return error;
 }
@@ -2242,7 +2491,9 @@ mac_mount_check_label_update(vfs_context_t ctx, struct mount *mount)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(87, mount);
        MAC_CHECK(mount_check_label_update, cred, mount, mount->mnt_mntlabel);
+       VFS_KERNEL_DEBUG_END1(87, mount);
 
        return error;
 }
@@ -2263,7 +2514,9 @@ mac_mount_check_fsctl(vfs_context_t ctx, struct mount *mp, u_int cmd)
        if (!mac_cred_check_enforce(cred)) {
                return 0;
        }
+       VFS_KERNEL_DEBUG_START1(88, mp);
        MAC_CHECK(mount_check_fsctl, cred, mp, mp->mnt_mntlabel, cmd);
+       VFS_KERNEL_DEBUG_END1(88, mp);
 
        return error;
 }
@@ -2279,8 +2532,10 @@ mac_devfs_label_associate_device(dev_t dev, struct devnode *de,
        }
 #endif
 
+       VFS_KERNEL_DEBUG_START1(89, de);
        MAC_PERFORM(devfs_label_associate_device, dev, de, de->dn_label,
            fullpath);
+       VFS_KERNEL_DEBUG_END1(89, de);
 }
 
 void
@@ -2294,8 +2549,10 @@ mac_devfs_label_associate_directory(const char *dirname, int dirnamelen,
        }
 #endif
 
+       VFS_KERNEL_DEBUG_START1(90, de);
        MAC_PERFORM(devfs_label_associate_directory, dirname, dirnamelen, de,
            de->dn_label, fullpath);
+       VFS_KERNEL_DEBUG_END1(90, de);
 }
 
 int
@@ -2369,18 +2626,21 @@ mac_vnode_label_associate_fdesc(struct mount *mp, struct fdescnode *fnp,
 
        error = 0;
 
+       VFS_KERNEL_DEBUG_START1(91, vp);
        /*
         * If no backing file, let the policy choose which label to use.
         */
        if (fnp->fd_fd == -1) {
                MAC_PERFORM(vnode_label_associate_file, vfs_context_ucred(ctx),
                    mp, mp->mnt_mntlabel, NULL, NULL, vp, vp->v_label);
+               VFS_KERNEL_DEBUG_END1(91, vp);
                return 0;
        }
 
        p = vfs_context_proc(ctx);
        error = fp_lookup(p, fnp->fd_fd, &fp, 0);
        if (error) {
+               VFS_KERNEL_DEBUG_END1(91, vp);
                return error;
        }
 
@@ -2395,7 +2655,12 @@ mac_vnode_label_associate_fdesc(struct mount *mp, struct fdescnode *fnp,
                if ((error = vnode_getwithref(fvp))) {
                        goto out;
                }
-               MAC_PERFORM(vnode_label_copy, fvp->v_label, vp->v_label);
+               if (fvp->v_label != NULL) {
+                       if (mac_label_vnodes != 0 && vp->v_label == NULL) {
+                               mac_vnode_label_init(vp); /* init dst label */
+                       }
+                       MAC_PERFORM(vnode_label_copy, fvp->v_label, vp->v_label);
+               }
                (void)vnode_put(fvp);
                break;
 #if CONFIG_MACF_SOCKET_SUBSET
@@ -2437,6 +2702,34 @@ mac_vnode_label_associate_fdesc(struct mount *mp, struct fdescnode *fnp,
                break;
        }
 out:
+       VFS_KERNEL_DEBUG_END1(91, vp);
        fp_drop(p, fnp->fd_fd, fp, 0);
        return error;
 }
+
+intptr_t
+mac_vnode_label_get(struct vnode *vp, int slot, intptr_t sentinel)
+{
+       struct label *l;
+
+       KASSERT(vp != NULL, ("mac_vnode_label_get: NULL vnode"));
+       l = vp->v_label;
+       if (l != NULL) {
+               return mac_label_get(l, slot);
+       } else {
+               return sentinel;
+       }
+}
+
+void
+mac_vnode_label_set(struct vnode *vp, int slot, intptr_t v)
+{
+       struct label *l;
+       KASSERT(vp != NULL, ("mac_vnode_label_set: NULL vnode"));
+       l = vp->v_label;
+       if (l == NULL) {
+               mac_vnode_label_init(vp);
+               l = vp->v_label;
+       }
+       mac_label_set(l, slot, v);
+}