Print this page
usr/src/cmd/dlmgmtd/dlmgmt_door.c

@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2016 Joyent, Inc.
+ * Copyright 2023 Oxide Computer Company
  */
 
 #include <door.h>
 #include <errno.h>
 #include <assert.h>

@@ -121,10 +122,22 @@
             !(flags & (DLADM_OPT_ACTIVE | DLADM_OPT_PERSIST)) ||
             linkidp == NULL) {
                 return (DLADM_STATUS_BADARG);
         }
 
+        if (getzoneid() != GLOBAL_ZONEID) {
+                /*
+                 * If we're creating this link in a non-global zone, then do
+                 * not allow it to be persistent, and flag it as transient so
+                 * that it will be automatically cleaned up on zone shutdown,
+                 * rather than being moved to the GZ.
+                 */
+                if (flags & DLADM_OPT_PERSIST)
+                        return (DLADM_STATUS_TEMPONLY);
+                flags |= DLADM_OPT_TRANSIENT;
+        }
+
         dlmgmt_flags = (flags & DLADM_OPT_ACTIVE) ? DLMGMT_ACTIVE : 0;
         dlmgmt_flags |= (flags & DLADM_OPT_PERSIST) ? DLMGMT_PERSIST : 0;
         dlmgmt_flags |= (flags & DLADM_OPT_TRANSIENT) ? DLMGMT_TRANSIENT : 0;
 
         (void) strlcpy(createid.ld_link, link, MAXLINKNAMELEN);

@@ -579,13 +592,16 @@
         }
 
         if (linkidp != NULL)
                 *linkidp = linkid;
         if (flagp != NULL) {
-                *flagp = retval.lr_flags & DLMGMT_ACTIVE ? DLADM_OPT_ACTIVE : 0;
+                *flagp = (retval.lr_flags & DLMGMT_ACTIVE) ?
+                    DLADM_OPT_ACTIVE : 0;
                 *flagp |= (retval.lr_flags & DLMGMT_PERSIST) ?
                     DLADM_OPT_PERSIST : 0;
+                *flagp |= (retval.lr_flags & DLMGMT_TRANSIENT) ?
+                    DLADM_OPT_TRANSIENT : 0;
         }
         if (classp != NULL)
                 *classp = retval.lr_class;
         if (mediap != NULL)
                 *mediap = retval.lr_media;