Print this page
OS-208 DTrace needs to use zone_did to match zone-limited enablings
OS-192 zone_create() warning on headnode

@@ -417,12 +417,13 @@
  * Version 4 alters the zone_create system call in order to support
  *     Trusted Extensions.
  * Version 5 alters the zone_boot system call, and converts its old
  *     bootargs parameter to be set by the zone_setattr API instead.
  * Version 6 adds the flag argument to zone_create.
+ * Version 7 adds the requested zone_did to zone_create.
  */
-static const int ZONE_SYSCALL_API_VERSION = 6;
+static const int ZONE_SYSCALL_API_VERSION = 7;
 
 /*
  * Certain filesystems (such as NFS and autofs) need to know which zone
  * the mount is being placed in.  Because of this, we need to be able to
  * ensure that a zone isn't in the process of being created/destroyed such

@@ -3018,10 +3019,16 @@
 getzoneid(void)
 {
         return (curproc->p_zone->zone_id);
 }
 
+zoneid_t
+getzonedid(void)
+{
+        return (curproc->p_zone->zone_did);
+}
+
 /*
  * Internal versions of zone_find_by_*().  These don't zone_hold() or
  * check the validity of a zone's state.
  */
 static zone_t *

@@ -4400,11 +4407,11 @@
 zone_create(const char *zone_name, const char *zone_root,
     const priv_set_t *zone_privs, size_t zone_privssz,
     caddr_t rctlbuf, size_t rctlbufsz,
     caddr_t zfsbuf, size_t zfsbufsz, int *extended_error,
     int match, uint32_t doi, const bslabel_t *label,
-    int flags)
+    int flags, zoneid_t zone_did)
 {
         struct zsched_arg zarg;
         nvlist_t *rctls = NULL;
         proc_t *pp = curproc;
         zone_t *zone, *ztmp;

@@ -4420,10 +4427,11 @@
 
         /* can't boot zone from within chroot environment */
         if (PTOU(pp)->u_rdir != NULL && PTOU(pp)->u_rdir != rootdir)
                 return (zone_create_error(ENOTSUP, ZE_CHROOTED,
                     extended_error));
+
         /*
          * As the first step of zone creation, we want to allocate a zoneid.
          * This allocation is complicated by the fact that netstacks use the
          * zoneid to determine their stackid, but netstacks themselves are
          * freed asynchronously with respect to zone destruction.  This means

@@ -4471,11 +4479,13 @@
                 cmn_err(CE_WARN, "unable to reuse zone ID %d; "
                     "netstack still in use", zoneid);
         }
 
         zone = kmem_zalloc(sizeof (zone_t), KM_SLEEP);
+
         zone->zone_id = zoneid;
+        zone->zone_did = zone_did;
         zone->zone_status = ZONE_IS_UNINITIALIZED;
         zone->zone_pool = pool_default;
         zone->zone_pool_mod = gethrtime();
         zone->zone_psetid = ZONE_PS_INVAL;
         zone->zone_ncpus = 0;

@@ -5675,10 +5685,18 @@
                         if (error == 0 && copyout(zbuf, buf, bufsize) != 0)
                                 error = EFAULT;
                 }
                 kmem_free(zbuf, bufsize);
                 break;
+        case ZONE_ATTR_DID:
+                size = sizeof (zoneid_t);
+                if (bufsize > size)
+                        bufsize = size;
+
+                if (buf != NULL && copyout(&zone->zone_did, buf, bufsize) != 0)
+                        error = EFAULT;
+                break;
         default:
                 if ((attr >= ZONE_ATTR_BRAND_ATTRS) && ZONE_IS_BRANDED(zone)) {
                         size = bufsize;
                         error = ZBROP(zone)->b_getattr(zone, attr, buf, &size);
                 } else {

@@ -6479,10 +6497,11 @@
                             (int *)(unsigned long)zs32.extended_error;
                         zs.match = zs32.match;
                         zs.doi = zs32.doi;
                         zs.label = (const bslabel_t *)(uintptr_t)zs32.label;
                         zs.flags = zs32.flags;
+                        zs.zone_did = zs32.zone_did;
 #else
                         panic("get_udatamodel() returned bogus result\n");
 #endif
                 }
 

@@ -6489,11 +6508,11 @@
                 return (zone_create(zs.zone_name, zs.zone_root,
                     zs.zone_privs, zs.zone_privssz,
                     (caddr_t)zs.rctlbuf, zs.rctlbufsz,
                     (caddr_t)zs.zfsbuf, zs.zfsbufsz,
                     zs.extended_error, zs.match, zs.doi,
-                    zs.label, zs.flags));
+                    zs.label, zs.flags, zs.zone_did));
         case ZONE_BOOT:
                 return (zone_boot((zoneid_t)(uintptr_t)arg1));
         case ZONE_DESTROY:
                 return (zone_destroy((zoneid_t)(uintptr_t)arg1));
         case ZONE_GETATTR: