Print this page
usr/src/cmd/dlmgmtd/dlmgmt_door.c
        
*** 19,28 ****
--- 19,29 ----
   * 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,130 ****
--- 122,143 ----
              !(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,591 ****
          }
  
          if (linkidp != NULL)
                  *linkidp = linkid;
          if (flagp != NULL) {
!                 *flagp = retval.lr_flags & DLMGMT_ACTIVE ? DLADM_OPT_ACTIVE : 0;
                  *flagp |= (retval.lr_flags & DLMGMT_PERSIST) ?
                      DLADM_OPT_PERSIST : 0;
          }
          if (classp != NULL)
                  *classp = retval.lr_class;
          if (mediap != NULL)
                  *mediap = retval.lr_media;
--- 592,607 ----
          }
  
          if (linkidp != NULL)
                  *linkidp = linkid;
          if (flagp != NULL) {
!                 *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;