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

*** 417,428 **** * 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. */ ! static const int ZONE_SYSCALL_API_VERSION = 6; /* * 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 --- 417,429 ---- * 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 = 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,3027 **** --- 3019,3034 ---- 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,4410 **** 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) { struct zsched_arg zarg; nvlist_t *rctls = NULL; proc_t *pp = curproc; zone_t *zone, *ztmp; --- 4407,4417 ---- 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, zoneid_t zone_did) { struct zsched_arg zarg; nvlist_t *rctls = NULL; proc_t *pp = curproc; zone_t *zone, *ztmp;
*** 4420,4429 **** --- 4427,4437 ---- /* 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,4481 **** --- 4479,4491 ---- 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,5684 **** --- 5685,5702 ---- 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,6488 **** --- 6497,6507 ---- (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,6499 **** 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)); 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: --- 6508,6518 ---- 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.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: