1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright 2015, Joyent Inc. All rights reserved.
  25  */
  26 
  27 /*
  28  * Zones
  29  *
  30  *   A zone is a named collection of processes, namespace constraints,
  31  *   and other system resources which comprise a secure and manageable
  32  *   application containment facility.
  33  *
  34  *   Zones (represented by the reference counted zone_t) are tracked in
  35  *   the kernel in the zonehash.  Elsewhere in the kernel, Zone IDs
  36  *   (zoneid_t) are used to track zone association.  Zone IDs are
  37  *   dynamically generated when the zone is created; if a persistent
  38  *   identifier is needed (core files, accounting logs, audit trail,
  39  *   etc.), the zone name should be used.
  40  *
  41  *
  42  *   Global Zone:
  43  *
  44  *   The global zone (zoneid 0) is automatically associated with all
  45  *   system resources that have not been bound to a user-created zone.
  46  *   This means that even systems where zones are not in active use
  47  *   have a global zone, and all processes, mounts, etc. are
  48  *   associated with that zone.  The global zone is generally
  49  *   unconstrained in terms of privileges and access, though the usual
  50  *   credential and privilege based restrictions apply.
  51  *
  52  *
  53  *   Zone States:
  54  *
  55  *   The states in which a zone may be in and the transitions are as
  56  *   follows:
  57  *
  58  *   ZONE_IS_UNINITIALIZED: primordial state for a zone. The partially
  59  *   initialized zone is added to the list of active zones on the system but
  60  *   isn't accessible.
  61  *
  62  *   ZONE_IS_INITIALIZED: Initialization complete except the ZSD callbacks are
  63  *   not yet completed. Not possible to enter the zone, but attributes can
  64  *   be retrieved.
  65  *
  66  *   ZONE_IS_READY: zsched (the kernel dummy process for a zone) is
  67  *   ready.  The zone is made visible after the ZSD constructor callbacks are
  68  *   executed.  A zone remains in this state until it transitions into
  69  *   the ZONE_IS_BOOTING state as a result of a call to zone_boot().
  70  *
  71  *   ZONE_IS_BOOTING: in this shortlived-state, zsched attempts to start
  72  *   init.  Should that fail, the zone proceeds to the ZONE_IS_SHUTTING_DOWN
  73  *   state.
  74  *
  75  *   ZONE_IS_RUNNING: The zone is open for business: zsched has
  76  *   successfully started init.   A zone remains in this state until
  77  *   zone_shutdown() is called.
  78  *
  79  *   ZONE_IS_SHUTTING_DOWN: zone_shutdown() has been called, the system is
  80  *   killing all processes running in the zone. The zone remains
  81  *   in this state until there are no more user processes running in the zone.
  82  *   zone_create(), zone_enter(), and zone_destroy() on this zone will fail.
  83  *   Since zone_shutdown() is restartable, it may be called successfully
  84  *   multiple times for the same zone_t.  Setting of the zone's state to
  85  *   ZONE_IS_SHUTTING_DOWN is synchronized with mounts, so VOP_MOUNT() may check
  86  *   the zone's status without worrying about it being a moving target.
  87  *
  88  *   ZONE_IS_EMPTY: zone_shutdown() has been called, and there
  89  *   are no more user processes in the zone.  The zone remains in this
  90  *   state until there are no more kernel threads associated with the
  91  *   zone.  zone_create(), zone_enter(), and zone_destroy() on this zone will
  92  *   fail.
  93  *
  94  *   ZONE_IS_DOWN: All kernel threads doing work on behalf of the zone
  95  *   have exited.  zone_shutdown() returns.  Henceforth it is not possible to
  96  *   join the zone or create kernel threads therein.
  97  *
  98  *   ZONE_IS_DYING: zone_destroy() has been called on the zone; zone
  99  *   remains in this state until zsched exits.  Calls to zone_find_by_*()
 100  *   return NULL from now on.
 101  *
 102  *   ZONE_IS_DEAD: zsched has exited (zone_ntasks == 0).  There are no
 103  *   processes or threads doing work on behalf of the zone.  The zone is
 104  *   removed from the list of active zones.  zone_destroy() returns, and
 105  *   the zone can be recreated.
 106  *
 107  *   ZONE_IS_FREE (internal state): zone_ref goes to 0, ZSD destructor
 108  *   callbacks are executed, and all memory associated with the zone is
 109  *   freed.
 110  *
 111  *   Threads can wait for the zone to enter a requested state by using
 112  *   zone_status_wait() or zone_status_timedwait() with the desired
 113  *   state passed in as an argument.  Zone state transitions are
 114  *   uni-directional; it is not possible to move back to an earlier state.
 115  *
 116  *
 117  *   Zone-Specific Data:
 118  *
 119  *   Subsystems needing to maintain zone-specific data can store that
 120  *   data using the ZSD mechanism.  This provides a zone-specific data
 121  *   store, similar to thread-specific data (see pthread_getspecific(3C)
 122  *   or the TSD code in uts/common/disp/thread.c.  Also, ZSD can be used
 123  *   to register callbacks to be invoked when a zone is created, shut
 124  *   down, or destroyed.  This can be used to initialize zone-specific
 125  *   data for new zones and to clean up when zones go away.
 126  *
 127  *
 128  *   Data Structures:
 129  *
 130  *   The per-zone structure (zone_t) is reference counted, and freed
 131  *   when all references are released.  zone_hold and zone_rele can be
 132  *   used to adjust the reference count.  In addition, reference counts
 133  *   associated with the cred_t structure are tracked separately using
 134  *   zone_cred_hold and zone_cred_rele.
 135  *
 136  *   Pointers to active zone_t's are stored in two hash tables; one
 137  *   for searching by id, the other for searching by name.  Lookups
 138  *   can be performed on either basis, using zone_find_by_id and
 139  *   zone_find_by_name.  Both return zone_t pointers with the zone
 140  *   held, so zone_rele should be called when the pointer is no longer
 141  *   needed.  Zones can also be searched by path; zone_find_by_path
 142  *   returns the zone with which a path name is associated (global
 143  *   zone if the path is not within some other zone's file system
 144  *   hierarchy).  This currently requires iterating through each zone,
 145  *   so it is slower than an id or name search via a hash table.
 146  *
 147  *
 148  *   Locking:
 149  *
 150  *   zonehash_lock: This is a top-level global lock used to protect the
 151  *       zone hash tables and lists.  Zones cannot be created or destroyed
 152  *       while this lock is held.
 153  *   zone_status_lock: This is a global lock protecting zone state.
 154  *       Zones cannot change state while this lock is held.  It also
 155  *       protects the list of kernel threads associated with a zone.
 156  *   zone_lock: This is a per-zone lock used to protect several fields of
 157  *       the zone_t (see <sys/zone.h> for details).  In addition, holding
 158  *       this lock means that the zone cannot go away.
 159  *   zone_nlwps_lock: This is a per-zone lock used to protect the fields
 160  *       related to the zone.max-lwps rctl.
 161  *   zone_mem_lock: This is a per-zone lock used to protect the fields
 162  *       related to the zone.max-locked-memory and zone.max-swap rctls.
 163  *   zone_rctl_lock: This is a per-zone lock used to protect other rctls,
 164  *       currently just max_lofi
 165  *   zsd_key_lock: This is a global lock protecting the key state for ZSD.
 166  *   zone_deathrow_lock: This is a global lock protecting the "deathrow"
 167  *       list (a list of zones in the ZONE_IS_DEAD state).
 168  *
 169  *   Ordering requirements:
 170  *       pool_lock --> cpu_lock --> zonehash_lock --> zone_status_lock -->
 171  *              zone_lock --> zsd_key_lock --> pidlock --> p_lock
 172  *
 173  *   When taking zone_mem_lock or zone_nlwps_lock, the lock ordering is:
 174  *      zonehash_lock --> a_lock --> pidlock --> p_lock --> zone_mem_lock
 175  *      zonehash_lock --> a_lock --> pidlock --> p_lock --> zone_nlwps_lock
 176  *
 177  *   Blocking memory allocations are permitted while holding any of the
 178  *   zone locks.
 179  *
 180  *
 181  *   System Call Interface:
 182  *
 183  *   The zone subsystem can be managed and queried from user level with
 184  *   the following system calls (all subcodes of the primary "zone"
 185  *   system call):
 186  *   - zone_create: creates a zone with selected attributes (name,
 187  *     root path, privileges, resource controls, ZFS datasets)
 188  *   - zone_enter: allows the current process to enter a zone
 189  *   - zone_getattr: reports attributes of a zone
 190  *   - zone_setattr: set attributes of a zone
 191  *   - zone_boot: set 'init' running for the zone
 192  *   - zone_list: lists all zones active in the system
 193  *   - zone_lookup: looks up zone id based on name
 194  *   - zone_shutdown: initiates shutdown process (see states above)
 195  *   - zone_destroy: completes shutdown process (see states above)
 196  *
 197  */
 198 
 199 #include <sys/priv_impl.h>
 200 #include <sys/cred.h>
 201 #include <c2/audit.h>
 202 #include <sys/debug.h>
 203 #include <sys/file.h>
 204 #include <sys/kmem.h>
 205 #include <sys/kstat.h>
 206 #include <sys/mutex.h>
 207 #include <sys/note.h>
 208 #include <sys/pathname.h>
 209 #include <sys/proc.h>
 210 #include <sys/project.h>
 211 #include <sys/sysevent.h>
 212 #include <sys/task.h>
 213 #include <sys/systm.h>
 214 #include <sys/types.h>
 215 #include <sys/utsname.h>
 216 #include <sys/vnode.h>
 217 #include <sys/vfs.h>
 218 #include <sys/systeminfo.h>
 219 #include <sys/policy.h>
 220 #include <sys/cred_impl.h>
 221 #include <sys/contract_impl.h>
 222 #include <sys/contract/process_impl.h>
 223 #include <sys/class.h>
 224 #include <sys/pool.h>
 225 #include <sys/pool_pset.h>
 226 #include <sys/pset.h>
 227 #include <sys/strlog.h>
 228 #include <sys/sysmacros.h>
 229 #include <sys/callb.h>
 230 #include <sys/vmparam.h>
 231 #include <sys/corectl.h>
 232 #include <sys/ipc_impl.h>
 233 #include <sys/klpd.h>
 234 
 235 #include <sys/door.h>
 236 #include <sys/cpuvar.h>
 237 #include <sys/sdt.h>
 238 
 239 #include <sys/uadmin.h>
 240 #include <sys/session.h>
 241 #include <sys/cmn_err.h>
 242 #include <sys/modhash.h>
 243 #include <sys/sunddi.h>
 244 #include <sys/nvpair.h>
 245 #include <sys/rctl.h>
 246 #include <sys/fss.h>
 247 #include <sys/brand.h>
 248 #include <sys/zone.h>
 249 #include <net/if.h>
 250 #include <sys/cpucaps.h>
 251 #include <vm/seg.h>
 252 #include <sys/mac.h>
 253 
 254 /*
 255  * This constant specifies the number of seconds that threads waiting for
 256  * subsystems to release a zone's general-purpose references will wait before
 257  * they log the zone's reference counts.  The constant's value shouldn't
 258  * be so small that reference counts are unnecessarily reported for zones
 259  * whose references are slowly released.  On the other hand, it shouldn't be so
 260  * large that users reboot their systems out of frustration over hung zones
 261  * before the system logs the zones' reference counts.
 262  */
 263 #define ZONE_DESTROY_TIMEOUT_SECS       60
 264 
 265 /* List of data link IDs which are accessible from the zone */
 266 typedef struct zone_dl {
 267         datalink_id_t   zdl_id;
 268         nvlist_t        *zdl_net;
 269         list_node_t     zdl_linkage;
 270 } zone_dl_t;
 271 
 272 /*
 273  * cv used to signal that all references to the zone have been released.  This
 274  * needs to be global since there may be multiple waiters, and the first to
 275  * wake up will free the zone_t, hence we cannot use zone->zone_cv.
 276  */
 277 static kcondvar_t zone_destroy_cv;
 278 /*
 279  * Lock used to serialize access to zone_cv.  This could have been per-zone,
 280  * but then we'd need another lock for zone_destroy_cv, and why bother?
 281  */
 282 static kmutex_t zone_status_lock;
 283 
 284 /*
 285  * ZSD-related global variables.
 286  */
 287 static kmutex_t zsd_key_lock;   /* protects the following two */
 288 /*
 289  * The next caller of zone_key_create() will be assigned a key of ++zsd_keyval.
 290  */
 291 static zone_key_t zsd_keyval = 0;
 292 /*
 293  * Global list of registered keys.  We use this when a new zone is created.
 294  */
 295 static list_t zsd_registered_keys;
 296 
 297 int zone_hash_size = 256;
 298 static mod_hash_t *zonehashbyname, *zonehashbyid, *zonehashbylabel;
 299 static kmutex_t zonehash_lock;
 300 static uint_t zonecount;
 301 static id_space_t *zoneid_space;
 302 
 303 /*
 304  * The global zone (aka zone0) is the all-seeing, all-knowing zone in which the
 305  * kernel proper runs, and which manages all other zones.
 306  *
 307  * Although not declared as static, the variable "zone0" should not be used
 308  * except for by code that needs to reference the global zone early on in boot,
 309  * before it is fully initialized.  All other consumers should use
 310  * 'global_zone'.
 311  */
 312 zone_t zone0;
 313 zone_t *global_zone = NULL;     /* Set when the global zone is initialized */
 314 
 315 /*
 316  * List of active zones, protected by zonehash_lock.
 317  */
 318 static list_t zone_active;
 319 
 320 /*
 321  * List of destroyed zones that still have outstanding cred references.
 322  * Used for debugging.  Uses a separate lock to avoid lock ordering
 323  * problems in zone_free.
 324  */
 325 static list_t zone_deathrow;
 326 static kmutex_t zone_deathrow_lock;
 327 
 328 /* number of zones is limited by virtual interface limit in IP */
 329 uint_t maxzones = 8192;
 330 
 331 /* Event channel to sent zone state change notifications */
 332 evchan_t *zone_event_chan;
 333 
 334 /*
 335  * This table holds the mapping from kernel zone states to
 336  * states visible in the state notification API.
 337  * The idea is that we only expose "obvious" states and
 338  * do not expose states which are just implementation details.
 339  */
 340 const char  *zone_status_table[] = {
 341         ZONE_EVENT_UNINITIALIZED,       /* uninitialized */
 342         ZONE_EVENT_INITIALIZED,         /* initialized */
 343         ZONE_EVENT_READY,               /* ready */
 344         ZONE_EVENT_READY,               /* booting */
 345         ZONE_EVENT_RUNNING,             /* running */
 346         ZONE_EVENT_SHUTTING_DOWN,       /* shutting_down */
 347         ZONE_EVENT_SHUTTING_DOWN,       /* empty */
 348         ZONE_EVENT_SHUTTING_DOWN,       /* down */
 349         ZONE_EVENT_SHUTTING_DOWN,       /* dying */
 350         ZONE_EVENT_UNINITIALIZED,       /* dead */
 351 };
 352 
 353 /*
 354  * This array contains the names of the subsystems listed in zone_ref_subsys_t
 355  * (see sys/zone.h).
 356  */
 357 static char *zone_ref_subsys_names[] = {
 358         "NFS",          /* ZONE_REF_NFS */
 359         "NFSv4",        /* ZONE_REF_NFSV4 */
 360         "SMBFS",        /* ZONE_REF_SMBFS */
 361         "MNTFS",        /* ZONE_REF_MNTFS */
 362         "LOFI",         /* ZONE_REF_LOFI */
 363         "VFS",          /* ZONE_REF_VFS */
 364         "IPC"           /* ZONE_REF_IPC */
 365 };
 366 
 367 /*
 368  * This isn't static so lint doesn't complain.
 369  */
 370 rctl_hndl_t rc_zone_cpu_shares;
 371 rctl_hndl_t rc_zone_locked_mem;
 372 rctl_hndl_t rc_zone_max_swap;
 373 rctl_hndl_t rc_zone_max_lofi;
 374 rctl_hndl_t rc_zone_cpu_cap;
 375 rctl_hndl_t rc_zone_nlwps;
 376 rctl_hndl_t rc_zone_nprocs;
 377 rctl_hndl_t rc_zone_shmmax;
 378 rctl_hndl_t rc_zone_shmmni;
 379 rctl_hndl_t rc_zone_semmni;
 380 rctl_hndl_t rc_zone_msgmni;
 381 
 382 const char * const zone_default_initname = "/sbin/init";
 383 static char * const zone_prefix = "/zone/";
 384 static int zone_shutdown(zoneid_t zoneid);
 385 static int zone_add_datalink(zoneid_t, datalink_id_t);
 386 static int zone_remove_datalink(zoneid_t, datalink_id_t);
 387 static int zone_list_datalink(zoneid_t, int *, datalink_id_t *);
 388 static int zone_set_network(zoneid_t, zone_net_data_t *);
 389 static int zone_get_network(zoneid_t, zone_net_data_t *);
 390 
 391 typedef boolean_t zsd_applyfn_t(kmutex_t *, boolean_t, zone_t *, zone_key_t);
 392 
 393 static void zsd_apply_all_zones(zsd_applyfn_t *, zone_key_t);
 394 static void zsd_apply_all_keys(zsd_applyfn_t *, zone_t *);
 395 static boolean_t zsd_apply_create(kmutex_t *, boolean_t, zone_t *, zone_key_t);
 396 static boolean_t zsd_apply_shutdown(kmutex_t *, boolean_t, zone_t *,
 397     zone_key_t);
 398 static boolean_t zsd_apply_destroy(kmutex_t *, boolean_t, zone_t *, zone_key_t);
 399 static boolean_t zsd_wait_for_creator(zone_t *, struct zsd_entry *,
 400     kmutex_t *);
 401 static boolean_t zsd_wait_for_inprogress(zone_t *, struct zsd_entry *,
 402     kmutex_t *);
 403 
 404 /*
 405  * Bump this number when you alter the zone syscall interfaces; this is
 406  * because we need to have support for previous API versions in libc
 407  * to support patching; libc calls into the kernel to determine this number.
 408  *
 409  * Version 1 of the API is the version originally shipped with Solaris 10
 410  * Version 2 alters the zone_create system call in order to support more
 411  *     arguments by moving the args into a structure; and to do better
 412  *     error reporting when zone_create() fails.
 413  * Version 3 alters the zone_create system call in order to support the
 414  *     import of ZFS datasets to zones.
 415  * Version 4 alters the zone_create system call in order to support
 416  *     Trusted Extensions.
 417  * Version 5 alters the zone_boot system call, and converts its old
 418  *     bootargs parameter to be set by the zone_setattr API instead.
 419  * Version 6 adds the flag argument to zone_create.
 420  */
 421 static const int ZONE_SYSCALL_API_VERSION = 6;
 422 
 423 /*
 424  * Certain filesystems (such as NFS and autofs) need to know which zone
 425  * the mount is being placed in.  Because of this, we need to be able to
 426  * ensure that a zone isn't in the process of being created/destroyed such
 427  * that nfs_mount() thinks it is in the global/NGZ zone, while by the time
 428  * it gets added the list of mounted zones, it ends up on the wrong zone's
 429  * mount list. Since a zone can't reside on an NFS file system, we don't
 430  * have to worry about the zonepath itself.
 431  *
 432  * The following functions: block_mounts()/resume_mounts() and
 433  * mount_in_progress()/mount_completed() are used by zones and the VFS
 434  * layer (respectively) to synchronize zone state transitions and new
 435  * mounts within a zone. This syncronization is on a per-zone basis, so
 436  * activity for one zone will not interfere with activity for another zone.
 437  *
 438  * The semantics are like a reader-reader lock such that there may
 439  * either be multiple mounts (or zone state transitions, if that weren't
 440  * serialized by zonehash_lock) in progress at the same time, but not
 441  * both.
 442  *
 443  * We use cv's so the user can ctrl-C out of the operation if it's
 444  * taking too long.
 445  *
 446  * The semantics are such that there is unfair bias towards the
 447  * "current" operation.  This means that zone halt may starve if
 448  * there is a rapid succession of new mounts coming in to the zone.
 449  */
 450 /*
 451  * Prevent new mounts from progressing to the point of calling
 452  * VFS_MOUNT().  If there are already mounts in this "region", wait for
 453  * them to complete.
 454  */
 455 static int
 456 block_mounts(zone_t *zp)
 457 {
 458         int retval = 0;
 459 
 460         /*
 461          * Since it may block for a long time, block_mounts() shouldn't be
 462          * called with zonehash_lock held.
 463          */
 464         ASSERT(MUTEX_NOT_HELD(&zonehash_lock));
 465         mutex_enter(&zp->zone_mount_lock);
 466         while (zp->zone_mounts_in_progress > 0) {
 467                 if (cv_wait_sig(&zp->zone_mount_cv, &zp->zone_mount_lock) == 0)
 468                         goto signaled;
 469         }
 470         /*
 471          * A negative value of mounts_in_progress indicates that mounts
 472          * have been blocked by (-mounts_in_progress) different callers
 473          * (remotely possible if two threads enter zone_shutdown at the same
 474          * time).
 475          */
 476         zp->zone_mounts_in_progress--;
 477         retval = 1;
 478 signaled:
 479         mutex_exit(&zp->zone_mount_lock);
 480         return (retval);
 481 }
 482 
 483 /*
 484  * The VFS layer may progress with new mounts as far as we're concerned.
 485  * Allow them to progress if we were the last obstacle.
 486  */
 487 static void
 488 resume_mounts(zone_t *zp)
 489 {
 490         mutex_enter(&zp->zone_mount_lock);
 491         if (++zp->zone_mounts_in_progress == 0)
 492                 cv_broadcast(&zp->zone_mount_cv);
 493         mutex_exit(&zp->zone_mount_lock);
 494 }
 495 
 496 /*
 497  * The VFS layer is busy with a mount; this zone should wait until all
 498  * of its mounts are completed to progress.
 499  */
 500 void
 501 mount_in_progress(zone_t *zp)
 502 {
 503         mutex_enter(&zp->zone_mount_lock);
 504         while (zp->zone_mounts_in_progress < 0)
 505                 cv_wait(&zp->zone_mount_cv, &zp->zone_mount_lock);
 506         zp->zone_mounts_in_progress++;
 507         mutex_exit(&zp->zone_mount_lock);
 508 }
 509 
 510 /*
 511  * VFS is done with one mount; wake up any waiting block_mounts()
 512  * callers if this is the last mount.
 513  */
 514 void
 515 mount_completed(zone_t *zp)
 516 {
 517         mutex_enter(&zp->zone_mount_lock);
 518         if (--zp->zone_mounts_in_progress == 0)
 519                 cv_broadcast(&zp->zone_mount_cv);
 520         mutex_exit(&zp->zone_mount_lock);
 521 }
 522 
 523 /*
 524  * ZSD routines.
 525  *
 526  * Zone Specific Data (ZSD) is modeled after Thread Specific Data as
 527  * defined by the pthread_key_create() and related interfaces.
 528  *
 529  * Kernel subsystems may register one or more data items and/or
 530  * callbacks to be executed when a zone is created, shutdown, or
 531  * destroyed.
 532  *
 533  * Unlike the thread counterpart, destructor callbacks will be executed
 534  * even if the data pointer is NULL and/or there are no constructor
 535  * callbacks, so it is the responsibility of such callbacks to check for
 536  * NULL data values if necessary.
 537  *
 538  * The locking strategy and overall picture is as follows:
 539  *
 540  * When someone calls zone_key_create(), a template ZSD entry is added to the
 541  * global list "zsd_registered_keys", protected by zsd_key_lock.  While
 542  * holding that lock all the existing zones are marked as
 543  * ZSD_CREATE_NEEDED and a copy of the ZSD entry added to the per-zone
 544  * zone_zsd list (protected by zone_lock). The global list is updated first
 545  * (under zone_key_lock) to make sure that newly created zones use the
 546  * most recent list of keys. Then under zonehash_lock we walk the zones
 547  * and mark them.  Similar locking is used in zone_key_delete().
 548  *
 549  * The actual create, shutdown, and destroy callbacks are done without
 550  * holding any lock. And zsd_flags are used to ensure that the operations
 551  * completed so that when zone_key_create (and zone_create) is done, as well as
 552  * zone_key_delete (and zone_destroy) is done, all the necessary callbacks
 553  * are completed.
 554  *
 555  * When new zones are created constructor callbacks for all registered ZSD
 556  * entries will be called. That also uses the above two phases of marking
 557  * what needs to be done, and then running the callbacks without holding
 558  * any locks.
 559  *
 560  * The framework does not provide any locking around zone_getspecific() and
 561  * zone_setspecific() apart from that needed for internal consistency, so
 562  * callers interested in atomic "test-and-set" semantics will need to provide
 563  * their own locking.
 564  */
 565 
 566 /*
 567  * Helper function to find the zsd_entry associated with the key in the
 568  * given list.
 569  */
 570 static struct zsd_entry *
 571 zsd_find(list_t *l, zone_key_t key)
 572 {
 573         struct zsd_entry *zsd;
 574 
 575         for (zsd = list_head(l); zsd != NULL; zsd = list_next(l, zsd)) {
 576                 if (zsd->zsd_key == key) {
 577                         return (zsd);
 578                 }
 579         }
 580         return (NULL);
 581 }
 582 
 583 /*
 584  * Helper function to find the zsd_entry associated with the key in the
 585  * given list. Move it to the front of the list.
 586  */
 587 static struct zsd_entry *
 588 zsd_find_mru(list_t *l, zone_key_t key)
 589 {
 590         struct zsd_entry *zsd;
 591 
 592         for (zsd = list_head(l); zsd != NULL; zsd = list_next(l, zsd)) {
 593                 if (zsd->zsd_key == key) {
 594                         /*
 595                          * Move to head of list to keep list in MRU order.
 596                          */
 597                         if (zsd != list_head(l)) {
 598                                 list_remove(l, zsd);
 599                                 list_insert_head(l, zsd);
 600                         }
 601                         return (zsd);
 602                 }
 603         }
 604         return (NULL);
 605 }
 606 
 607 void
 608 zone_key_create(zone_key_t *keyp, void *(*create)(zoneid_t),
 609     void (*shutdown)(zoneid_t, void *), void (*destroy)(zoneid_t, void *))
 610 {
 611         struct zsd_entry *zsdp;
 612         struct zsd_entry *t;
 613         struct zone *zone;
 614         zone_key_t  key;
 615 
 616         zsdp = kmem_zalloc(sizeof (*zsdp), KM_SLEEP);
 617         zsdp->zsd_data = NULL;
 618         zsdp->zsd_create = create;
 619         zsdp->zsd_shutdown = shutdown;
 620         zsdp->zsd_destroy = destroy;
 621 
 622         /*
 623          * Insert in global list of callbacks. Makes future zone creations
 624          * see it.
 625          */
 626         mutex_enter(&zsd_key_lock);
 627         key = zsdp->zsd_key = ++zsd_keyval;
 628         ASSERT(zsd_keyval != 0);
 629         list_insert_tail(&zsd_registered_keys, zsdp);
 630         mutex_exit(&zsd_key_lock);
 631 
 632         /*
 633          * Insert for all existing zones and mark them as needing
 634          * a create callback.
 635          */
 636         mutex_enter(&zonehash_lock);        /* stop the world */
 637         for (zone = list_head(&zone_active); zone != NULL;
 638             zone = list_next(&zone_active, zone)) {
 639                 zone_status_t status;
 640 
 641                 mutex_enter(&zone->zone_lock);
 642 
 643                 /* Skip zones that are on the way down or not yet up */
 644                 status = zone_status_get(zone);
 645                 if (status >= ZONE_IS_DOWN ||
 646                     status == ZONE_IS_UNINITIALIZED) {
 647                         mutex_exit(&zone->zone_lock);
 648                         continue;
 649                 }
 650 
 651                 t = zsd_find_mru(&zone->zone_zsd, key);
 652                 if (t != NULL) {
 653                         /*
 654                          * A zsd_configure already inserted it after
 655                          * we dropped zsd_key_lock above.
 656                          */
 657                         mutex_exit(&zone->zone_lock);
 658                         continue;
 659                 }
 660                 t = kmem_zalloc(sizeof (*t), KM_SLEEP);
 661                 t->zsd_key = key;
 662                 t->zsd_create = create;
 663                 t->zsd_shutdown = shutdown;
 664                 t->zsd_destroy = destroy;
 665                 if (create != NULL) {
 666                         t->zsd_flags = ZSD_CREATE_NEEDED;
 667                         DTRACE_PROBE2(zsd__create__needed,
 668                             zone_t *, zone, zone_key_t, key);
 669                 }
 670                 list_insert_tail(&zone->zone_zsd, t);
 671                 mutex_exit(&zone->zone_lock);
 672         }
 673         mutex_exit(&zonehash_lock);
 674 
 675         if (create != NULL) {
 676                 /* Now call the create callback for this key */
 677                 zsd_apply_all_zones(zsd_apply_create, key);
 678         }
 679         /*
 680          * It is safe for consumers to use the key now, make it
 681          * globally visible. Specifically zone_getspecific() will
 682          * always successfully return the zone specific data associated
 683          * with the key.
 684          */
 685         *keyp = key;
 686 
 687 }
 688 
 689 /*
 690  * Function called when a module is being unloaded, or otherwise wishes
 691  * to unregister its ZSD key and callbacks.
 692  *
 693  * Remove from the global list and determine the functions that need to
 694  * be called under a global lock. Then call the functions without
 695  * holding any locks. Finally free up the zone_zsd entries. (The apply
 696  * functions need to access the zone_zsd entries to find zsd_data etc.)
 697  */
 698 int
 699 zone_key_delete(zone_key_t key)
 700 {
 701         struct zsd_entry *zsdp = NULL;
 702         zone_t *zone;
 703 
 704         mutex_enter(&zsd_key_lock);
 705         zsdp = zsd_find_mru(&zsd_registered_keys, key);
 706         if (zsdp == NULL) {
 707                 mutex_exit(&zsd_key_lock);
 708                 return (-1);
 709         }
 710         list_remove(&zsd_registered_keys, zsdp);
 711         mutex_exit(&zsd_key_lock);
 712 
 713         mutex_enter(&zonehash_lock);
 714         for (zone = list_head(&zone_active); zone != NULL;
 715             zone = list_next(&zone_active, zone)) {
 716                 struct zsd_entry *del;
 717 
 718                 mutex_enter(&zone->zone_lock);
 719                 del = zsd_find_mru(&zone->zone_zsd, key);
 720                 if (del == NULL) {
 721                         /*
 722                          * Somebody else got here first e.g the zone going
 723                          * away.
 724                          */
 725                         mutex_exit(&zone->zone_lock);
 726                         continue;
 727                 }
 728                 ASSERT(del->zsd_shutdown == zsdp->zsd_shutdown);
 729                 ASSERT(del->zsd_destroy == zsdp->zsd_destroy);
 730                 if (del->zsd_shutdown != NULL &&
 731                     (del->zsd_flags & ZSD_SHUTDOWN_ALL) == 0) {
 732                         del->zsd_flags |= ZSD_SHUTDOWN_NEEDED;
 733                         DTRACE_PROBE2(zsd__shutdown__needed,
 734                             zone_t *, zone, zone_key_t, key);
 735                 }
 736                 if (del->zsd_destroy != NULL &&
 737                     (del->zsd_flags & ZSD_DESTROY_ALL) == 0) {
 738                         del->zsd_flags |= ZSD_DESTROY_NEEDED;
 739                         DTRACE_PROBE2(zsd__destroy__needed,
 740                             zone_t *, zone, zone_key_t, key);
 741                 }
 742                 mutex_exit(&zone->zone_lock);
 743         }
 744         mutex_exit(&zonehash_lock);
 745         kmem_free(zsdp, sizeof (*zsdp));
 746 
 747         /* Now call the shutdown and destroy callback for this key */
 748         zsd_apply_all_zones(zsd_apply_shutdown, key);
 749         zsd_apply_all_zones(zsd_apply_destroy, key);
 750 
 751         /* Now we can free up the zsdp structures in each zone */
 752         mutex_enter(&zonehash_lock);
 753         for (zone = list_head(&zone_active); zone != NULL;
 754             zone = list_next(&zone_active, zone)) {
 755                 struct zsd_entry *del;
 756 
 757                 mutex_enter(&zone->zone_lock);
 758                 del = zsd_find(&zone->zone_zsd, key);
 759                 if (del != NULL) {
 760                         list_remove(&zone->zone_zsd, del);
 761                         ASSERT(!(del->zsd_flags & ZSD_ALL_INPROGRESS));
 762                         kmem_free(del, sizeof (*del));
 763                 }
 764                 mutex_exit(&zone->zone_lock);
 765         }
 766         mutex_exit(&zonehash_lock);
 767 
 768         return (0);
 769 }
 770 
 771 /*
 772  * ZSD counterpart of pthread_setspecific().
 773  *
 774  * Since all zsd callbacks, including those with no create function,
 775  * have an entry in zone_zsd, if the key is registered it is part of
 776  * the zone_zsd list.
 777  * Return an error if the key wasn't registerd.
 778  */
 779 int
 780 zone_setspecific(zone_key_t key, zone_t *zone, const void *data)
 781 {
 782         struct zsd_entry *t;
 783 
 784         mutex_enter(&zone->zone_lock);
 785         t = zsd_find_mru(&zone->zone_zsd, key);
 786         if (t != NULL) {
 787                 /*
 788                  * Replace old value with new
 789                  */
 790                 t->zsd_data = (void *)data;
 791                 mutex_exit(&zone->zone_lock);
 792                 return (0);
 793         }
 794         mutex_exit(&zone->zone_lock);
 795         return (-1);
 796 }
 797 
 798 /*
 799  * ZSD counterpart of pthread_getspecific().
 800  */
 801 void *
 802 zone_getspecific(zone_key_t key, zone_t *zone)
 803 {
 804         struct zsd_entry *t;
 805         void *data;
 806 
 807         mutex_enter(&zone->zone_lock);
 808         t = zsd_find_mru(&zone->zone_zsd, key);
 809         data = (t == NULL ? NULL : t->zsd_data);
 810         mutex_exit(&zone->zone_lock);
 811         return (data);
 812 }
 813 
 814 /*
 815  * Function used to initialize a zone's list of ZSD callbacks and data
 816  * when the zone is being created.  The callbacks are initialized from
 817  * the template list (zsd_registered_keys). The constructor callback is
 818  * executed later (once the zone exists and with locks dropped).
 819  */
 820 static void
 821 zone_zsd_configure(zone_t *zone)
 822 {
 823         struct zsd_entry *zsdp;
 824         struct zsd_entry *t;
 825 
 826         ASSERT(MUTEX_HELD(&zonehash_lock));
 827         ASSERT(list_head(&zone->zone_zsd) == NULL);
 828         mutex_enter(&zone->zone_lock);
 829         mutex_enter(&zsd_key_lock);
 830         for (zsdp = list_head(&zsd_registered_keys); zsdp != NULL;
 831             zsdp = list_next(&zsd_registered_keys, zsdp)) {
 832                 /*
 833                  * Since this zone is ZONE_IS_UNCONFIGURED, zone_key_create
 834                  * should not have added anything to it.
 835                  */
 836                 ASSERT(zsd_find(&zone->zone_zsd, zsdp->zsd_key) == NULL);
 837 
 838                 t = kmem_zalloc(sizeof (*t), KM_SLEEP);
 839                 t->zsd_key = zsdp->zsd_key;
 840                 t->zsd_create = zsdp->zsd_create;
 841                 t->zsd_shutdown = zsdp->zsd_shutdown;
 842                 t->zsd_destroy = zsdp->zsd_destroy;
 843                 if (zsdp->zsd_create != NULL) {
 844                         t->zsd_flags = ZSD_CREATE_NEEDED;
 845                         DTRACE_PROBE2(zsd__create__needed,
 846                             zone_t *, zone, zone_key_t, zsdp->zsd_key);
 847                 }
 848                 list_insert_tail(&zone->zone_zsd, t);
 849         }
 850         mutex_exit(&zsd_key_lock);
 851         mutex_exit(&zone->zone_lock);
 852 }
 853 
 854 enum zsd_callback_type { ZSD_CREATE, ZSD_SHUTDOWN, ZSD_DESTROY };
 855 
 856 /*
 857  * Helper function to execute shutdown or destructor callbacks.
 858  */
 859 static void
 860 zone_zsd_callbacks(zone_t *zone, enum zsd_callback_type ct)
 861 {
 862         struct zsd_entry *t;
 863 
 864         ASSERT(ct == ZSD_SHUTDOWN || ct == ZSD_DESTROY);
 865         ASSERT(ct != ZSD_SHUTDOWN || zone_status_get(zone) >= ZONE_IS_EMPTY);
 866         ASSERT(ct != ZSD_DESTROY || zone_status_get(zone) >= ZONE_IS_DOWN);
 867 
 868         /*
 869          * Run the callback solely based on what is registered for the zone
 870          * in zone_zsd. The global list can change independently of this
 871          * as keys are registered and unregistered and we don't register new
 872          * callbacks for a zone that is in the process of going away.
 873          */
 874         mutex_enter(&zone->zone_lock);
 875         for (t = list_head(&zone->zone_zsd); t != NULL;
 876             t = list_next(&zone->zone_zsd, t)) {
 877                 zone_key_t key = t->zsd_key;
 878 
 879                 /* Skip if no callbacks registered */
 880 
 881                 if (ct == ZSD_SHUTDOWN) {
 882                         if (t->zsd_shutdown != NULL &&
 883                             (t->zsd_flags & ZSD_SHUTDOWN_ALL) == 0) {
 884                                 t->zsd_flags |= ZSD_SHUTDOWN_NEEDED;
 885                                 DTRACE_PROBE2(zsd__shutdown__needed,
 886                                     zone_t *, zone, zone_key_t, key);
 887                         }
 888                 } else {
 889                         if (t->zsd_destroy != NULL &&
 890                             (t->zsd_flags & ZSD_DESTROY_ALL) == 0) {
 891                                 t->zsd_flags |= ZSD_DESTROY_NEEDED;
 892                                 DTRACE_PROBE2(zsd__destroy__needed,
 893                                     zone_t *, zone, zone_key_t, key);
 894                         }
 895                 }
 896         }
 897         mutex_exit(&zone->zone_lock);
 898 
 899         /* Now call the shutdown and destroy callback for this key */
 900         zsd_apply_all_keys(zsd_apply_shutdown, zone);
 901         zsd_apply_all_keys(zsd_apply_destroy, zone);
 902 
 903 }
 904 
 905 /*
 906  * Called when the zone is going away; free ZSD-related memory, and
 907  * destroy the zone_zsd list.
 908  */
 909 static void
 910 zone_free_zsd(zone_t *zone)
 911 {
 912         struct zsd_entry *t, *next;
 913 
 914         /*
 915          * Free all the zsd_entry's we had on this zone.
 916          */
 917         mutex_enter(&zone->zone_lock);
 918         for (t = list_head(&zone->zone_zsd); t != NULL; t = next) {
 919                 next = list_next(&zone->zone_zsd, t);
 920                 list_remove(&zone->zone_zsd, t);
 921                 ASSERT(!(t->zsd_flags & ZSD_ALL_INPROGRESS));
 922                 kmem_free(t, sizeof (*t));
 923         }
 924         list_destroy(&zone->zone_zsd);
 925         mutex_exit(&zone->zone_lock);
 926 
 927 }
 928 
 929 /*
 930  * Apply a function to all zones for particular key value.
 931  *
 932  * The applyfn has to drop zonehash_lock if it does some work, and
 933  * then reacquire it before it returns.
 934  * When the lock is dropped we don't follow list_next even
 935  * if it is possible to do so without any hazards. This is
 936  * because we want the design to allow for the list of zones
 937  * to change in any arbitrary way during the time the
 938  * lock was dropped.
 939  *
 940  * It is safe to restart the loop at list_head since the applyfn
 941  * changes the zsd_flags as it does work, so a subsequent
 942  * pass through will have no effect in applyfn, hence the loop will terminate
 943  * in at worst O(N^2).
 944  */
 945 static void
 946 zsd_apply_all_zones(zsd_applyfn_t *applyfn, zone_key_t key)
 947 {
 948         zone_t *zone;
 949 
 950         mutex_enter(&zonehash_lock);
 951         zone = list_head(&zone_active);
 952         while (zone != NULL) {
 953                 if ((applyfn)(&zonehash_lock, B_FALSE, zone, key)) {
 954                         /* Lock dropped - restart at head */
 955                         zone = list_head(&zone_active);
 956                 } else {
 957                         zone = list_next(&zone_active, zone);
 958                 }
 959         }
 960         mutex_exit(&zonehash_lock);
 961 }
 962 
 963 /*
 964  * Apply a function to all keys for a particular zone.
 965  *
 966  * The applyfn has to drop zonehash_lock if it does some work, and
 967  * then reacquire it before it returns.
 968  * When the lock is dropped we don't follow list_next even
 969  * if it is possible to do so without any hazards. This is
 970  * because we want the design to allow for the list of zsd callbacks
 971  * to change in any arbitrary way during the time the
 972  * lock was dropped.
 973  *
 974  * It is safe to restart the loop at list_head since the applyfn
 975  * changes the zsd_flags as it does work, so a subsequent
 976  * pass through will have no effect in applyfn, hence the loop will terminate
 977  * in at worst O(N^2).
 978  */
 979 static void
 980 zsd_apply_all_keys(zsd_applyfn_t *applyfn, zone_t *zone)
 981 {
 982         struct zsd_entry *t;
 983 
 984         mutex_enter(&zone->zone_lock);
 985         t = list_head(&zone->zone_zsd);
 986         while (t != NULL) {
 987                 if ((applyfn)(NULL, B_TRUE, zone, t->zsd_key)) {
 988                         /* Lock dropped - restart at head */
 989                         t = list_head(&zone->zone_zsd);
 990                 } else {
 991                         t = list_next(&zone->zone_zsd, t);
 992                 }
 993         }
 994         mutex_exit(&zone->zone_lock);
 995 }
 996 
 997 /*
 998  * Call the create function for the zone and key if CREATE_NEEDED
 999  * is set.
1000  * If some other thread gets here first and sets CREATE_INPROGRESS, then
1001  * we wait for that thread to complete so that we can ensure that
1002  * all the callbacks are done when we've looped over all zones/keys.
1003  *
1004  * When we call the create function, we drop the global held by the
1005  * caller, and return true to tell the caller it needs to re-evalute the
1006  * state.
1007  * If the caller holds zone_lock then zone_lock_held is set, and zone_lock
1008  * remains held on exit.
1009  */
1010 static boolean_t
1011 zsd_apply_create(kmutex_t *lockp, boolean_t zone_lock_held,
1012     zone_t *zone, zone_key_t key)
1013 {
1014         void *result;
1015         struct zsd_entry *t;
1016         boolean_t dropped;
1017 
1018         if (lockp != NULL) {
1019                 ASSERT(MUTEX_HELD(lockp));
1020         }
1021         if (zone_lock_held) {
1022                 ASSERT(MUTEX_HELD(&zone->zone_lock));
1023         } else {
1024                 mutex_enter(&zone->zone_lock);
1025         }
1026 
1027         t = zsd_find(&zone->zone_zsd, key);
1028         if (t == NULL) {
1029                 /*
1030                  * Somebody else got here first e.g the zone going
1031                  * away.
1032                  */
1033                 if (!zone_lock_held)
1034                         mutex_exit(&zone->zone_lock);
1035                 return (B_FALSE);
1036         }
1037         dropped = B_FALSE;
1038         if (zsd_wait_for_inprogress(zone, t, lockp))
1039                 dropped = B_TRUE;
1040 
1041         if (t->zsd_flags & ZSD_CREATE_NEEDED) {
1042                 t->zsd_flags &= ~ZSD_CREATE_NEEDED;
1043                 t->zsd_flags |= ZSD_CREATE_INPROGRESS;
1044                 DTRACE_PROBE2(zsd__create__inprogress,
1045                     zone_t *, zone, zone_key_t, key);
1046                 mutex_exit(&zone->zone_lock);
1047                 if (lockp != NULL)
1048                         mutex_exit(lockp);
1049 
1050                 dropped = B_TRUE;
1051                 ASSERT(t->zsd_create != NULL);
1052                 DTRACE_PROBE2(zsd__create__start,
1053                     zone_t *, zone, zone_key_t, key);
1054 
1055                 result = (*t->zsd_create)(zone->zone_id);
1056 
1057                 DTRACE_PROBE2(zsd__create__end,
1058                     zone_t *, zone, voidn *, result);
1059 
1060                 ASSERT(result != NULL);
1061                 if (lockp != NULL)
1062                         mutex_enter(lockp);
1063                 mutex_enter(&zone->zone_lock);
1064                 t->zsd_data = result;
1065                 t->zsd_flags &= ~ZSD_CREATE_INPROGRESS;
1066                 t->zsd_flags |= ZSD_CREATE_COMPLETED;
1067                 cv_broadcast(&t->zsd_cv);
1068                 DTRACE_PROBE2(zsd__create__completed,
1069                     zone_t *, zone, zone_key_t, key);
1070         }
1071         if (!zone_lock_held)
1072                 mutex_exit(&zone->zone_lock);
1073         return (dropped);
1074 }
1075 
1076 /*
1077  * Call the shutdown function for the zone and key if SHUTDOWN_NEEDED
1078  * is set.
1079  * If some other thread gets here first and sets *_INPROGRESS, then
1080  * we wait for that thread to complete so that we can ensure that
1081  * all the callbacks are done when we've looped over all zones/keys.
1082  *
1083  * When we call the shutdown function, we drop the global held by the
1084  * caller, and return true to tell the caller it needs to re-evalute the
1085  * state.
1086  * If the caller holds zone_lock then zone_lock_held is set, and zone_lock
1087  * remains held on exit.
1088  */
1089 static boolean_t
1090 zsd_apply_shutdown(kmutex_t *lockp, boolean_t zone_lock_held,
1091     zone_t *zone, zone_key_t key)
1092 {
1093         struct zsd_entry *t;
1094         void *data;
1095         boolean_t dropped;
1096 
1097         if (lockp != NULL) {
1098                 ASSERT(MUTEX_HELD(lockp));
1099         }
1100         if (zone_lock_held) {
1101                 ASSERT(MUTEX_HELD(&zone->zone_lock));
1102         } else {
1103                 mutex_enter(&zone->zone_lock);
1104         }
1105 
1106         t = zsd_find(&zone->zone_zsd, key);
1107         if (t == NULL) {
1108                 /*
1109                  * Somebody else got here first e.g the zone going
1110                  * away.
1111                  */
1112                 if (!zone_lock_held)
1113                         mutex_exit(&zone->zone_lock);
1114                 return (B_FALSE);
1115         }
1116         dropped = B_FALSE;
1117         if (zsd_wait_for_creator(zone, t, lockp))
1118                 dropped = B_TRUE;
1119 
1120         if (zsd_wait_for_inprogress(zone, t, lockp))
1121                 dropped = B_TRUE;
1122 
1123         if (t->zsd_flags & ZSD_SHUTDOWN_NEEDED) {
1124                 t->zsd_flags &= ~ZSD_SHUTDOWN_NEEDED;
1125                 t->zsd_flags |= ZSD_SHUTDOWN_INPROGRESS;
1126                 DTRACE_PROBE2(zsd__shutdown__inprogress,
1127                     zone_t *, zone, zone_key_t, key);
1128                 mutex_exit(&zone->zone_lock);
1129                 if (lockp != NULL)
1130                         mutex_exit(lockp);
1131                 dropped = B_TRUE;
1132 
1133                 ASSERT(t->zsd_shutdown != NULL);
1134                 data = t->zsd_data;
1135 
1136                 DTRACE_PROBE2(zsd__shutdown__start,
1137                     zone_t *, zone, zone_key_t, key);
1138 
1139                 (t->zsd_shutdown)(zone->zone_id, data);
1140                 DTRACE_PROBE2(zsd__shutdown__end,
1141                     zone_t *, zone, zone_key_t, key);
1142 
1143                 if (lockp != NULL)
1144                         mutex_enter(lockp);
1145                 mutex_enter(&zone->zone_lock);
1146                 t->zsd_flags &= ~ZSD_SHUTDOWN_INPROGRESS;
1147                 t->zsd_flags |= ZSD_SHUTDOWN_COMPLETED;
1148                 cv_broadcast(&t->zsd_cv);
1149                 DTRACE_PROBE2(zsd__shutdown__completed,
1150                     zone_t *, zone, zone_key_t, key);
1151         }
1152         if (!zone_lock_held)
1153                 mutex_exit(&zone->zone_lock);
1154         return (dropped);
1155 }
1156 
1157 /*
1158  * Call the destroy function for the zone and key if DESTROY_NEEDED
1159  * is set.
1160  * If some other thread gets here first and sets *_INPROGRESS, then
1161  * we wait for that thread to complete so that we can ensure that
1162  * all the callbacks are done when we've looped over all zones/keys.
1163  *
1164  * When we call the destroy function, we drop the global held by the
1165  * caller, and return true to tell the caller it needs to re-evalute the
1166  * state.
1167  * If the caller holds zone_lock then zone_lock_held is set, and zone_lock
1168  * remains held on exit.
1169  */
1170 static boolean_t
1171 zsd_apply_destroy(kmutex_t *lockp, boolean_t zone_lock_held,
1172     zone_t *zone, zone_key_t key)
1173 {
1174         struct zsd_entry *t;
1175         void *data;
1176         boolean_t dropped;
1177 
1178         if (lockp != NULL) {
1179                 ASSERT(MUTEX_HELD(lockp));
1180         }
1181         if (zone_lock_held) {
1182                 ASSERT(MUTEX_HELD(&zone->zone_lock));
1183         } else {
1184                 mutex_enter(&zone->zone_lock);
1185         }
1186 
1187         t = zsd_find(&zone->zone_zsd, key);
1188         if (t == NULL) {
1189                 /*
1190                  * Somebody else got here first e.g the zone going
1191                  * away.
1192                  */
1193                 if (!zone_lock_held)
1194                         mutex_exit(&zone->zone_lock);
1195                 return (B_FALSE);
1196         }
1197         dropped = B_FALSE;
1198         if (zsd_wait_for_creator(zone, t, lockp))
1199                 dropped = B_TRUE;
1200 
1201         if (zsd_wait_for_inprogress(zone, t, lockp))
1202                 dropped = B_TRUE;
1203 
1204         if (t->zsd_flags & ZSD_DESTROY_NEEDED) {
1205                 t->zsd_flags &= ~ZSD_DESTROY_NEEDED;
1206                 t->zsd_flags |= ZSD_DESTROY_INPROGRESS;
1207                 DTRACE_PROBE2(zsd__destroy__inprogress,
1208                     zone_t *, zone, zone_key_t, key);
1209                 mutex_exit(&zone->zone_lock);
1210                 if (lockp != NULL)
1211                         mutex_exit(lockp);
1212                 dropped = B_TRUE;
1213 
1214                 ASSERT(t->zsd_destroy != NULL);
1215                 data = t->zsd_data;
1216                 DTRACE_PROBE2(zsd__destroy__start,
1217                     zone_t *, zone, zone_key_t, key);
1218 
1219                 (t->zsd_destroy)(zone->zone_id, data);
1220                 DTRACE_PROBE2(zsd__destroy__end,
1221                     zone_t *, zone, zone_key_t, key);
1222 
1223                 if (lockp != NULL)
1224                         mutex_enter(lockp);
1225                 mutex_enter(&zone->zone_lock);
1226                 t->zsd_data = NULL;
1227                 t->zsd_flags &= ~ZSD_DESTROY_INPROGRESS;
1228                 t->zsd_flags |= ZSD_DESTROY_COMPLETED;
1229                 cv_broadcast(&t->zsd_cv);
1230                 DTRACE_PROBE2(zsd__destroy__completed,
1231                     zone_t *, zone, zone_key_t, key);
1232         }
1233         if (!zone_lock_held)
1234                 mutex_exit(&zone->zone_lock);
1235         return (dropped);
1236 }
1237 
1238 /*
1239  * Wait for any CREATE_NEEDED flag to be cleared.
1240  * Returns true if lockp was temporarily dropped while waiting.
1241  */
1242 static boolean_t
1243 zsd_wait_for_creator(zone_t *zone, struct zsd_entry *t, kmutex_t *lockp)
1244 {
1245         boolean_t dropped = B_FALSE;
1246 
1247         while (t->zsd_flags & ZSD_CREATE_NEEDED) {
1248                 DTRACE_PROBE2(zsd__wait__for__creator,
1249                     zone_t *, zone, struct zsd_entry *, t);
1250                 if (lockp != NULL) {
1251                         dropped = B_TRUE;
1252                         mutex_exit(lockp);
1253                 }
1254                 cv_wait(&t->zsd_cv, &zone->zone_lock);
1255                 if (lockp != NULL) {
1256                         /* First drop zone_lock to preserve order */
1257                         mutex_exit(&zone->zone_lock);
1258                         mutex_enter(lockp);
1259                         mutex_enter(&zone->zone_lock);
1260                 }
1261         }
1262         return (dropped);
1263 }
1264 
1265 /*
1266  * Wait for any INPROGRESS flag to be cleared.
1267  * Returns true if lockp was temporarily dropped while waiting.
1268  */
1269 static boolean_t
1270 zsd_wait_for_inprogress(zone_t *zone, struct zsd_entry *t, kmutex_t *lockp)
1271 {
1272         boolean_t dropped = B_FALSE;
1273 
1274         while (t->zsd_flags & ZSD_ALL_INPROGRESS) {
1275                 DTRACE_PROBE2(zsd__wait__for__inprogress,
1276                     zone_t *, zone, struct zsd_entry *, t);
1277                 if (lockp != NULL) {
1278                         dropped = B_TRUE;
1279                         mutex_exit(lockp);
1280                 }
1281                 cv_wait(&t->zsd_cv, &zone->zone_lock);
1282                 if (lockp != NULL) {
1283                         /* First drop zone_lock to preserve order */
1284                         mutex_exit(&zone->zone_lock);
1285                         mutex_enter(lockp);
1286                         mutex_enter(&zone->zone_lock);
1287                 }
1288         }
1289         return (dropped);
1290 }
1291 
1292 /*
1293  * Frees memory associated with the zone dataset list.
1294  */
1295 static void
1296 zone_free_datasets(zone_t *zone)
1297 {
1298         zone_dataset_t *t, *next;
1299 
1300         for (t = list_head(&zone->zone_datasets); t != NULL; t = next) {
1301                 next = list_next(&zone->zone_datasets, t);
1302                 list_remove(&zone->zone_datasets, t);
1303                 kmem_free(t->zd_dataset, strlen(t->zd_dataset) + 1);
1304                 kmem_free(t, sizeof (*t));
1305         }
1306         list_destroy(&zone->zone_datasets);
1307 }
1308 
1309 /*
1310  * zone.cpu-shares resource control support.
1311  */
1312 /*ARGSUSED*/
1313 static rctl_qty_t
1314 zone_cpu_shares_usage(rctl_t *rctl, struct proc *p)
1315 {
1316         ASSERT(MUTEX_HELD(&p->p_lock));
1317         return (p->p_zone->zone_shares);
1318 }
1319 
1320 /*ARGSUSED*/
1321 static int
1322 zone_cpu_shares_set(rctl_t *rctl, struct proc *p, rctl_entity_p_t *e,
1323     rctl_qty_t nv)
1324 {
1325         ASSERT(MUTEX_HELD(&p->p_lock));
1326         ASSERT(e->rcep_t == RCENTITY_ZONE);
1327         if (e->rcep_p.zone == NULL)
1328                 return (0);
1329 
1330         e->rcep_p.zone->zone_shares = nv;
1331         return (0);
1332 }
1333 
1334 static rctl_ops_t zone_cpu_shares_ops = {
1335         rcop_no_action,
1336         zone_cpu_shares_usage,
1337         zone_cpu_shares_set,
1338         rcop_no_test
1339 };
1340 
1341 /*
1342  * zone.cpu-cap resource control support.
1343  */
1344 /*ARGSUSED*/
1345 static rctl_qty_t
1346 zone_cpu_cap_get(rctl_t *rctl, struct proc *p)
1347 {
1348         ASSERT(MUTEX_HELD(&p->p_lock));
1349         return (cpucaps_zone_get(p->p_zone));
1350 }
1351 
1352 /*ARGSUSED*/
1353 static int
1354 zone_cpu_cap_set(rctl_t *rctl, struct proc *p, rctl_entity_p_t *e,
1355     rctl_qty_t nv)
1356 {
1357         zone_t *zone = e->rcep_p.zone;
1358 
1359         ASSERT(MUTEX_HELD(&p->p_lock));
1360         ASSERT(e->rcep_t == RCENTITY_ZONE);
1361 
1362         if (zone == NULL)
1363                 return (0);
1364 
1365         /*
1366          * set cap to the new value.
1367          */
1368         return (cpucaps_zone_set(zone, nv));
1369 }
1370 
1371 static rctl_ops_t zone_cpu_cap_ops = {
1372         rcop_no_action,
1373         zone_cpu_cap_get,
1374         zone_cpu_cap_set,
1375         rcop_no_test
1376 };
1377 
1378 /*ARGSUSED*/
1379 static rctl_qty_t
1380 zone_lwps_usage(rctl_t *r, proc_t *p)
1381 {
1382         rctl_qty_t nlwps;
1383         zone_t *zone = p->p_zone;
1384 
1385         ASSERT(MUTEX_HELD(&p->p_lock));
1386 
1387         mutex_enter(&zone->zone_nlwps_lock);
1388         nlwps = zone->zone_nlwps;
1389         mutex_exit(&zone->zone_nlwps_lock);
1390 
1391         return (nlwps);
1392 }
1393 
1394 /*ARGSUSED*/
1395 static int
1396 zone_lwps_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e, rctl_val_t *rcntl,
1397     rctl_qty_t incr, uint_t flags)
1398 {
1399         rctl_qty_t nlwps;
1400 
1401         ASSERT(MUTEX_HELD(&p->p_lock));
1402         ASSERT(e->rcep_t == RCENTITY_ZONE);
1403         if (e->rcep_p.zone == NULL)
1404                 return (0);
1405         ASSERT(MUTEX_HELD(&(e->rcep_p.zone->zone_nlwps_lock)));
1406         nlwps = e->rcep_p.zone->zone_nlwps;
1407 
1408         if (nlwps + incr > rcntl->rcv_value)
1409                 return (1);
1410 
1411         return (0);
1412 }
1413 
1414 /*ARGSUSED*/
1415 static int
1416 zone_lwps_set(rctl_t *rctl, struct proc *p, rctl_entity_p_t *e, rctl_qty_t nv)
1417 {
1418         ASSERT(MUTEX_HELD(&p->p_lock));
1419         ASSERT(e->rcep_t == RCENTITY_ZONE);
1420         if (e->rcep_p.zone == NULL)
1421                 return (0);
1422         e->rcep_p.zone->zone_nlwps_ctl = nv;
1423         return (0);
1424 }
1425 
1426 static rctl_ops_t zone_lwps_ops = {
1427         rcop_no_action,
1428         zone_lwps_usage,
1429         zone_lwps_set,
1430         zone_lwps_test,
1431 };
1432 
1433 /*ARGSUSED*/
1434 static rctl_qty_t
1435 zone_procs_usage(rctl_t *r, proc_t *p)
1436 {
1437         rctl_qty_t nprocs;
1438         zone_t *zone = p->p_zone;
1439 
1440         ASSERT(MUTEX_HELD(&p->p_lock));
1441 
1442         mutex_enter(&zone->zone_nlwps_lock);
1443         nprocs = zone->zone_nprocs;
1444         mutex_exit(&zone->zone_nlwps_lock);
1445 
1446         return (nprocs);
1447 }
1448 
1449 /*ARGSUSED*/
1450 static int
1451 zone_procs_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e, rctl_val_t *rcntl,
1452     rctl_qty_t incr, uint_t flags)
1453 {
1454         rctl_qty_t nprocs;
1455 
1456         ASSERT(MUTEX_HELD(&p->p_lock));
1457         ASSERT(e->rcep_t == RCENTITY_ZONE);
1458         if (e->rcep_p.zone == NULL)
1459                 return (0);
1460         ASSERT(MUTEX_HELD(&(e->rcep_p.zone->zone_nlwps_lock)));
1461         nprocs = e->rcep_p.zone->zone_nprocs;
1462 
1463         if (nprocs + incr > rcntl->rcv_value)
1464                 return (1);
1465 
1466         return (0);
1467 }
1468 
1469 /*ARGSUSED*/
1470 static int
1471 zone_procs_set(rctl_t *rctl, struct proc *p, rctl_entity_p_t *e, rctl_qty_t nv)
1472 {
1473         ASSERT(MUTEX_HELD(&p->p_lock));
1474         ASSERT(e->rcep_t == RCENTITY_ZONE);
1475         if (e->rcep_p.zone == NULL)
1476                 return (0);
1477         e->rcep_p.zone->zone_nprocs_ctl = nv;
1478         return (0);
1479 }
1480 
1481 static rctl_ops_t zone_procs_ops = {
1482         rcop_no_action,
1483         zone_procs_usage,
1484         zone_procs_set,
1485         zone_procs_test,
1486 };
1487 
1488 /*ARGSUSED*/
1489 static rctl_qty_t
1490 zone_shmmax_usage(rctl_t *rctl, struct proc *p)
1491 {
1492         ASSERT(MUTEX_HELD(&p->p_lock));
1493         return (p->p_zone->zone_shmmax);
1494 }
1495 
1496 /*ARGSUSED*/
1497 static int
1498 zone_shmmax_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e, rctl_val_t *rval,
1499     rctl_qty_t incr, uint_t flags)
1500 {
1501         rctl_qty_t v;
1502         ASSERT(MUTEX_HELD(&p->p_lock));
1503         ASSERT(e->rcep_t == RCENTITY_ZONE);
1504         v = e->rcep_p.zone->zone_shmmax + incr;
1505         if (v > rval->rcv_value)
1506                 return (1);
1507         return (0);
1508 }
1509 
1510 static rctl_ops_t zone_shmmax_ops = {
1511         rcop_no_action,
1512         zone_shmmax_usage,
1513         rcop_no_set,
1514         zone_shmmax_test
1515 };
1516 
1517 /*ARGSUSED*/
1518 static rctl_qty_t
1519 zone_shmmni_usage(rctl_t *rctl, struct proc *p)
1520 {
1521         ASSERT(MUTEX_HELD(&p->p_lock));
1522         return (p->p_zone->zone_ipc.ipcq_shmmni);
1523 }
1524 
1525 /*ARGSUSED*/
1526 static int
1527 zone_shmmni_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e, rctl_val_t *rval,
1528     rctl_qty_t incr, uint_t flags)
1529 {
1530         rctl_qty_t v;
1531         ASSERT(MUTEX_HELD(&p->p_lock));
1532         ASSERT(e->rcep_t == RCENTITY_ZONE);
1533         v = e->rcep_p.zone->zone_ipc.ipcq_shmmni + incr;
1534         if (v > rval->rcv_value)
1535                 return (1);
1536         return (0);
1537 }
1538 
1539 static rctl_ops_t zone_shmmni_ops = {
1540         rcop_no_action,
1541         zone_shmmni_usage,
1542         rcop_no_set,
1543         zone_shmmni_test
1544 };
1545 
1546 /*ARGSUSED*/
1547 static rctl_qty_t
1548 zone_semmni_usage(rctl_t *rctl, struct proc *p)
1549 {
1550         ASSERT(MUTEX_HELD(&p->p_lock));
1551         return (p->p_zone->zone_ipc.ipcq_semmni);
1552 }
1553 
1554 /*ARGSUSED*/
1555 static int
1556 zone_semmni_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e, rctl_val_t *rval,
1557     rctl_qty_t incr, uint_t flags)
1558 {
1559         rctl_qty_t v;
1560         ASSERT(MUTEX_HELD(&p->p_lock));
1561         ASSERT(e->rcep_t == RCENTITY_ZONE);
1562         v = e->rcep_p.zone->zone_ipc.ipcq_semmni + incr;
1563         if (v > rval->rcv_value)
1564                 return (1);
1565         return (0);
1566 }
1567 
1568 static rctl_ops_t zone_semmni_ops = {
1569         rcop_no_action,
1570         zone_semmni_usage,
1571         rcop_no_set,
1572         zone_semmni_test
1573 };
1574 
1575 /*ARGSUSED*/
1576 static rctl_qty_t
1577 zone_msgmni_usage(rctl_t *rctl, struct proc *p)
1578 {
1579         ASSERT(MUTEX_HELD(&p->p_lock));
1580         return (p->p_zone->zone_ipc.ipcq_msgmni);
1581 }
1582 
1583 /*ARGSUSED*/
1584 static int
1585 zone_msgmni_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e, rctl_val_t *rval,
1586     rctl_qty_t incr, uint_t flags)
1587 {
1588         rctl_qty_t v;
1589         ASSERT(MUTEX_HELD(&p->p_lock));
1590         ASSERT(e->rcep_t == RCENTITY_ZONE);
1591         v = e->rcep_p.zone->zone_ipc.ipcq_msgmni + incr;
1592         if (v > rval->rcv_value)
1593                 return (1);
1594         return (0);
1595 }
1596 
1597 static rctl_ops_t zone_msgmni_ops = {
1598         rcop_no_action,
1599         zone_msgmni_usage,
1600         rcop_no_set,
1601         zone_msgmni_test
1602 };
1603 
1604 /*ARGSUSED*/
1605 static rctl_qty_t
1606 zone_locked_mem_usage(rctl_t *rctl, struct proc *p)
1607 {
1608         rctl_qty_t q;
1609         ASSERT(MUTEX_HELD(&p->p_lock));
1610         mutex_enter(&p->p_zone->zone_mem_lock);
1611         q = p->p_zone->zone_locked_mem;
1612         mutex_exit(&p->p_zone->zone_mem_lock);
1613         return (q);
1614 }
1615 
1616 /*ARGSUSED*/
1617 static int
1618 zone_locked_mem_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e,
1619     rctl_val_t *rcntl, rctl_qty_t incr, uint_t flags)
1620 {
1621         rctl_qty_t q;
1622         zone_t *z;
1623 
1624         z = e->rcep_p.zone;
1625         ASSERT(MUTEX_HELD(&p->p_lock));
1626         ASSERT(MUTEX_HELD(&z->zone_mem_lock));
1627         q = z->zone_locked_mem;
1628         if (q + incr > rcntl->rcv_value)
1629                 return (1);
1630         return (0);
1631 }
1632 
1633 /*ARGSUSED*/
1634 static int
1635 zone_locked_mem_set(rctl_t *rctl, struct proc *p, rctl_entity_p_t *e,
1636     rctl_qty_t nv)
1637 {
1638         ASSERT(MUTEX_HELD(&p->p_lock));
1639         ASSERT(e->rcep_t == RCENTITY_ZONE);
1640         if (e->rcep_p.zone == NULL)
1641                 return (0);
1642         e->rcep_p.zone->zone_locked_mem_ctl = nv;
1643         return (0);
1644 }
1645 
1646 static rctl_ops_t zone_locked_mem_ops = {
1647         rcop_no_action,
1648         zone_locked_mem_usage,
1649         zone_locked_mem_set,
1650         zone_locked_mem_test
1651 };
1652 
1653 /*ARGSUSED*/
1654 static rctl_qty_t
1655 zone_max_swap_usage(rctl_t *rctl, struct proc *p)
1656 {
1657         rctl_qty_t q;
1658         zone_t *z = p->p_zone;
1659 
1660         ASSERT(MUTEX_HELD(&p->p_lock));
1661         mutex_enter(&z->zone_mem_lock);
1662         q = z->zone_max_swap;
1663         mutex_exit(&z->zone_mem_lock);
1664         return (q);
1665 }
1666 
1667 /*ARGSUSED*/
1668 static int
1669 zone_max_swap_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e,
1670     rctl_val_t *rcntl, rctl_qty_t incr, uint_t flags)
1671 {
1672         rctl_qty_t q;
1673         zone_t *z;
1674 
1675         z = e->rcep_p.zone;
1676         ASSERT(MUTEX_HELD(&p->p_lock));
1677         ASSERT(MUTEX_HELD(&z->zone_mem_lock));
1678         q = z->zone_max_swap;
1679         if (q + incr > rcntl->rcv_value)
1680                 return (1);
1681         return (0);
1682 }
1683 
1684 /*ARGSUSED*/
1685 static int
1686 zone_max_swap_set(rctl_t *rctl, struct proc *p, rctl_entity_p_t *e,
1687     rctl_qty_t nv)
1688 {
1689         ASSERT(MUTEX_HELD(&p->p_lock));
1690         ASSERT(e->rcep_t == RCENTITY_ZONE);
1691         if (e->rcep_p.zone == NULL)
1692                 return (0);
1693         e->rcep_p.zone->zone_max_swap_ctl = nv;
1694         return (0);
1695 }
1696 
1697 static rctl_ops_t zone_max_swap_ops = {
1698         rcop_no_action,
1699         zone_max_swap_usage,
1700         zone_max_swap_set,
1701         zone_max_swap_test
1702 };
1703 
1704 /*ARGSUSED*/
1705 static rctl_qty_t
1706 zone_max_lofi_usage(rctl_t *rctl, struct proc *p)
1707 {
1708         rctl_qty_t q;
1709         zone_t *z = p->p_zone;
1710 
1711         ASSERT(MUTEX_HELD(&p->p_lock));
1712         mutex_enter(&z->zone_rctl_lock);
1713         q = z->zone_max_lofi;
1714         mutex_exit(&z->zone_rctl_lock);
1715         return (q);
1716 }
1717 
1718 /*ARGSUSED*/
1719 static int
1720 zone_max_lofi_test(rctl_t *r, proc_t *p, rctl_entity_p_t *e,
1721     rctl_val_t *rcntl, rctl_qty_t incr, uint_t flags)
1722 {
1723         rctl_qty_t q;
1724         zone_t *z;
1725 
1726         z = e->rcep_p.zone;
1727         ASSERT(MUTEX_HELD(&p->p_lock));
1728         ASSERT(MUTEX_HELD(&z->zone_rctl_lock));
1729         q = z->zone_max_lofi;
1730         if (q + incr > rcntl->rcv_value)
1731                 return (1);
1732         return (0);
1733 }
1734 
1735 /*ARGSUSED*/
1736 static int
1737 zone_max_lofi_set(rctl_t *rctl, struct proc *p, rctl_entity_p_t *e,
1738     rctl_qty_t nv)
1739 {
1740         ASSERT(MUTEX_HELD(&p->p_lock));
1741         ASSERT(e->rcep_t == RCENTITY_ZONE);
1742         if (e->rcep_p.zone == NULL)
1743                 return (0);
1744         e->rcep_p.zone->zone_max_lofi_ctl = nv;
1745         return (0);
1746 }
1747 
1748 static rctl_ops_t zone_max_lofi_ops = {
1749         rcop_no_action,
1750         zone_max_lofi_usage,
1751         zone_max_lofi_set,
1752         zone_max_lofi_test
1753 };
1754 
1755 /*
1756  * Helper function to brand the zone with a unique ID.
1757  */
1758 static void
1759 zone_uniqid(zone_t *zone)
1760 {
1761         static uint64_t uniqid = 0;
1762 
1763         ASSERT(MUTEX_HELD(&zonehash_lock));
1764         zone->zone_uniqid = uniqid++;
1765 }
1766 
1767 /*
1768  * Returns a held pointer to the "kcred" for the specified zone.
1769  */
1770 struct cred *
1771 zone_get_kcred(zoneid_t zoneid)
1772 {
1773         zone_t *zone;
1774         cred_t *cr;
1775 
1776         if ((zone = zone_find_by_id(zoneid)) == NULL)
1777                 return (NULL);
1778         cr = zone->zone_kcred;
1779         crhold(cr);
1780         zone_rele(zone);
1781         return (cr);
1782 }
1783 
1784 static int
1785 zone_lockedmem_kstat_update(kstat_t *ksp, int rw)
1786 {
1787         zone_t *zone = ksp->ks_private;
1788         zone_kstat_t *zk = ksp->ks_data;
1789 
1790         if (rw == KSTAT_WRITE)
1791                 return (EACCES);
1792 
1793         zk->zk_usage.value.ui64 = zone->zone_locked_mem;
1794         zk->zk_value.value.ui64 = zone->zone_locked_mem_ctl;
1795         return (0);
1796 }
1797 
1798 static int
1799 zone_nprocs_kstat_update(kstat_t *ksp, int rw)
1800 {
1801         zone_t *zone = ksp->ks_private;
1802         zone_kstat_t *zk = ksp->ks_data;
1803 
1804         if (rw == KSTAT_WRITE)
1805                 return (EACCES);
1806 
1807         zk->zk_usage.value.ui64 = zone->zone_nprocs;
1808         zk->zk_value.value.ui64 = zone->zone_nprocs_ctl;
1809         return (0);
1810 }
1811 
1812 static int
1813 zone_swapresv_kstat_update(kstat_t *ksp, int rw)
1814 {
1815         zone_t *zone = ksp->ks_private;
1816         zone_kstat_t *zk = ksp->ks_data;
1817 
1818         if (rw == KSTAT_WRITE)
1819                 return (EACCES);
1820 
1821         zk->zk_usage.value.ui64 = zone->zone_max_swap;
1822         zk->zk_value.value.ui64 = zone->zone_max_swap_ctl;
1823         return (0);
1824 }
1825 
1826 static kstat_t *
1827 zone_kstat_create_common(zone_t *zone, char *name,
1828     int (*updatefunc) (kstat_t *, int))
1829 {
1830         kstat_t *ksp;
1831         zone_kstat_t *zk;
1832 
1833         ksp = rctl_kstat_create_zone(zone, name, KSTAT_TYPE_NAMED,
1834             sizeof (zone_kstat_t) / sizeof (kstat_named_t),
1835             KSTAT_FLAG_VIRTUAL);
1836 
1837         if (ksp == NULL)
1838                 return (NULL);
1839 
1840         zk = ksp->ks_data = kmem_alloc(sizeof (zone_kstat_t), KM_SLEEP);
1841         ksp->ks_data_size += strlen(zone->zone_name) + 1;
1842         kstat_named_init(&zk->zk_zonename, "zonename", KSTAT_DATA_STRING);
1843         kstat_named_setstr(&zk->zk_zonename, zone->zone_name);
1844         kstat_named_init(&zk->zk_usage, "usage", KSTAT_DATA_UINT64);
1845         kstat_named_init(&zk->zk_value, "value", KSTAT_DATA_UINT64);
1846         ksp->ks_update = updatefunc;
1847         ksp->ks_private = zone;
1848         kstat_install(ksp);
1849         return (ksp);
1850 }
1851 
1852 
1853 static int
1854 zone_mcap_kstat_update(kstat_t *ksp, int rw)
1855 {
1856         zone_t *zone = ksp->ks_private;
1857         zone_mcap_kstat_t *zmp = ksp->ks_data;
1858 
1859         if (rw == KSTAT_WRITE)
1860                 return (EACCES);
1861 
1862         zmp->zm_pgpgin.value.ui64 = zone->zone_pgpgin;
1863         zmp->zm_anonpgin.value.ui64 = zone->zone_anonpgin;
1864         zmp->zm_execpgin.value.ui64 = zone->zone_execpgin;
1865         zmp->zm_fspgin.value.ui64 = zone->zone_fspgin;
1866         zmp->zm_anon_alloc_fail.value.ui64 = zone->zone_anon_alloc_fail;
1867 
1868         return (0);
1869 }
1870 
1871 static kstat_t *
1872 zone_mcap_kstat_create(zone_t *zone)
1873 {
1874         kstat_t *ksp;
1875         zone_mcap_kstat_t *zmp;
1876 
1877         if ((ksp = kstat_create_zone("memory_cap", zone->zone_id,
1878             zone->zone_name, "zone_memory_cap", KSTAT_TYPE_NAMED,
1879             sizeof (zone_mcap_kstat_t) / sizeof (kstat_named_t),
1880             KSTAT_FLAG_VIRTUAL, zone->zone_id)) == NULL)
1881                 return (NULL);
1882 
1883         if (zone->zone_id != GLOBAL_ZONEID)
1884                 kstat_zone_add(ksp, GLOBAL_ZONEID);
1885 
1886         zmp = ksp->ks_data = kmem_zalloc(sizeof (zone_mcap_kstat_t), KM_SLEEP);
1887         ksp->ks_data_size += strlen(zone->zone_name) + 1;
1888         ksp->ks_lock = &zone->zone_mcap_lock;
1889         zone->zone_mcap_stats = zmp;
1890 
1891         /* The kstat "name" field is not large enough for a full zonename */
1892         kstat_named_init(&zmp->zm_zonename, "zonename", KSTAT_DATA_STRING);
1893         kstat_named_setstr(&zmp->zm_zonename, zone->zone_name);
1894         kstat_named_init(&zmp->zm_pgpgin, "pgpgin", KSTAT_DATA_UINT64);
1895         kstat_named_init(&zmp->zm_anonpgin, "anonpgin", KSTAT_DATA_UINT64);
1896         kstat_named_init(&zmp->zm_execpgin, "execpgin", KSTAT_DATA_UINT64);
1897         kstat_named_init(&zmp->zm_fspgin, "fspgin", KSTAT_DATA_UINT64);
1898         kstat_named_init(&zmp->zm_anon_alloc_fail, "anon_alloc_fail",
1899             KSTAT_DATA_UINT64);
1900 
1901         ksp->ks_update = zone_mcap_kstat_update;
1902         ksp->ks_private = zone;
1903 
1904         kstat_install(ksp);
1905         return (ksp);
1906 }
1907 
1908 static int
1909 zone_misc_kstat_update(kstat_t *ksp, int rw)
1910 {
1911         zone_t *zone = ksp->ks_private;
1912         zone_misc_kstat_t *zmp = ksp->ks_data;
1913         hrtime_t tmp;
1914 
1915         if (rw == KSTAT_WRITE)
1916                 return (EACCES);
1917 
1918         tmp = zone->zone_utime;
1919         scalehrtime(&tmp);
1920         zmp->zm_utime.value.ui64 = tmp;
1921         tmp = zone->zone_stime;
1922         scalehrtime(&tmp);
1923         zmp->zm_stime.value.ui64 = tmp;
1924         tmp = zone->zone_wtime;
1925         scalehrtime(&tmp);
1926         zmp->zm_wtime.value.ui64 = tmp;
1927 
1928         zmp->zm_avenrun1.value.ui32 = zone->zone_avenrun[0];
1929         zmp->zm_avenrun5.value.ui32 = zone->zone_avenrun[1];
1930         zmp->zm_avenrun15.value.ui32 = zone->zone_avenrun[2];
1931 
1932         zmp->zm_ffcap.value.ui32 = zone->zone_ffcap;
1933         zmp->zm_ffnoproc.value.ui32 = zone->zone_ffnoproc;
1934         zmp->zm_ffnomem.value.ui32 = zone->zone_ffnomem;
1935         zmp->zm_ffmisc.value.ui32 = zone->zone_ffmisc;
1936 
1937         zmp->zm_nested_intp.value.ui32 = zone->zone_nested_intp;
1938 
1939         zmp->zm_init_pid.value.ui32 = zone->zone_proc_initpid;
1940         zmp->zm_boot_time.value.ui64 = (uint64_t)zone->zone_boot_time;
1941 
1942         return (0);
1943 }
1944 
1945 static kstat_t *
1946 zone_misc_kstat_create(zone_t *zone)
1947 {
1948         kstat_t *ksp;
1949         zone_misc_kstat_t *zmp;
1950 
1951         if ((ksp = kstat_create_zone("zones", zone->zone_id,
1952             zone->zone_name, "zone_misc", KSTAT_TYPE_NAMED,
1953             sizeof (zone_misc_kstat_t) / sizeof (kstat_named_t),
1954             KSTAT_FLAG_VIRTUAL, zone->zone_id)) == NULL)
1955                 return (NULL);
1956 
1957         if (zone->zone_id != GLOBAL_ZONEID)
1958                 kstat_zone_add(ksp, GLOBAL_ZONEID);
1959 
1960         zmp = ksp->ks_data = kmem_zalloc(sizeof (zone_misc_kstat_t), KM_SLEEP);
1961         ksp->ks_data_size += strlen(zone->zone_name) + 1;
1962         ksp->ks_lock = &zone->zone_misc_lock;
1963         zone->zone_misc_stats = zmp;
1964 
1965         /* The kstat "name" field is not large enough for a full zonename */
1966         kstat_named_init(&zmp->zm_zonename, "zonename", KSTAT_DATA_STRING);
1967         kstat_named_setstr(&zmp->zm_zonename, zone->zone_name);
1968         kstat_named_init(&zmp->zm_utime, "nsec_user", KSTAT_DATA_UINT64);
1969         kstat_named_init(&zmp->zm_stime, "nsec_sys", KSTAT_DATA_UINT64);
1970         kstat_named_init(&zmp->zm_wtime, "nsec_waitrq", KSTAT_DATA_UINT64);
1971         kstat_named_init(&zmp->zm_avenrun1, "avenrun_1min", KSTAT_DATA_UINT32);
1972         kstat_named_init(&zmp->zm_avenrun5, "avenrun_5min", KSTAT_DATA_UINT32);
1973         kstat_named_init(&zmp->zm_avenrun15, "avenrun_15min",
1974             KSTAT_DATA_UINT32);
1975         kstat_named_init(&zmp->zm_ffcap, "forkfail_cap", KSTAT_DATA_UINT32);
1976         kstat_named_init(&zmp->zm_ffnoproc, "forkfail_noproc",
1977             KSTAT_DATA_UINT32);
1978         kstat_named_init(&zmp->zm_ffnomem, "forkfail_nomem", KSTAT_DATA_UINT32);
1979         kstat_named_init(&zmp->zm_ffmisc, "forkfail_misc", KSTAT_DATA_UINT32);
1980         kstat_named_init(&zmp->zm_nested_intp, "nested_interp",
1981             KSTAT_DATA_UINT32);
1982         kstat_named_init(&zmp->zm_init_pid, "init_pid", KSTAT_DATA_UINT32);
1983         kstat_named_init(&zmp->zm_boot_time, "boot_time", KSTAT_DATA_UINT64);
1984 
1985         ksp->ks_update = zone_misc_kstat_update;
1986         ksp->ks_private = zone;
1987 
1988         kstat_install(ksp);
1989         return (ksp);
1990 }
1991 
1992 static void
1993 zone_kstat_create(zone_t *zone)
1994 {
1995         zone->zone_lockedmem_kstat = zone_kstat_create_common(zone,
1996             "lockedmem", zone_lockedmem_kstat_update);
1997         zone->zone_swapresv_kstat = zone_kstat_create_common(zone,
1998             "swapresv", zone_swapresv_kstat_update);
1999         zone->zone_nprocs_kstat = zone_kstat_create_common(zone,
2000             "nprocs", zone_nprocs_kstat_update);
2001 
2002         if ((zone->zone_mcap_ksp = zone_mcap_kstat_create(zone)) == NULL) {
2003                 zone->zone_mcap_stats = kmem_zalloc(
2004                     sizeof (zone_mcap_kstat_t), KM_SLEEP);
2005         }
2006 
2007         if ((zone->zone_misc_ksp = zone_misc_kstat_create(zone)) == NULL) {
2008                 zone->zone_misc_stats = kmem_zalloc(
2009                     sizeof (zone_misc_kstat_t), KM_SLEEP);
2010         }
2011 }
2012 
2013 static void
2014 zone_kstat_delete_common(kstat_t **pkstat, size_t datasz)
2015 {
2016         void *data;
2017 
2018         if (*pkstat != NULL) {
2019                 data = (*pkstat)->ks_data;
2020                 kstat_delete(*pkstat);
2021                 kmem_free(data, datasz);
2022                 *pkstat = NULL;
2023         }
2024 }
2025 
2026 static void
2027 zone_kstat_delete(zone_t *zone)
2028 {
2029         zone_kstat_delete_common(&zone->zone_lockedmem_kstat,
2030             sizeof (zone_kstat_t));
2031         zone_kstat_delete_common(&zone->zone_swapresv_kstat,
2032             sizeof (zone_kstat_t));
2033         zone_kstat_delete_common(&zone->zone_nprocs_kstat,
2034             sizeof (zone_kstat_t));
2035         zone_kstat_delete_common(&zone->zone_mcap_ksp,
2036             sizeof (zone_mcap_kstat_t));
2037         zone_kstat_delete_common(&zone->zone_misc_ksp,
2038             sizeof (zone_misc_kstat_t));
2039 }
2040 
2041 /*
2042  * Called very early on in boot to initialize the ZSD list so that
2043  * zone_key_create() can be called before zone_init().  It also initializes
2044  * portions of zone0 which may be used before zone_init() is called.  The
2045  * variable "global_zone" will be set when zone0 is fully initialized by
2046  * zone_init().
2047  */
2048 void
2049 zone_zsd_init(void)
2050 {
2051         mutex_init(&zonehash_lock, NULL, MUTEX_DEFAULT, NULL);
2052         mutex_init(&zsd_key_lock, NULL, MUTEX_DEFAULT, NULL);
2053         list_create(&zsd_registered_keys, sizeof (struct zsd_entry),
2054             offsetof(struct zsd_entry, zsd_linkage));
2055         list_create(&zone_active, sizeof (zone_t),
2056             offsetof(zone_t, zone_linkage));
2057         list_create(&zone_deathrow, sizeof (zone_t),
2058             offsetof(zone_t, zone_linkage));
2059 
2060         mutex_init(&zone0.zone_lock, NULL, MUTEX_DEFAULT, NULL);
2061         mutex_init(&zone0.zone_nlwps_lock, NULL, MUTEX_DEFAULT, NULL);
2062         mutex_init(&zone0.zone_mem_lock, NULL, MUTEX_DEFAULT, NULL);
2063         zone0.zone_shares = 1;
2064         zone0.zone_nlwps = 0;
2065         zone0.zone_nlwps_ctl = INT_MAX;
2066         zone0.zone_nprocs = 0;
2067         zone0.zone_nprocs_ctl = INT_MAX;
2068         zone0.zone_locked_mem = 0;
2069         zone0.zone_locked_mem_ctl = UINT64_MAX;
2070         ASSERT(zone0.zone_max_swap == 0);
2071         zone0.zone_max_swap_ctl = UINT64_MAX;
2072         zone0.zone_max_lofi = 0;
2073         zone0.zone_max_lofi_ctl = UINT64_MAX;
2074         zone0.zone_shmmax = 0;
2075         zone0.zone_ipc.ipcq_shmmni = 0;
2076         zone0.zone_ipc.ipcq_semmni = 0;
2077         zone0.zone_ipc.ipcq_msgmni = 0;
2078         zone0.zone_name = GLOBAL_ZONENAME;
2079         zone0.zone_nodename = utsname.nodename;
2080         zone0.zone_domain = srpc_domain;
2081         zone0.zone_hostid = HW_INVALID_HOSTID;
2082         zone0.zone_fs_allowed = NULL;
2083         psecflags_default(&zone0.zone_secflags);
2084         zone0.zone_ref = 1;
2085         zone0.zone_id = GLOBAL_ZONEID;
2086         zone0.zone_status = ZONE_IS_RUNNING;
2087         zone0.zone_rootpath = "/";
2088         zone0.zone_rootpathlen = 2;
2089         zone0.zone_psetid = ZONE_PS_INVAL;
2090         zone0.zone_ncpus = 0;
2091         zone0.zone_ncpus_online = 0;
2092         zone0.zone_proc_initpid = 1;
2093         zone0.zone_initname = initname;
2094         zone0.zone_lockedmem_kstat = NULL;
2095         zone0.zone_swapresv_kstat = NULL;
2096         zone0.zone_nprocs_kstat = NULL;
2097 
2098         zone0.zone_stime = 0;
2099         zone0.zone_utime = 0;
2100         zone0.zone_wtime = 0;
2101 
2102         list_create(&zone0.zone_ref_list, sizeof (zone_ref_t),
2103             offsetof(zone_ref_t, zref_linkage));
2104         list_create(&zone0.zone_zsd, sizeof (struct zsd_entry),
2105             offsetof(struct zsd_entry, zsd_linkage));
2106         list_insert_head(&zone_active, &zone0);
2107 
2108         /*
2109          * The root filesystem is not mounted yet, so zone_rootvp cannot be set
2110          * to anything meaningful.  It is assigned to be 'rootdir' in
2111          * vfs_mountroot().
2112          */
2113         zone0.zone_rootvp = NULL;
2114         zone0.zone_vfslist = NULL;
2115         zone0.zone_bootargs = initargs;
2116         zone0.zone_privset = kmem_alloc(sizeof (priv_set_t), KM_SLEEP);
2117         /*
2118          * The global zone has all privileges
2119          */
2120         priv_fillset(zone0.zone_privset);
2121         /*
2122          * Add p0 to the global zone
2123          */
2124         zone0.zone_zsched = &p0;
2125         p0.p_zone = &zone0;
2126 }
2127 
2128 /*
2129  * Compute a hash value based on the contents of the label and the DOI.  The
2130  * hash algorithm is somewhat arbitrary, but is based on the observation that
2131  * humans will likely pick labels that differ by amounts that work out to be
2132  * multiples of the number of hash chains, and thus stirring in some primes
2133  * should help.
2134  */
2135 static uint_t
2136 hash_bylabel(void *hdata, mod_hash_key_t key)
2137 {
2138         const ts_label_t *lab = (ts_label_t *)key;
2139         const uint32_t *up, *ue;
2140         uint_t hash;
2141         int i;
2142 
2143         _NOTE(ARGUNUSED(hdata));
2144 
2145         hash = lab->tsl_doi + (lab->tsl_doi << 1);
2146         /* we depend on alignment of label, but not representation */
2147         up = (const uint32_t *)&lab->tsl_label;
2148         ue = up + sizeof (lab->tsl_label) / sizeof (*up);
2149         i = 1;
2150         while (up < ue) {
2151                 /* using 2^n + 1, 1 <= n <= 16 as source of many primes */
2152                 hash += *up + (*up << ((i % 16) + 1));
2153                 up++;
2154                 i++;
2155         }
2156         return (hash);
2157 }
2158 
2159 /*
2160  * All that mod_hash cares about here is zero (equal) versus non-zero (not
2161  * equal).  This may need to be changed if less than / greater than is ever
2162  * needed.
2163  */
2164 static int
2165 hash_labelkey_cmp(mod_hash_key_t key1, mod_hash_key_t key2)
2166 {
2167         ts_label_t *lab1 = (ts_label_t *)key1;
2168         ts_label_t *lab2 = (ts_label_t *)key2;
2169 
2170         return (label_equal(lab1, lab2) ? 0 : 1);
2171 }
2172 
2173 /*
2174  * Called by main() to initialize the zones framework.
2175  */
2176 void
2177 zone_init(void)
2178 {
2179         rctl_dict_entry_t *rde;
2180         rctl_val_t *dval;
2181         rctl_set_t *set;
2182         rctl_alloc_gp_t *gp;
2183         rctl_entity_p_t e;
2184         int res;
2185 
2186         ASSERT(curproc == &p0);
2187 
2188         /*
2189          * Create ID space for zone IDs.  ID 0 is reserved for the
2190          * global zone.
2191          */
2192         zoneid_space = id_space_create("zoneid_space", 1, MAX_ZONEID);
2193 
2194         /*
2195          * Initialize generic zone resource controls, if any.
2196          */
2197         rc_zone_cpu_shares = rctl_register("zone.cpu-shares",
2198             RCENTITY_ZONE, RCTL_GLOBAL_SIGNAL_NEVER | RCTL_GLOBAL_DENY_NEVER |
2199             RCTL_GLOBAL_NOBASIC | RCTL_GLOBAL_COUNT | RCTL_GLOBAL_SYSLOG_NEVER,
2200             FSS_MAXSHARES, FSS_MAXSHARES, &zone_cpu_shares_ops);
2201 
2202         rc_zone_cpu_cap = rctl_register("zone.cpu-cap",
2203             RCENTITY_ZONE, RCTL_GLOBAL_SIGNAL_NEVER | RCTL_GLOBAL_DENY_ALWAYS |
2204             RCTL_GLOBAL_NOBASIC | RCTL_GLOBAL_COUNT |RCTL_GLOBAL_SYSLOG_NEVER |
2205             RCTL_GLOBAL_INFINITE,
2206             MAXCAP, MAXCAP, &zone_cpu_cap_ops);
2207 
2208         rc_zone_nlwps = rctl_register("zone.max-lwps", RCENTITY_ZONE,
2209             RCTL_GLOBAL_NOACTION | RCTL_GLOBAL_NOBASIC | RCTL_GLOBAL_COUNT,
2210             INT_MAX, INT_MAX, &zone_lwps_ops);
2211 
2212         rc_zone_nprocs = rctl_register("zone.max-processes", RCENTITY_ZONE,
2213             RCTL_GLOBAL_NOACTION | RCTL_GLOBAL_NOBASIC | RCTL_GLOBAL_COUNT,
2214             INT_MAX, INT_MAX, &zone_procs_ops);
2215 
2216         /*
2217          * System V IPC resource controls
2218          */
2219         rc_zone_msgmni = rctl_register("zone.max-msg-ids",
2220             RCENTITY_ZONE, RCTL_GLOBAL_DENY_ALWAYS | RCTL_GLOBAL_NOBASIC |
2221             RCTL_GLOBAL_COUNT, IPC_IDS_MAX, IPC_IDS_MAX, &zone_msgmni_ops);
2222 
2223         rc_zone_semmni = rctl_register("zone.max-sem-ids",
2224             RCENTITY_ZONE, RCTL_GLOBAL_DENY_ALWAYS | RCTL_GLOBAL_NOBASIC |
2225             RCTL_GLOBAL_COUNT, IPC_IDS_MAX, IPC_IDS_MAX, &zone_semmni_ops);
2226 
2227         rc_zone_shmmni = rctl_register("zone.max-shm-ids",
2228             RCENTITY_ZONE, RCTL_GLOBAL_DENY_ALWAYS | RCTL_GLOBAL_NOBASIC |
2229             RCTL_GLOBAL_COUNT, IPC_IDS_MAX, IPC_IDS_MAX, &zone_shmmni_ops);
2230 
2231         rc_zone_shmmax = rctl_register("zone.max-shm-memory",
2232             RCENTITY_ZONE, RCTL_GLOBAL_DENY_ALWAYS | RCTL_GLOBAL_NOBASIC |
2233             RCTL_GLOBAL_BYTES, UINT64_MAX, UINT64_MAX, &zone_shmmax_ops);
2234 
2235         /*
2236          * Create a rctl_val with PRIVILEGED, NOACTION, value = 1.  Then attach
2237          * this at the head of the rctl_dict_entry for ``zone.cpu-shares''.
2238          */
2239         dval = kmem_cache_alloc(rctl_val_cache, KM_SLEEP);
2240         bzero(dval, sizeof (rctl_val_t));
2241         dval->rcv_value = 1;
2242         dval->rcv_privilege = RCPRIV_PRIVILEGED;
2243         dval->rcv_flagaction = RCTL_LOCAL_NOACTION;
2244         dval->rcv_action_recip_pid = -1;
2245 
2246         rde = rctl_dict_lookup("zone.cpu-shares");
2247         (void) rctl_val_list_insert(&rde->rcd_default_value, dval);
2248 
2249         rc_zone_locked_mem = rctl_register("zone.max-locked-memory",
2250             RCENTITY_ZONE, RCTL_GLOBAL_NOBASIC | RCTL_GLOBAL_BYTES |
2251             RCTL_GLOBAL_DENY_ALWAYS, UINT64_MAX, UINT64_MAX,
2252             &zone_locked_mem_ops);
2253 
2254         rc_zone_max_swap = rctl_register("zone.max-swap",
2255             RCENTITY_ZONE, RCTL_GLOBAL_NOBASIC | RCTL_GLOBAL_BYTES |
2256             RCTL_GLOBAL_DENY_ALWAYS, UINT64_MAX, UINT64_MAX,
2257             &zone_max_swap_ops);
2258 
2259         rc_zone_max_lofi = rctl_register("zone.max-lofi",
2260             RCENTITY_ZONE, RCTL_GLOBAL_NOBASIC | RCTL_GLOBAL_COUNT |
2261             RCTL_GLOBAL_DENY_ALWAYS, UINT64_MAX, UINT64_MAX,
2262             &zone_max_lofi_ops);
2263 
2264         /*
2265          * Initialize the ``global zone''.
2266          */
2267         set = rctl_set_create();
2268         gp = rctl_set_init_prealloc(RCENTITY_ZONE);
2269         mutex_enter(&p0.p_lock);
2270         e.rcep_p.zone = &zone0;
2271         e.rcep_t = RCENTITY_ZONE;
2272         zone0.zone_rctls = rctl_set_init(RCENTITY_ZONE, &p0, &e, set,
2273             gp);
2274 
2275         zone0.zone_nlwps = p0.p_lwpcnt;
2276         zone0.zone_nprocs = 1;
2277         zone0.zone_ntasks = 1;
2278         mutex_exit(&p0.p_lock);
2279         zone0.zone_restart_init = B_TRUE;
2280         zone0.zone_brand = &native_brand;
2281         rctl_prealloc_destroy(gp);
2282         /*
2283          * pool_default hasn't been initialized yet, so we let pool_init()
2284          * take care of making sure the global zone is in the default pool.
2285          */
2286 
2287         /*
2288          * Initialize global zone kstats
2289          */
2290         zone_kstat_create(&zone0);
2291 
2292         /*
2293          * Initialize zone label.
2294          * mlp are initialized when tnzonecfg is loaded.
2295          */
2296         zone0.zone_slabel = l_admin_low;
2297         rw_init(&zone0.zone_mlps.mlpl_rwlock, NULL, RW_DEFAULT, NULL);
2298         label_hold(l_admin_low);
2299 
2300         /*
2301          * Initialise the lock for the database structure used by mntfs.
2302          */
2303         rw_init(&zone0.zone_mntfs_db_lock, NULL, RW_DEFAULT, NULL);
2304 
2305         mutex_enter(&zonehash_lock);
2306         zone_uniqid(&zone0);
2307         ASSERT(zone0.zone_uniqid == GLOBAL_ZONEUNIQID);
2308 
2309         zonehashbyid = mod_hash_create_idhash("zone_by_id", zone_hash_size,
2310             mod_hash_null_valdtor);
2311         zonehashbyname = mod_hash_create_strhash("zone_by_name",
2312             zone_hash_size, mod_hash_null_valdtor);
2313         /*
2314          * maintain zonehashbylabel only for labeled systems
2315          */
2316         if (is_system_labeled())
2317                 zonehashbylabel = mod_hash_create_extended("zone_by_label",
2318                     zone_hash_size, mod_hash_null_keydtor,
2319                     mod_hash_null_valdtor, hash_bylabel, NULL,
2320                     hash_labelkey_cmp, KM_SLEEP);
2321         zonecount = 1;
2322 
2323         (void) mod_hash_insert(zonehashbyid, (mod_hash_key_t)GLOBAL_ZONEID,
2324             (mod_hash_val_t)&zone0);
2325         (void) mod_hash_insert(zonehashbyname, (mod_hash_key_t)zone0.zone_name,
2326             (mod_hash_val_t)&zone0);
2327         if (is_system_labeled()) {
2328                 zone0.zone_flags |= ZF_HASHED_LABEL;
2329                 (void) mod_hash_insert(zonehashbylabel,
2330                     (mod_hash_key_t)zone0.zone_slabel, (mod_hash_val_t)&zone0);
2331         }
2332         mutex_exit(&zonehash_lock);
2333 
2334         /*
2335          * We avoid setting zone_kcred until now, since kcred is initialized
2336          * sometime after zone_zsd_init() and before zone_init().
2337          */
2338         zone0.zone_kcred = kcred;
2339         /*
2340          * The global zone is fully initialized (except for zone_rootvp which
2341          * will be set when the root filesystem is mounted).
2342          */
2343         global_zone = &zone0;
2344 
2345         /*
2346          * Setup an event channel to send zone status change notifications on
2347          */
2348         res = sysevent_evc_bind(ZONE_EVENT_CHANNEL, &zone_event_chan,
2349             EVCH_CREAT);
2350 
2351         if (res)
2352                 panic("Sysevent_evc_bind failed during zone setup.\n");
2353 
2354 }
2355 
2356 static void
2357 zone_free(zone_t *zone)
2358 {
2359         ASSERT(zone != global_zone);
2360         ASSERT(zone->zone_ntasks == 0);
2361         ASSERT(zone->zone_nlwps == 0);
2362         ASSERT(zone->zone_nprocs == 0);
2363         ASSERT(zone->zone_cred_ref == 0);
2364         ASSERT(zone->zone_kcred == NULL);
2365         ASSERT(zone_status_get(zone) == ZONE_IS_DEAD ||
2366             zone_status_get(zone) == ZONE_IS_UNINITIALIZED);
2367         ASSERT(list_is_empty(&zone->zone_ref_list));
2368 
2369         /*
2370          * Remove any zone caps.
2371          */
2372         cpucaps_zone_remove(zone);
2373 
2374         ASSERT(zone->zone_cpucap == NULL);
2375 
2376         /* remove from deathrow list */
2377         if (zone_status_get(zone) == ZONE_IS_DEAD) {
2378                 ASSERT(zone->zone_ref == 0);
2379                 mutex_enter(&zone_deathrow_lock);
2380                 list_remove(&zone_deathrow, zone);
2381                 mutex_exit(&zone_deathrow_lock);
2382         }
2383 
2384         list_destroy(&zone->zone_ref_list);
2385         zone_free_zsd(zone);
2386         zone_free_datasets(zone);
2387         list_destroy(&zone->zone_dl_list);
2388 
2389         if (zone->zone_rootvp != NULL)
2390                 VN_RELE(zone->zone_rootvp);
2391         if (zone->zone_rootpath)
2392                 kmem_free(zone->zone_rootpath, zone->zone_rootpathlen);
2393         if (zone->zone_name != NULL)
2394                 kmem_free(zone->zone_name, ZONENAME_MAX);
2395         if (zone->zone_slabel != NULL)
2396                 label_rele(zone->zone_slabel);
2397         if (zone->zone_nodename != NULL)
2398                 kmem_free(zone->zone_nodename, _SYS_NMLN);
2399         if (zone->zone_domain != NULL)
2400                 kmem_free(zone->zone_domain, _SYS_NMLN);
2401         if (zone->zone_privset != NULL)
2402                 kmem_free(zone->zone_privset, sizeof (priv_set_t));
2403         if (zone->zone_rctls != NULL)
2404                 rctl_set_free(zone->zone_rctls);
2405         if (zone->zone_bootargs != NULL)
2406                 strfree(zone->zone_bootargs);
2407         if (zone->zone_initname != NULL)
2408                 strfree(zone->zone_initname);
2409         if (zone->zone_fs_allowed != NULL)
2410                 strfree(zone->zone_fs_allowed);
2411         if (zone->zone_pfexecd != NULL)
2412                 klpd_freelist(&zone->zone_pfexecd);
2413         id_free(zoneid_space, zone->zone_id);
2414         mutex_destroy(&zone->zone_lock);
2415         cv_destroy(&zone->zone_cv);
2416         rw_destroy(&zone->zone_mlps.mlpl_rwlock);
2417         rw_destroy(&zone->zone_mntfs_db_lock);
2418         kmem_free(zone, sizeof (zone_t));
2419 }
2420 
2421 /*
2422  * See block comment at the top of this file for information about zone
2423  * status values.
2424  */
2425 /*
2426  * Convenience function for setting zone status.
2427  */
2428 static void
2429 zone_status_set(zone_t *zone, zone_status_t status)
2430 {
2431 
2432         nvlist_t *nvl = NULL;
2433         ASSERT(MUTEX_HELD(&zone_status_lock));
2434         ASSERT(status > ZONE_MIN_STATE && status <= ZONE_MAX_STATE &&
2435             status >= zone_status_get(zone));
2436 
2437         if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP) ||
2438             nvlist_add_string(nvl, ZONE_CB_NAME, zone->zone_name) ||
2439             nvlist_add_string(nvl, ZONE_CB_NEWSTATE,
2440             zone_status_table[status]) ||
2441             nvlist_add_string(nvl, ZONE_CB_OLDSTATE,
2442             zone_status_table[zone->zone_status]) ||
2443             nvlist_add_int32(nvl, ZONE_CB_ZONEID, zone->zone_id) ||
2444             nvlist_add_uint64(nvl, ZONE_CB_TIMESTAMP, (uint64_t)gethrtime()) ||
2445             sysevent_evc_publish(zone_event_chan, ZONE_EVENT_STATUS_CLASS,
2446             ZONE_EVENT_STATUS_SUBCLASS, "sun.com", "kernel", nvl, EVCH_SLEEP)) {
2447 #ifdef DEBUG
2448                 (void) printf(
2449                     "Failed to allocate and send zone state change event.\n");
2450 #endif
2451         }
2452         nvlist_free(nvl);
2453 
2454         zone->zone_status = status;
2455 
2456         cv_broadcast(&zone->zone_cv);
2457 }
2458 
2459 /*
2460  * Public function to retrieve the zone status.  The zone status may
2461  * change after it is retrieved.
2462  */
2463 zone_status_t
2464 zone_status_get(zone_t *zone)
2465 {
2466         return (zone->zone_status);
2467 }
2468 
2469 static int
2470 zone_set_bootargs(zone_t *zone, const char *zone_bootargs)
2471 {
2472         char *buf = kmem_zalloc(BOOTARGS_MAX, KM_SLEEP);
2473         int err = 0;
2474 
2475         ASSERT(zone != global_zone);
2476         if ((err = copyinstr(zone_bootargs, buf, BOOTARGS_MAX, NULL)) != 0)
2477                 goto done;      /* EFAULT or ENAMETOOLONG */
2478 
2479         if (zone->zone_bootargs != NULL)
2480                 strfree(zone->zone_bootargs);
2481 
2482         zone->zone_bootargs = strdup(buf);
2483 
2484 done:
2485         kmem_free(buf, BOOTARGS_MAX);
2486         return (err);
2487 }
2488 
2489 static int
2490 zone_set_brand(zone_t *zone, const char *brand)
2491 {
2492         struct brand_attr *attrp;
2493         brand_t *bp;
2494 
2495         attrp = kmem_alloc(sizeof (struct brand_attr), KM_SLEEP);
2496         if (copyin(brand, attrp, sizeof (struct brand_attr)) != 0) {
2497                 kmem_free(attrp, sizeof (struct brand_attr));
2498                 return (EFAULT);
2499         }
2500 
2501         bp = brand_register_zone(attrp);
2502         kmem_free(attrp, sizeof (struct brand_attr));
2503         if (bp == NULL)
2504                 return (EINVAL);
2505 
2506         /*
2507          * This is the only place where a zone can change it's brand.
2508          * We already need to hold zone_status_lock to check the zone
2509          * status, so we'll just use that lock to serialize zone
2510          * branding requests as well.
2511          */
2512         mutex_enter(&zone_status_lock);
2513 
2514         /* Re-Branding is not allowed and the zone can't be booted yet */
2515         if ((ZONE_IS_BRANDED(zone)) ||
2516             (zone_status_get(zone) >= ZONE_IS_BOOTING)) {
2517                 mutex_exit(&zone_status_lock);
2518                 brand_unregister_zone(bp);
2519                 return (EINVAL);
2520         }
2521 
2522         /* set up the brand specific data */
2523         zone->zone_brand = bp;
2524         ZBROP(zone)->b_init_brand_data(zone);
2525 
2526         mutex_exit(&zone_status_lock);
2527         return (0);
2528 }
2529 
2530 static int
2531 zone_set_secflags(zone_t *zone, const psecflags_t *zone_secflags)
2532 {
2533         int err = 0;
2534         psecflags_t psf;
2535 
2536         ASSERT(zone != global_zone);
2537 
2538         if ((err = copyin(zone_secflags, &psf, sizeof (psf))) != 0)
2539                 return (err);
2540 
2541         if (zone_status_get(zone) > ZONE_IS_READY)
2542                 return (EINVAL);
2543 
2544         if (!psecflags_validate(&psf))
2545                 return (EINVAL);
2546 
2547         (void) memcpy(&zone->zone_secflags, &psf, sizeof (psf));
2548 
2549         /* Set security flags on the zone's zsched */
2550         (void) memcpy(&zone->zone_zsched->p_secflags, &zone->zone_secflags,
2551             sizeof (zone->zone_zsched->p_secflags));
2552 
2553         return (0);
2554 }
2555 
2556 static int
2557 zone_set_fs_allowed(zone_t *zone, const char *zone_fs_allowed)
2558 {
2559         char *buf = kmem_zalloc(ZONE_FS_ALLOWED_MAX, KM_SLEEP);
2560         int err = 0;
2561 
2562         ASSERT(zone != global_zone);
2563         if ((err = copyinstr(zone_fs_allowed, buf,
2564             ZONE_FS_ALLOWED_MAX, NULL)) != 0)
2565                 goto done;
2566 
2567         if (zone->zone_fs_allowed != NULL)
2568                 strfree(zone->zone_fs_allowed);
2569 
2570         zone->zone_fs_allowed = strdup(buf);
2571 
2572 done:
2573         kmem_free(buf, ZONE_FS_ALLOWED_MAX);
2574         return (err);
2575 }
2576 
2577 static int
2578 zone_set_initname(zone_t *zone, const char *zone_initname)
2579 {
2580         char initname[INITNAME_SZ];
2581         size_t len;
2582         int err = 0;
2583 
2584         ASSERT(zone != global_zone);
2585         if ((err = copyinstr(zone_initname, initname, INITNAME_SZ, &len)) != 0)
2586                 return (err);   /* EFAULT or ENAMETOOLONG */
2587 
2588         if (zone->zone_initname != NULL)
2589                 strfree(zone->zone_initname);
2590 
2591         zone->zone_initname = kmem_alloc(strlen(initname) + 1, KM_SLEEP);
2592         (void) strcpy(zone->zone_initname, initname);
2593         return (0);
2594 }
2595 
2596 static int
2597 zone_set_phys_mcap(zone_t *zone, const uint64_t *zone_mcap)
2598 {
2599         uint64_t mcap;
2600         int err = 0;
2601 
2602         if ((err = copyin(zone_mcap, &mcap, sizeof (uint64_t))) == 0)
2603                 zone->zone_phys_mcap = mcap;
2604 
2605         return (err);
2606 }
2607 
2608 static int
2609 zone_set_sched_class(zone_t *zone, const char *new_class)
2610 {
2611         char sched_class[PC_CLNMSZ];
2612         id_t classid;
2613         int err;
2614 
2615         ASSERT(zone != global_zone);
2616         if ((err = copyinstr(new_class, sched_class, PC_CLNMSZ, NULL)) != 0)
2617                 return (err);   /* EFAULT or ENAMETOOLONG */
2618 
2619         if (getcid(sched_class, &classid) != 0 || CLASS_KERNEL(classid))
2620                 return (set_errno(EINVAL));
2621         zone->zone_defaultcid = classid;
2622         ASSERT(zone->zone_defaultcid > 0 &&
2623             zone->zone_defaultcid < loaded_classes);
2624 
2625         return (0);
2626 }
2627 
2628 /*
2629  * Block indefinitely waiting for (zone_status >= status)
2630  */
2631 void
2632 zone_status_wait(zone_t *zone, zone_status_t status)
2633 {
2634         ASSERT(status > ZONE_MIN_STATE && status <= ZONE_MAX_STATE);
2635 
2636         mutex_enter(&zone_status_lock);
2637         while (zone->zone_status < status) {
2638                 cv_wait(&zone->zone_cv, &zone_status_lock);
2639         }
2640         mutex_exit(&zone_status_lock);
2641 }
2642 
2643 /*
2644  * Private CPR-safe version of zone_status_wait().
2645  */
2646 static void
2647 zone_status_wait_cpr(zone_t *zone, zone_status_t status, char *str)
2648 {
2649         callb_cpr_t cprinfo;
2650 
2651         ASSERT(status > ZONE_MIN_STATE && status <= ZONE_MAX_STATE);
2652 
2653         CALLB_CPR_INIT(&cprinfo, &zone_status_lock, callb_generic_cpr,
2654             str);
2655         mutex_enter(&zone_status_lock);
2656         while (zone->zone_status < status) {
2657                 CALLB_CPR_SAFE_BEGIN(&cprinfo);
2658                 cv_wait(&zone->zone_cv, &zone_status_lock);
2659                 CALLB_CPR_SAFE_END(&cprinfo, &zone_status_lock);
2660         }
2661         /*
2662          * zone_status_lock is implicitly released by the following.
2663          */
2664         CALLB_CPR_EXIT(&cprinfo);
2665 }
2666 
2667 /*
2668  * Block until zone enters requested state or signal is received.  Return (0)
2669  * if signaled, non-zero otherwise.
2670  */
2671 int
2672 zone_status_wait_sig(zone_t *zone, zone_status_t status)
2673 {
2674         ASSERT(status > ZONE_MIN_STATE && status <= ZONE_MAX_STATE);
2675 
2676         mutex_enter(&zone_status_lock);
2677         while (zone->zone_status < status) {
2678                 if (!cv_wait_sig(&zone->zone_cv, &zone_status_lock)) {
2679                         mutex_exit(&zone_status_lock);
2680                         return (0);
2681                 }
2682         }
2683         mutex_exit(&zone_status_lock);
2684         return (1);
2685 }
2686 
2687 /*
2688  * Block until the zone enters the requested state or the timeout expires,
2689  * whichever happens first.  Return (-1) if operation timed out, time remaining
2690  * otherwise.
2691  */
2692 clock_t
2693 zone_status_timedwait(zone_t *zone, clock_t tim, zone_status_t status)
2694 {
2695         clock_t timeleft = 0;
2696 
2697         ASSERT(status > ZONE_MIN_STATE && status <= ZONE_MAX_STATE);
2698 
2699         mutex_enter(&zone_status_lock);
2700         while (zone->zone_status < status && timeleft != -1) {
2701                 timeleft = cv_timedwait(&zone->zone_cv, &zone_status_lock, tim);
2702         }
2703         mutex_exit(&zone_status_lock);
2704         return (timeleft);
2705 }
2706 
2707 /*
2708  * Block until the zone enters the requested state, the current process is
2709  * signaled,  or the timeout expires, whichever happens first.  Return (-1) if
2710  * operation timed out, 0 if signaled, time remaining otherwise.
2711  */
2712 clock_t
2713 zone_status_timedwait_sig(zone_t *zone, clock_t tim, zone_status_t status)
2714 {
2715         clock_t timeleft = tim - ddi_get_lbolt();
2716 
2717         ASSERT(status > ZONE_MIN_STATE && status <= ZONE_MAX_STATE);
2718 
2719         mutex_enter(&zone_status_lock);
2720         while (zone->zone_status < status) {
2721                 timeleft = cv_timedwait_sig(&zone->zone_cv, &zone_status_lock,
2722                     tim);
2723                 if (timeleft <= 0)
2724                         break;
2725         }
2726         mutex_exit(&zone_status_lock);
2727         return (timeleft);
2728 }
2729 
2730 /*
2731  * Zones have two reference counts: one for references from credential
2732  * structures (zone_cred_ref), and one (zone_ref) for everything else.
2733  * This is so we can allow a zone to be rebooted while there are still
2734  * outstanding cred references, since certain drivers cache dblks (which
2735  * implicitly results in cached creds).  We wait for zone_ref to drop to
2736  * 0 (actually 1), but not zone_cred_ref.  The zone structure itself is
2737  * later freed when the zone_cred_ref drops to 0, though nothing other
2738  * than the zone id and privilege set should be accessed once the zone
2739  * is "dead".
2740  *
2741  * A debugging flag, zone_wait_for_cred, can be set to a non-zero value
2742  * to force halt/reboot to block waiting for the zone_cred_ref to drop
2743  * to 0.  This can be useful to flush out other sources of cached creds
2744  * that may be less innocuous than the driver case.
2745  *
2746  * Zones also provide a tracked reference counting mechanism in which zone
2747  * references are represented by "crumbs" (zone_ref structures).  Crumbs help
2748  * debuggers determine the sources of leaked zone references.  See
2749  * zone_hold_ref() and zone_rele_ref() below for more information.
2750  */
2751 
2752 int zone_wait_for_cred = 0;
2753 
2754 static void
2755 zone_hold_locked(zone_t *z)
2756 {
2757         ASSERT(MUTEX_HELD(&z->zone_lock));
2758         z->zone_ref++;
2759         ASSERT(z->zone_ref != 0);
2760 }
2761 
2762 /*
2763  * Increment the specified zone's reference count.  The zone's zone_t structure
2764  * will not be freed as long as the zone's reference count is nonzero.
2765  * Decrement the zone's reference count via zone_rele().
2766  *
2767  * NOTE: This function should only be used to hold zones for short periods of
2768  * time.  Use zone_hold_ref() if the zone must be held for a long time.
2769  */
2770 void
2771 zone_hold(zone_t *z)
2772 {
2773         mutex_enter(&z->zone_lock);
2774         zone_hold_locked(z);
2775         mutex_exit(&z->zone_lock);
2776 }
2777 
2778 /*
2779  * If the non-cred ref count drops to 1 and either the cred ref count
2780  * is 0 or we aren't waiting for cred references, the zone is ready to
2781  * be destroyed.
2782  */
2783 #define ZONE_IS_UNREF(zone)     ((zone)->zone_ref == 1 && \
2784             (!zone_wait_for_cred || (zone)->zone_cred_ref == 0))
2785 
2786 /*
2787  * Common zone reference release function invoked by zone_rele() and
2788  * zone_rele_ref().  If subsys is ZONE_REF_NUM_SUBSYS, then the specified
2789  * zone's subsystem-specific reference counters are not affected by the
2790  * release.  If ref is not NULL, then the zone_ref_t to which it refers is
2791  * removed from the specified zone's reference list.  ref must be non-NULL iff
2792  * subsys is not ZONE_REF_NUM_SUBSYS.
2793  */
2794 static void
2795 zone_rele_common(zone_t *z, zone_ref_t *ref, zone_ref_subsys_t subsys)
2796 {
2797         boolean_t wakeup;
2798 
2799         mutex_enter(&z->zone_lock);
2800         ASSERT(z->zone_ref != 0);
2801         z->zone_ref--;
2802         if (subsys != ZONE_REF_NUM_SUBSYS) {
2803                 ASSERT(z->zone_subsys_ref[subsys] != 0);
2804                 z->zone_subsys_ref[subsys]--;
2805                 list_remove(&z->zone_ref_list, ref);
2806         }
2807         if (z->zone_ref == 0 && z->zone_cred_ref == 0) {
2808                 /* no more refs, free the structure */
2809                 mutex_exit(&z->zone_lock);
2810                 zone_free(z);
2811                 return;
2812         }
2813         /* signal zone_destroy so the zone can finish halting */
2814         wakeup = (ZONE_IS_UNREF(z) && zone_status_get(z) >= ZONE_IS_DEAD);
2815         mutex_exit(&z->zone_lock);
2816 
2817         if (wakeup) {
2818                 /*
2819                  * Grabbing zonehash_lock here effectively synchronizes with
2820                  * zone_destroy() to avoid missed signals.
2821                  */
2822                 mutex_enter(&zonehash_lock);
2823                 cv_broadcast(&zone_destroy_cv);
2824                 mutex_exit(&zonehash_lock);
2825         }
2826 }
2827 
2828 /*
2829  * Decrement the specified zone's reference count.  The specified zone will
2830  * cease to exist after this function returns if the reference count drops to
2831  * zero.  This function should be paired with zone_hold().
2832  */
2833 void
2834 zone_rele(zone_t *z)
2835 {
2836         zone_rele_common(z, NULL, ZONE_REF_NUM_SUBSYS);
2837 }
2838 
2839 /*
2840  * Initialize a zone reference structure.  This function must be invoked for
2841  * a reference structure before the structure is passed to zone_hold_ref().
2842  */
2843 void
2844 zone_init_ref(zone_ref_t *ref)
2845 {
2846         ref->zref_zone = NULL;
2847         list_link_init(&ref->zref_linkage);
2848 }
2849 
2850 /*
2851  * Acquire a reference to zone z.  The caller must specify the
2852  * zone_ref_subsys_t constant associated with its subsystem.  The specified
2853  * zone_ref_t structure will represent a reference to the specified zone.  Use
2854  * zone_rele_ref() to release the reference.
2855  *
2856  * The referenced zone_t structure will not be freed as long as the zone_t's
2857  * zone_status field is not ZONE_IS_DEAD and the zone has outstanding
2858  * references.
2859  *
2860  * NOTE: The zone_ref_t structure must be initialized before it is used.
2861  * See zone_init_ref() above.
2862  */
2863 void
2864 zone_hold_ref(zone_t *z, zone_ref_t *ref, zone_ref_subsys_t subsys)
2865 {
2866         ASSERT(subsys >= 0 && subsys < ZONE_REF_NUM_SUBSYS);
2867 
2868         /*
2869          * Prevent consumers from reusing a reference structure before
2870          * releasing it.
2871          */
2872         VERIFY(ref->zref_zone == NULL);
2873 
2874         ref->zref_zone = z;
2875         mutex_enter(&z->zone_lock);
2876         zone_hold_locked(z);
2877         z->zone_subsys_ref[subsys]++;
2878         ASSERT(z->zone_subsys_ref[subsys] != 0);
2879         list_insert_head(&z->zone_ref_list, ref);
2880         mutex_exit(&z->zone_lock);
2881 }
2882 
2883 /*
2884  * Release the zone reference represented by the specified zone_ref_t.
2885  * The reference is invalid after it's released; however, the zone_ref_t
2886  * structure can be reused without having to invoke zone_init_ref().
2887  * subsys should be the same value that was passed to zone_hold_ref()
2888  * when the reference was acquired.
2889  */
2890 void
2891 zone_rele_ref(zone_ref_t *ref, zone_ref_subsys_t subsys)
2892 {
2893         zone_rele_common(ref->zref_zone, ref, subsys);
2894 
2895         /*
2896          * Set the zone_ref_t's zref_zone field to NULL to generate panics
2897          * when consumers dereference the reference.  This helps us catch
2898          * consumers who use released references.  Furthermore, this lets
2899          * consumers reuse the zone_ref_t structure without having to
2900          * invoke zone_init_ref().
2901          */
2902         ref->zref_zone = NULL;
2903 }
2904 
2905 void
2906 zone_cred_hold(zone_t *z)
2907 {
2908         mutex_enter(&z->zone_lock);
2909         z->zone_cred_ref++;
2910         ASSERT(z->zone_cred_ref != 0);
2911         mutex_exit(&z->zone_lock);
2912 }
2913 
2914 void
2915 zone_cred_rele(zone_t *z)
2916 {
2917         boolean_t wakeup;
2918 
2919         mutex_enter(&z->zone_lock);
2920         ASSERT(z->zone_cred_ref != 0);
2921         z->zone_cred_ref--;
2922         if (z->zone_ref == 0 && z->zone_cred_ref == 0) {
2923                 /* no more refs, free the structure */
2924                 mutex_exit(&z->zone_lock);
2925                 zone_free(z);
2926                 return;
2927         }
2928         /*
2929          * If zone_destroy is waiting for the cred references to drain
2930          * out, and they have, signal it.
2931          */
2932         wakeup = (zone_wait_for_cred && ZONE_IS_UNREF(z) &&
2933             zone_status_get(z) >= ZONE_IS_DEAD);
2934         mutex_exit(&z->zone_lock);
2935 
2936         if (wakeup) {
2937                 /*
2938                  * Grabbing zonehash_lock here effectively synchronizes with
2939                  * zone_destroy() to avoid missed signals.
2940                  */
2941                 mutex_enter(&zonehash_lock);
2942                 cv_broadcast(&zone_destroy_cv);
2943                 mutex_exit(&zonehash_lock);
2944         }
2945 }
2946 
2947 void
2948 zone_task_hold(zone_t *z)
2949 {
2950         mutex_enter(&z->zone_lock);
2951         z->zone_ntasks++;
2952         ASSERT(z->zone_ntasks != 0);
2953         mutex_exit(&z->zone_lock);
2954 }
2955 
2956 void
2957 zone_task_rele(zone_t *zone)
2958 {
2959         uint_t refcnt;
2960 
2961         mutex_enter(&zone->zone_lock);
2962         ASSERT(zone->zone_ntasks != 0);
2963         refcnt = --zone->zone_ntasks;
2964         if (refcnt > 1)      {       /* Common case */
2965                 mutex_exit(&zone->zone_lock);
2966                 return;
2967         }
2968         zone_hold_locked(zone); /* so we can use the zone_t later */
2969         mutex_exit(&zone->zone_lock);
2970         if (refcnt == 1) {
2971                 /*
2972                  * See if the zone is shutting down.
2973                  */
2974                 mutex_enter(&zone_status_lock);
2975                 if (zone_status_get(zone) != ZONE_IS_SHUTTING_DOWN) {
2976                         goto out;
2977                 }
2978 
2979                 /*
2980                  * Make sure the ntasks didn't change since we
2981                  * dropped zone_lock.
2982                  */
2983                 mutex_enter(&zone->zone_lock);
2984                 if (refcnt != zone->zone_ntasks) {
2985                         mutex_exit(&zone->zone_lock);
2986                         goto out;
2987                 }
2988                 mutex_exit(&zone->zone_lock);
2989 
2990                 /*
2991                  * No more user processes in the zone.  The zone is empty.
2992                  */
2993                 zone_status_set(zone, ZONE_IS_EMPTY);
2994                 goto out;
2995         }
2996 
2997         ASSERT(refcnt == 0);
2998         /*
2999          * zsched has exited; the zone is dead.
3000          */
3001         zone->zone_zsched = NULL;            /* paranoia */
3002         mutex_enter(&zone_status_lock);
3003         zone_status_set(zone, ZONE_IS_DEAD);
3004 out:
3005         mutex_exit(&zone_status_lock);
3006         zone_rele(zone);
3007 }
3008 
3009 zoneid_t
3010 getzoneid(void)
3011 {
3012         return (curproc->p_zone->zone_id);
3013 }
3014 
3015 /*
3016  * Internal versions of zone_find_by_*().  These don't zone_hold() or
3017  * check the validity of a zone's state.
3018  */
3019 static zone_t *
3020 zone_find_all_by_id(zoneid_t zoneid)
3021 {
3022         mod_hash_val_t hv;
3023         zone_t *zone = NULL;
3024 
3025         ASSERT(MUTEX_HELD(&zonehash_lock));
3026 
3027         if (mod_hash_find(zonehashbyid,
3028             (mod_hash_key_t)(uintptr_t)zoneid, &hv) == 0)
3029                 zone = (zone_t *)hv;
3030         return (zone);
3031 }
3032 
3033 static zone_t *
3034 zone_find_all_by_label(const ts_label_t *label)
3035 {
3036         mod_hash_val_t hv;
3037         zone_t *zone = NULL;
3038 
3039         ASSERT(MUTEX_HELD(&zonehash_lock));
3040 
3041         /*
3042          * zonehashbylabel is not maintained for unlabeled systems
3043          */
3044         if (!is_system_labeled())
3045                 return (NULL);
3046         if (mod_hash_find(zonehashbylabel, (mod_hash_key_t)label, &hv) == 0)
3047                 zone = (zone_t *)hv;
3048         return (zone);
3049 }
3050 
3051 static zone_t *
3052 zone_find_all_by_name(char *name)
3053 {
3054         mod_hash_val_t hv;
3055         zone_t *zone = NULL;
3056 
3057         ASSERT(MUTEX_HELD(&zonehash_lock));
3058 
3059         if (mod_hash_find(zonehashbyname, (mod_hash_key_t)name, &hv) == 0)
3060                 zone = (zone_t *)hv;
3061         return (zone);
3062 }
3063 
3064 /*
3065  * Public interface for looking up a zone by zoneid.  Only returns the zone if
3066  * it is fully initialized, and has not yet begun the zone_destroy() sequence.
3067  * Caller must call zone_rele() once it is done with the zone.
3068  *
3069  * The zone may begin the zone_destroy() sequence immediately after this
3070  * function returns, but may be safely used until zone_rele() is called.
3071  */
3072 zone_t *
3073 zone_find_by_id(zoneid_t zoneid)
3074 {
3075         zone_t *zone;
3076         zone_status_t status;
3077 
3078         mutex_enter(&zonehash_lock);
3079         if ((zone = zone_find_all_by_id(zoneid)) == NULL) {
3080                 mutex_exit(&zonehash_lock);
3081                 return (NULL);
3082         }
3083         status = zone_status_get(zone);
3084         if (status < ZONE_IS_READY || status > ZONE_IS_DOWN) {
3085                 /*
3086                  * For all practical purposes the zone doesn't exist.
3087                  */
3088                 mutex_exit(&zonehash_lock);
3089                 return (NULL);
3090         }
3091         zone_hold(zone);
3092         mutex_exit(&zonehash_lock);
3093         return (zone);
3094 }
3095 
3096 /*
3097  * Similar to zone_find_by_id, but using zone label as the key.
3098  */
3099 zone_t *
3100 zone_find_by_label(const ts_label_t *label)
3101 {
3102         zone_t *zone;
3103         zone_status_t status;
3104 
3105         mutex_enter(&zonehash_lock);
3106         if ((zone = zone_find_all_by_label(label)) == NULL) {
3107                 mutex_exit(&zonehash_lock);
3108                 return (NULL);
3109         }
3110 
3111         status = zone_status_get(zone);
3112         if (status > ZONE_IS_DOWN) {
3113                 /*
3114                  * For all practical purposes the zone doesn't exist.
3115                  */
3116                 mutex_exit(&zonehash_lock);
3117                 return (NULL);
3118         }
3119         zone_hold(zone);
3120         mutex_exit(&zonehash_lock);
3121         return (zone);
3122 }
3123 
3124 /*
3125  * Similar to zone_find_by_id, but using zone name as the key.
3126  */
3127 zone_t *
3128 zone_find_by_name(char *name)
3129 {
3130         zone_t *zone;
3131         zone_status_t status;
3132 
3133         mutex_enter(&zonehash_lock);
3134         if ((zone = zone_find_all_by_name(name)) == NULL) {
3135                 mutex_exit(&zonehash_lock);
3136                 return (NULL);
3137         }
3138         status = zone_status_get(zone);
3139         if (status < ZONE_IS_READY || status > ZONE_IS_DOWN) {
3140                 /*
3141                  * For all practical purposes the zone doesn't exist.
3142                  */
3143                 mutex_exit(&zonehash_lock);
3144                 return (NULL);
3145         }
3146         zone_hold(zone);
3147         mutex_exit(&zonehash_lock);
3148         return (zone);
3149 }
3150 
3151 /*
3152  * Similar to zone_find_by_id(), using the path as a key.  For instance,
3153  * if there is a zone "foo" rooted at /foo/root, and the path argument
3154  * is "/foo/root/proc", it will return the held zone_t corresponding to
3155  * zone "foo".
3156  *
3157  * zone_find_by_path() always returns a non-NULL value, since at the
3158  * very least every path will be contained in the global zone.
3159  *
3160  * As with the other zone_find_by_*() functions, the caller is
3161  * responsible for zone_rele()ing the return value of this function.
3162  */
3163 zone_t *
3164 zone_find_by_path(const char *path)
3165 {
3166         zone_t *zone;
3167         zone_t *zret = NULL;
3168         zone_status_t status;
3169 
3170         if (path == NULL) {
3171                 /*
3172                  * Call from rootconf().
3173                  */
3174                 zone_hold(global_zone);
3175                 return (global_zone);
3176         }
3177         ASSERT(*path == '/');
3178         mutex_enter(&zonehash_lock);
3179         for (zone = list_head(&zone_active); zone != NULL;
3180             zone = list_next(&zone_active, zone)) {
3181                 if (ZONE_PATH_VISIBLE(path, zone))
3182                         zret = zone;
3183         }
3184         ASSERT(zret != NULL);
3185         status = zone_status_get(zret);
3186         if (status < ZONE_IS_READY || status > ZONE_IS_DOWN) {
3187                 /*
3188                  * Zone practically doesn't exist.
3189                  */
3190                 zret = global_zone;
3191         }
3192         zone_hold(zret);
3193         mutex_exit(&zonehash_lock);
3194         return (zret);
3195 }
3196 
3197 /*
3198  * Public interface for updating per-zone load averages.  Called once per
3199  * second.
3200  *
3201  * Based on loadavg_update(), genloadavg() and calcloadavg() from clock.c.
3202  */
3203 void
3204 zone_loadavg_update()
3205 {
3206         zone_t *zp;
3207         zone_status_t status;
3208         struct loadavg_s *lavg;
3209         hrtime_t zone_total;
3210         int i;
3211         hrtime_t hr_avg;
3212         int nrun;
3213         static int64_t f[3] = { 135, 27, 9 };
3214         int64_t q, r;
3215 
3216         mutex_enter(&zonehash_lock);
3217         for (zp = list_head(&zone_active); zp != NULL;
3218             zp = list_next(&zone_active, zp)) {
3219                 mutex_enter(&zp->zone_lock);
3220 
3221                 /* Skip zones that are on the way down or not yet up */
3222                 status = zone_status_get(zp);
3223                 if (status < ZONE_IS_READY || status >= ZONE_IS_DOWN) {
3224                         /* For all practical purposes the zone doesn't exist. */
3225                         mutex_exit(&zp->zone_lock);
3226                         continue;
3227                 }
3228 
3229                 /*
3230                  * Update the 10 second moving average data in zone_loadavg.
3231                  */
3232                 lavg = &zp->zone_loadavg;
3233 
3234                 zone_total = zp->zone_utime + zp->zone_stime + zp->zone_wtime;
3235                 scalehrtime(&zone_total);
3236 
3237                 /* The zone_total should always be increasing. */
3238                 lavg->lg_loads[lavg->lg_cur] = (zone_total > lavg->lg_total) ?
3239                     zone_total - lavg->lg_total : 0;
3240                 lavg->lg_cur = (lavg->lg_cur + 1) % S_LOADAVG_SZ;
3241                 /* lg_total holds the prev. 1 sec. total */
3242                 lavg->lg_total = zone_total;
3243 
3244                 /*
3245                  * To simplify the calculation, we don't calculate the load avg.
3246                  * until the zone has been up for at least 10 seconds and our
3247                  * moving average is thus full.
3248                  */
3249                 if ((lavg->lg_len + 1) < S_LOADAVG_SZ) {
3250                         lavg->lg_len++;
3251                         mutex_exit(&zp->zone_lock);
3252                         continue;
3253                 }
3254 
3255                 /* Now calculate the 1min, 5min, 15 min load avg. */
3256                 hr_avg = 0;
3257                 for (i = 0; i < S_LOADAVG_SZ; i++)
3258                         hr_avg += lavg->lg_loads[i];
3259                 hr_avg = hr_avg / S_LOADAVG_SZ;
3260                 nrun = hr_avg / (NANOSEC / LGRP_LOADAVG_IN_THREAD_MAX);
3261 
3262                 /* Compute load avg. See comment in calcloadavg() */
3263                 for (i = 0; i < 3; i++) {
3264                         q = (zp->zone_hp_avenrun[i] >> 16) << 7;
3265                         r = (zp->zone_hp_avenrun[i] & 0xffff) << 7;
3266                         zp->zone_hp_avenrun[i] +=
3267                             ((nrun - q) * f[i] - ((r * f[i]) >> 16)) >> 4;
3268 
3269                         /* avenrun[] can only hold 31 bits of load avg. */
3270                         if (zp->zone_hp_avenrun[i] <
3271                             ((uint64_t)1<<(31+16-FSHIFT)))
3272                                 zp->zone_avenrun[i] = (int32_t)
3273                                     (zp->zone_hp_avenrun[i] >> (16 - FSHIFT));
3274                         else
3275                                 zp->zone_avenrun[i] = 0x7fffffff;
3276                 }
3277 
3278                 mutex_exit(&zp->zone_lock);
3279         }
3280         mutex_exit(&zonehash_lock);
3281 }
3282 
3283 /*
3284  * Get the number of cpus visible to this zone.  The system-wide global
3285  * 'ncpus' is returned if pools are disabled, the caller is in the
3286  * global zone, or a NULL zone argument is passed in.
3287  */
3288 int
3289 zone_ncpus_get(zone_t *zone)
3290 {
3291         int myncpus = zone == NULL ? 0 : zone->zone_ncpus;
3292 
3293         return (myncpus != 0 ? myncpus : ncpus);
3294 }
3295 
3296 /*
3297  * Get the number of online cpus visible to this zone.  The system-wide
3298  * global 'ncpus_online' is returned if pools are disabled, the caller
3299  * is in the global zone, or a NULL zone argument is passed in.
3300  */
3301 int
3302 zone_ncpus_online_get(zone_t *zone)
3303 {
3304         int myncpus_online = zone == NULL ? 0 : zone->zone_ncpus_online;
3305 
3306         return (myncpus_online != 0 ? myncpus_online : ncpus_online);
3307 }
3308 
3309 /*
3310  * Return the pool to which the zone is currently bound.
3311  */
3312 pool_t *
3313 zone_pool_get(zone_t *zone)
3314 {
3315         ASSERT(pool_lock_held());
3316 
3317         return (zone->zone_pool);
3318 }
3319 
3320 /*
3321  * Set the zone's pool pointer and update the zone's visibility to match
3322  * the resources in the new pool.
3323  */
3324 void
3325 zone_pool_set(zone_t *zone, pool_t *pool)
3326 {
3327         ASSERT(pool_lock_held());
3328         ASSERT(MUTEX_HELD(&cpu_lock));
3329 
3330         zone->zone_pool = pool;
3331         zone_pset_set(zone, pool->pool_pset->pset_id);
3332 }
3333 
3334 /*
3335  * Return the cached value of the id of the processor set to which the
3336  * zone is currently bound.  The value will be ZONE_PS_INVAL if the pools
3337  * facility is disabled.
3338  */
3339 psetid_t
3340 zone_pset_get(zone_t *zone)
3341 {
3342         ASSERT(MUTEX_HELD(&cpu_lock));
3343 
3344         return (zone->zone_psetid);
3345 }
3346 
3347 /*
3348  * Set the cached value of the id of the processor set to which the zone
3349  * is currently bound.  Also update the zone's visibility to match the
3350  * resources in the new processor set.
3351  */
3352 void
3353 zone_pset_set(zone_t *zone, psetid_t newpsetid)
3354 {
3355         psetid_t oldpsetid;
3356 
3357         ASSERT(MUTEX_HELD(&cpu_lock));
3358         oldpsetid = zone_pset_get(zone);
3359 
3360         if (oldpsetid == newpsetid)
3361                 return;
3362         /*
3363          * Global zone sees all.
3364          */
3365         if (zone != global_zone) {
3366                 zone->zone_psetid = newpsetid;
3367                 if (newpsetid != ZONE_PS_INVAL)
3368                         pool_pset_visibility_add(newpsetid, zone);
3369                 if (oldpsetid != ZONE_PS_INVAL)
3370                         pool_pset_visibility_remove(oldpsetid, zone);
3371         }
3372         /*
3373          * Disabling pools, so we should start using the global values
3374          * for ncpus and ncpus_online.
3375          */
3376         if (newpsetid == ZONE_PS_INVAL) {
3377                 zone->zone_ncpus = 0;
3378                 zone->zone_ncpus_online = 0;
3379         }
3380 }
3381 
3382 /*
3383  * Walk the list of active zones and issue the provided callback for
3384  * each of them.
3385  *
3386  * Caller must not be holding any locks that may be acquired under
3387  * zonehash_lock.  See comment at the beginning of the file for a list of
3388  * common locks and their interactions with zones.
3389  */
3390 int
3391 zone_walk(int (*cb)(zone_t *, void *), void *data)
3392 {
3393         zone_t *zone;
3394         int ret = 0;
3395         zone_status_t status;
3396 
3397         mutex_enter(&zonehash_lock);
3398         for (zone = list_head(&zone_active); zone != NULL;
3399             zone = list_next(&zone_active, zone)) {
3400                 /*
3401                  * Skip zones that shouldn't be externally visible.
3402                  */
3403                 status = zone_status_get(zone);
3404                 if (status < ZONE_IS_READY || status > ZONE_IS_DOWN)
3405                         continue;
3406                 /*
3407                  * Bail immediately if any callback invocation returns a
3408                  * non-zero value.
3409                  */
3410                 ret = (*cb)(zone, data);
3411                 if (ret != 0)
3412                         break;
3413         }
3414         mutex_exit(&zonehash_lock);
3415         return (ret);
3416 }
3417 
3418 static int
3419 zone_set_root(zone_t *zone, const char *upath)
3420 {
3421         vnode_t *vp;
3422         int trycount;
3423         int error = 0;
3424         char *path;
3425         struct pathname upn, pn;
3426         size_t pathlen;
3427 
3428         if ((error = pn_get((char *)upath, UIO_USERSPACE, &upn)) != 0)
3429                 return (error);
3430 
3431         pn_alloc(&pn);
3432 
3433         /* prevent infinite loop */
3434         trycount = 10;
3435         for (;;) {
3436                 if (--trycount <= 0) {
3437                         error = ESTALE;
3438                         goto out;
3439                 }
3440 
3441                 if ((error = lookuppn(&upn, &pn, FOLLOW, NULLVPP, &vp)) == 0) {
3442                         /*
3443                          * VOP_ACCESS() may cover 'vp' with a new
3444                          * filesystem, if 'vp' is an autoFS vnode.
3445                          * Get the new 'vp' if so.
3446                          */
3447                         if ((error =
3448                             VOP_ACCESS(vp, VEXEC, 0, CRED(), NULL)) == 0 &&
3449                             (!vn_ismntpt(vp) ||
3450                             (error = traverse(&vp)) == 0)) {
3451                                 pathlen = pn.pn_pathlen + 2;
3452                                 path = kmem_alloc(pathlen, KM_SLEEP);
3453                                 (void) strncpy(path, pn.pn_path,
3454                                     pn.pn_pathlen + 1);
3455                                 path[pathlen - 2] = '/';
3456                                 path[pathlen - 1] = '\0';
3457                                 pn_free(&pn);
3458                                 pn_free(&upn);
3459 
3460                                 /* Success! */
3461                                 break;
3462                         }
3463                         VN_RELE(vp);
3464                 }
3465                 if (error != ESTALE)
3466                         goto out;
3467         }
3468 
3469         ASSERT(error == 0);
3470         zone->zone_rootvp = vp;              /* we hold a reference to vp */
3471         zone->zone_rootpath = path;
3472         zone->zone_rootpathlen = pathlen;
3473         if (pathlen > 5 && strcmp(path + pathlen - 5, "/lu/") == 0)
3474                 zone->zone_flags |= ZF_IS_SCRATCH;
3475         return (0);
3476 
3477 out:
3478         pn_free(&pn);
3479         pn_free(&upn);
3480         return (error);
3481 }
3482 
3483 #define isalnum(c)      (((c) >= '0' && (c) <= '9') || \
3484                         ((c) >= 'a' && (c) <= 'z') || \
3485                         ((c) >= 'A' && (c) <= 'Z'))
3486 
3487 static int
3488 zone_set_name(zone_t *zone, const char *uname)
3489 {
3490         char *kname = kmem_zalloc(ZONENAME_MAX, KM_SLEEP);
3491         size_t len;
3492         int i, err;
3493 
3494         if ((err = copyinstr(uname, kname, ZONENAME_MAX, &len)) != 0) {
3495                 kmem_free(kname, ZONENAME_MAX);
3496                 return (err);   /* EFAULT or ENAMETOOLONG */
3497         }
3498 
3499         /* must be less than ZONENAME_MAX */
3500         if (len == ZONENAME_MAX && kname[ZONENAME_MAX - 1] != '\0') {
3501                 kmem_free(kname, ZONENAME_MAX);
3502                 return (EINVAL);
3503         }
3504 
3505         /*
3506          * Name must start with an alphanumeric and must contain only
3507          * alphanumerics, '-', '_' and '.'.
3508          */
3509         if (!isalnum(kname[0])) {
3510                 kmem_free(kname, ZONENAME_MAX);
3511                 return (EINVAL);
3512         }
3513         for (i = 1; i < len - 1; i++) {
3514                 if (!isalnum(kname[i]) && kname[i] != '-' && kname[i] != '_' &&
3515                     kname[i] != '.') {
3516                         kmem_free(kname, ZONENAME_MAX);
3517                         return (EINVAL);
3518                 }
3519         }
3520 
3521         zone->zone_name = kname;
3522         return (0);
3523 }
3524 
3525 /*
3526  * Gets the 32-bit hostid of the specified zone as an unsigned int.  If 'zonep'
3527  * is NULL or it points to a zone with no hostid emulation, then the machine's
3528  * hostid (i.e., the global zone's hostid) is returned.  This function returns
3529  * zero if neither the zone nor the host machine (global zone) have hostids.  It
3530  * returns HW_INVALID_HOSTID if the function attempts to return the machine's
3531  * hostid and the machine's hostid is invalid.
3532  */
3533 uint32_t
3534 zone_get_hostid(zone_t *zonep)
3535 {
3536         unsigned long machine_hostid;
3537 
3538         if (zonep == NULL || zonep->zone_hostid == HW_INVALID_HOSTID) {
3539                 if (ddi_strtoul(hw_serial, NULL, 10, &machine_hostid) != 0)
3540                         return (HW_INVALID_HOSTID);
3541                 return ((uint32_t)machine_hostid);
3542         }
3543         return (zonep->zone_hostid);
3544 }
3545 
3546 /*
3547  * Similar to thread_create(), but makes sure the thread is in the appropriate
3548  * zone's zsched process (curproc->p_zone->zone_zsched) before returning.
3549  */
3550 /*ARGSUSED*/
3551 kthread_t *
3552 zthread_create(
3553     caddr_t stk,
3554     size_t stksize,
3555     void (*proc)(),
3556     void *arg,
3557     size_t len,
3558     pri_t pri)
3559 {
3560         kthread_t *t;
3561         zone_t *zone = curproc->p_zone;
3562         proc_t *pp = zone->zone_zsched;
3563 
3564         zone_hold(zone);        /* Reference to be dropped when thread exits */
3565 
3566         /*
3567          * No-one should be trying to create threads if the zone is shutting
3568          * down and there aren't any kernel threads around.  See comment
3569          * in zthread_exit().
3570          */
3571         ASSERT(!(zone->zone_kthreads == NULL &&
3572             zone_status_get(zone) >= ZONE_IS_EMPTY));
3573         /*
3574          * Create a thread, but don't let it run until we've finished setting
3575          * things up.
3576          */
3577         t = thread_create(stk, stksize, proc, arg, len, pp, TS_STOPPED, pri);
3578         ASSERT(t->t_forw == NULL);
3579         mutex_enter(&zone_status_lock);
3580         if (zone->zone_kthreads == NULL) {
3581                 t->t_forw = t->t_back = t;
3582         } else {
3583                 kthread_t *tx = zone->zone_kthreads;
3584 
3585                 t->t_forw = tx;
3586                 t->t_back = tx->t_back;
3587                 tx->t_back->t_forw = t;
3588                 tx->t_back = t;
3589         }
3590         zone->zone_kthreads = t;
3591         mutex_exit(&zone_status_lock);
3592 
3593         mutex_enter(&pp->p_lock);
3594         t->t_proc_flag |= TP_ZTHREAD;
3595         project_rele(t->t_proj);
3596         t->t_proj = project_hold(pp->p_task->tk_proj);
3597 
3598         /*
3599          * Setup complete, let it run.
3600          */
3601         thread_lock(t);
3602         t->t_schedflag |= TS_ALLSTART;
3603         setrun_locked(t);
3604         thread_unlock(t);
3605 
3606         mutex_exit(&pp->p_lock);
3607 
3608         return (t);
3609 }
3610 
3611 /*
3612  * Similar to thread_exit().  Must be called by threads created via
3613  * zthread_exit().
3614  */
3615 void
3616 zthread_exit(void)
3617 {
3618         kthread_t *t = curthread;
3619         proc_t *pp = curproc;
3620         zone_t *zone = pp->p_zone;
3621 
3622         mutex_enter(&zone_status_lock);
3623 
3624         /*
3625          * Reparent to p0
3626          */
3627         kpreempt_disable();
3628         mutex_enter(&pp->p_lock);
3629         t->t_proc_flag &= ~TP_ZTHREAD;
3630         t->t_procp = &p0;
3631         hat_thread_exit(t);
3632         mutex_exit(&pp->p_lock);
3633         kpreempt_enable();
3634 
3635         if (t->t_back == t) {
3636                 ASSERT(t->t_forw == t);
3637                 /*
3638                  * If the zone is empty, once the thread count
3639                  * goes to zero no further kernel threads can be
3640                  * created.  This is because if the creator is a process
3641                  * in the zone, then it must have exited before the zone
3642                  * state could be set to ZONE_IS_EMPTY.
3643                  * Otherwise, if the creator is a kernel thread in the
3644                  * zone, the thread count is non-zero.
3645                  *
3646                  * This really means that non-zone kernel threads should
3647                  * not create zone kernel threads.
3648                  */
3649                 zone->zone_kthreads = NULL;
3650                 if (zone_status_get(zone) == ZONE_IS_EMPTY) {
3651                         zone_status_set(zone, ZONE_IS_DOWN);
3652                         /*
3653                          * Remove any CPU caps on this zone.
3654                          */
3655                         cpucaps_zone_remove(zone);
3656                 }
3657         } else {
3658                 t->t_forw->t_back = t->t_back;
3659                 t->t_back->t_forw = t->t_forw;
3660                 if (zone->zone_kthreads == t)
3661                         zone->zone_kthreads = t->t_forw;
3662         }
3663         mutex_exit(&zone_status_lock);
3664         zone_rele(zone);
3665         thread_exit();
3666         /* NOTREACHED */
3667 }
3668 
3669 static void
3670 zone_chdir(vnode_t *vp, vnode_t **vpp, proc_t *pp)
3671 {
3672         vnode_t *oldvp;
3673 
3674         /* we're going to hold a reference here to the directory */
3675         VN_HOLD(vp);
3676 
3677         /* update abs cwd/root path see c2/audit.c */
3678         if (AU_AUDITING())
3679                 audit_chdirec(vp, vpp);
3680 
3681         mutex_enter(&pp->p_lock);
3682         oldvp = *vpp;
3683         *vpp = vp;
3684         mutex_exit(&pp->p_lock);
3685         if (oldvp != NULL)
3686                 VN_RELE(oldvp);
3687 }
3688 
3689 /*
3690  * Convert an rctl value represented by an nvlist_t into an rctl_val_t.
3691  */
3692 static int
3693 nvlist2rctlval(nvlist_t *nvl, rctl_val_t *rv)
3694 {
3695         nvpair_t *nvp = NULL;
3696         boolean_t priv_set = B_FALSE;
3697         boolean_t limit_set = B_FALSE;
3698         boolean_t action_set = B_FALSE;
3699 
3700         while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
3701                 const char *name;
3702                 uint64_t ui64;
3703 
3704                 name = nvpair_name(nvp);
3705                 if (nvpair_type(nvp) != DATA_TYPE_UINT64)
3706                         return (EINVAL);
3707                 (void) nvpair_value_uint64(nvp, &ui64);
3708                 if (strcmp(name, "privilege") == 0) {
3709                         /*
3710                          * Currently only privileged values are allowed, but
3711                          * this may change in the future.
3712                          */
3713                         if (ui64 != RCPRIV_PRIVILEGED)
3714                                 return (EINVAL);
3715                         rv->rcv_privilege = ui64;
3716                         priv_set = B_TRUE;
3717                 } else if (strcmp(name, "limit") == 0) {
3718                         rv->rcv_value = ui64;
3719                         limit_set = B_TRUE;
3720                 } else if (strcmp(name, "action") == 0) {
3721                         if (ui64 != RCTL_LOCAL_NOACTION &&
3722                             ui64 != RCTL_LOCAL_DENY)
3723                                 return (EINVAL);
3724                         rv->rcv_flagaction = ui64;
3725                         action_set = B_TRUE;
3726                 } else {
3727                         return (EINVAL);
3728                 }
3729         }
3730 
3731         if (!(priv_set && limit_set && action_set))
3732                 return (EINVAL);
3733         rv->rcv_action_signal = 0;
3734         rv->rcv_action_recipient = NULL;
3735         rv->rcv_action_recip_pid = -1;
3736         rv->rcv_firing_time = 0;
3737 
3738         return (0);
3739 }
3740 
3741 /*
3742  * Non-global zone version of start_init.
3743  */
3744 void
3745 zone_start_init(void)
3746 {
3747         proc_t *p = ttoproc(curthread);
3748         zone_t *z = p->p_zone;
3749 
3750         ASSERT(!INGLOBALZONE(curproc));
3751 
3752         /*
3753          * For all purposes (ZONE_ATTR_INITPID and restart_init),
3754          * storing just the pid of init is sufficient.
3755          */
3756         z->zone_proc_initpid = p->p_pid;
3757 
3758         /*
3759          * We maintain zone_boot_err so that we can return the cause of the
3760          * failure back to the caller of the zone_boot syscall.
3761          */
3762         p->p_zone->zone_boot_err = start_init_common();
3763 
3764         /*
3765          * We will prevent booting zones from becoming running zones if the
3766          * global zone is shutting down.
3767          */
3768         mutex_enter(&zone_status_lock);
3769         if (z->zone_boot_err != 0 || zone_status_get(global_zone) >=
3770             ZONE_IS_SHUTTING_DOWN) {
3771                 /*
3772                  * Make sure we are still in the booting state-- we could have
3773                  * raced and already be shutting down, or even further along.
3774                  */
3775                 if (zone_status_get(z) == ZONE_IS_BOOTING) {
3776                         zone_status_set(z, ZONE_IS_SHUTTING_DOWN);
3777                 }
3778                 mutex_exit(&zone_status_lock);
3779                 /* It's gone bad, dispose of the process */
3780                 if (proc_exit(CLD_EXITED, z->zone_boot_err) != 0) {
3781                         mutex_enter(&p->p_lock);
3782                         ASSERT(p->p_flag & SEXITLWPS);
3783                         lwp_exit();
3784                 }
3785         } else {
3786                 if (zone_status_get(z) == ZONE_IS_BOOTING)
3787                         zone_status_set(z, ZONE_IS_RUNNING);
3788                 mutex_exit(&zone_status_lock);
3789                 /* cause the process to return to userland. */
3790                 lwp_rtt();
3791         }
3792 }
3793 
3794 struct zsched_arg {
3795         zone_t *zone;
3796         nvlist_t *nvlist;
3797 };
3798 
3799 /*
3800  * Per-zone "sched" workalike.  The similarity to "sched" doesn't have
3801  * anything to do with scheduling, but rather with the fact that
3802  * per-zone kernel threads are parented to zsched, just like regular
3803  * kernel threads are parented to sched (p0).
3804  *
3805  * zsched is also responsible for launching init for the zone.
3806  */
3807 static void
3808 zsched(void *arg)
3809 {
3810         struct zsched_arg *za = arg;
3811         proc_t *pp = curproc;
3812         proc_t *initp = proc_init;
3813         zone_t *zone = za->zone;
3814         cred_t *cr, *oldcred;
3815         rctl_set_t *set;
3816         rctl_alloc_gp_t *gp;
3817         contract_t *ct = NULL;
3818         task_t *tk, *oldtk;
3819         rctl_entity_p_t e;
3820         kproject_t *pj;
3821 
3822         nvlist_t *nvl = za->nvlist;
3823         nvpair_t *nvp = NULL;
3824 
3825         bcopy("zsched", PTOU(pp)->u_psargs, sizeof ("zsched"));
3826         bcopy("zsched", PTOU(pp)->u_comm, sizeof ("zsched"));
3827         PTOU(pp)->u_argc = 0;
3828         PTOU(pp)->u_argv = NULL;
3829         PTOU(pp)->u_envp = NULL;
3830         closeall(P_FINFO(pp));
3831 
3832         /*
3833          * We are this zone's "zsched" process.  As the zone isn't generally
3834          * visible yet we don't need to grab any locks before initializing its
3835          * zone_proc pointer.
3836          */
3837         zone_hold(zone);  /* this hold is released by zone_destroy() */
3838         zone->zone_zsched = pp;
3839         mutex_enter(&pp->p_lock);
3840         pp->p_zone = zone;
3841         mutex_exit(&pp->p_lock);
3842 
3843         /*
3844          * Disassociate process from its 'parent'; parent ourselves to init
3845          * (pid 1) and change other values as needed.
3846          */
3847         sess_create();
3848 
3849         mutex_enter(&pidlock);
3850         proc_detach(pp);
3851         pp->p_ppid = 1;
3852         pp->p_flag |= SZONETOP;
3853         pp->p_ancpid = 1;
3854         pp->p_parent = initp;
3855         pp->p_psibling = NULL;
3856         if (initp->p_child)
3857                 initp->p_child->p_psibling = pp;
3858         pp->p_sibling = initp->p_child;
3859         initp->p_child = pp;
3860 
3861         /* Decrement what newproc() incremented. */
3862         upcount_dec(crgetruid(CRED()), GLOBAL_ZONEID);
3863         /*
3864          * Our credentials are about to become kcred-like, so we don't care
3865          * about the caller's ruid.
3866          */
3867         upcount_inc(crgetruid(kcred), zone->zone_id);
3868         mutex_exit(&pidlock);
3869 
3870         /*
3871          * getting out of global zone, so decrement lwp and process counts
3872          */
3873         pj = pp->p_task->tk_proj;
3874         mutex_enter(&global_zone->zone_nlwps_lock);
3875         pj->kpj_nlwps -= pp->p_lwpcnt;
3876         global_zone->zone_nlwps -= pp->p_lwpcnt;
3877         pj->kpj_nprocs--;
3878         global_zone->zone_nprocs--;
3879         mutex_exit(&global_zone->zone_nlwps_lock);
3880 
3881         /*
3882          * Decrement locked memory counts on old zone and project.
3883          */
3884         mutex_enter(&global_zone->zone_mem_lock);
3885         global_zone->zone_locked_mem -= pp->p_locked_mem;
3886         pj->kpj_data.kpd_locked_mem -= pp->p_locked_mem;
3887         mutex_exit(&global_zone->zone_mem_lock);
3888 
3889         /*
3890          * Create and join a new task in project '0' of this zone.
3891          *
3892          * We don't need to call holdlwps() since we know we're the only lwp in
3893          * this process.
3894          *
3895          * task_join() returns with p_lock held.
3896          */
3897         tk = task_create(0, zone);
3898         mutex_enter(&cpu_lock);
3899         oldtk = task_join(tk, 0);
3900 
3901         pj = pp->p_task->tk_proj;
3902 
3903         mutex_enter(&zone->zone_mem_lock);
3904         zone->zone_locked_mem += pp->p_locked_mem;
3905         pj->kpj_data.kpd_locked_mem += pp->p_locked_mem;
3906         mutex_exit(&zone->zone_mem_lock);
3907 
3908         /*
3909          * add lwp and process counts to zsched's zone, and increment
3910          * project's task and process count due to the task created in
3911          * the above task_create.
3912          */
3913         mutex_enter(&zone->zone_nlwps_lock);
3914         pj->kpj_nlwps += pp->p_lwpcnt;
3915         pj->kpj_ntasks += 1;
3916         zone->zone_nlwps += pp->p_lwpcnt;
3917         pj->kpj_nprocs++;
3918         zone->zone_nprocs++;
3919         mutex_exit(&zone->zone_nlwps_lock);
3920 
3921         mutex_exit(&curproc->p_lock);
3922         mutex_exit(&cpu_lock);
3923         task_rele(oldtk);
3924 
3925         /*
3926          * The process was created by a process in the global zone, hence the
3927          * credentials are wrong.  We might as well have kcred-ish credentials.
3928          */
3929         cr = zone->zone_kcred;
3930         crhold(cr);
3931         mutex_enter(&pp->p_crlock);
3932         oldcred = pp->p_cred;
3933         pp->p_cred = cr;
3934         mutex_exit(&pp->p_crlock);
3935         crfree(oldcred);
3936 
3937         /*
3938          * Hold credentials again (for thread)
3939          */
3940         crhold(cr);
3941 
3942         /*
3943          * p_lwpcnt can't change since this is a kernel process.
3944          */
3945         crset(pp, cr);
3946 
3947         /*
3948          * Chroot
3949          */
3950         zone_chdir(zone->zone_rootvp, &PTOU(pp)->u_cdir, pp);
3951         zone_chdir(zone->zone_rootvp, &PTOU(pp)->u_rdir, pp);
3952 
3953         /*
3954          * Initialize zone's rctl set.
3955          */
3956         set = rctl_set_create();
3957         gp = rctl_set_init_prealloc(RCENTITY_ZONE);
3958         mutex_enter(&pp->p_lock);
3959         e.rcep_p.zone = zone;
3960         e.rcep_t = RCENTITY_ZONE;
3961         zone->zone_rctls = rctl_set_init(RCENTITY_ZONE, pp, &e, set, gp);
3962         mutex_exit(&pp->p_lock);
3963         rctl_prealloc_destroy(gp);
3964 
3965         /*
3966          * Apply the rctls passed in to zone_create().  This is basically a list
3967          * assignment: all of the old values are removed and the new ones
3968          * inserted.  That is, if an empty list is passed in, all values are
3969          * removed.
3970          */
3971         while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
3972                 rctl_dict_entry_t *rde;
3973                 rctl_hndl_t hndl;
3974                 char *name;
3975                 nvlist_t **nvlarray;
3976                 uint_t i, nelem;
3977                 int error;      /* For ASSERT()s */
3978 
3979                 name = nvpair_name(nvp);
3980                 hndl = rctl_hndl_lookup(name);
3981                 ASSERT(hndl != -1);
3982                 rde = rctl_dict_lookup_hndl(hndl);
3983                 ASSERT(rde != NULL);
3984 
3985                 for (; /* ever */; ) {
3986                         rctl_val_t oval;
3987 
3988                         mutex_enter(&pp->p_lock);
3989                         error = rctl_local_get(hndl, NULL, &oval, pp);
3990                         mutex_exit(&pp->p_lock);
3991                         ASSERT(error == 0);     /* Can't fail for RCTL_FIRST */
3992                         ASSERT(oval.rcv_privilege != RCPRIV_BASIC);
3993                         if (oval.rcv_privilege == RCPRIV_SYSTEM)
3994                                 break;
3995                         mutex_enter(&pp->p_lock);
3996                         error = rctl_local_delete(hndl, &oval, pp);
3997                         mutex_exit(&pp->p_lock);
3998                         ASSERT(error == 0);
3999                 }
4000                 error = nvpair_value_nvlist_array(nvp, &nvlarray, &nelem);
4001                 ASSERT(error == 0);
4002                 for (i = 0; i < nelem; i++) {
4003                         rctl_val_t *nvalp;
4004 
4005                         nvalp = kmem_cache_alloc(rctl_val_cache, KM_SLEEP);
4006                         error = nvlist2rctlval(nvlarray[i], nvalp);
4007                         ASSERT(error == 0);
4008                         /*
4009                          * rctl_local_insert can fail if the value being
4010                          * inserted is a duplicate; this is OK.
4011                          */
4012                         mutex_enter(&pp->p_lock);
4013                         if (rctl_local_insert(hndl, nvalp, pp) != 0)
4014                                 kmem_cache_free(rctl_val_cache, nvalp);
4015                         mutex_exit(&pp->p_lock);
4016                 }
4017         }
4018 
4019         /*
4020          * Tell the world that we're done setting up.
4021          *
4022          * At this point we want to set the zone status to ZONE_IS_INITIALIZED
4023          * and atomically set the zone's processor set visibility.  Once
4024          * we drop pool_lock() this zone will automatically get updated
4025          * to reflect any future changes to the pools configuration.
4026          *
4027          * Note that after we drop the locks below (zonehash_lock in
4028          * particular) other operations such as a zone_getattr call can
4029          * now proceed and observe the zone. That is the reason for doing a
4030          * state transition to the INITIALIZED state.
4031          */
4032         pool_lock();
4033         mutex_enter(&cpu_lock);
4034         mutex_enter(&zonehash_lock);
4035         zone_uniqid(zone);
4036         zone_zsd_configure(zone);
4037         if (pool_state == POOL_ENABLED)
4038                 zone_pset_set(zone, pool_default->pool_pset->pset_id);
4039         mutex_enter(&zone_status_lock);
4040         ASSERT(zone_status_get(zone) == ZONE_IS_UNINITIALIZED);
4041         zone_status_set(zone, ZONE_IS_INITIALIZED);
4042         mutex_exit(&zone_status_lock);
4043         mutex_exit(&zonehash_lock);
4044         mutex_exit(&cpu_lock);
4045         pool_unlock();
4046 
4047         /* Now call the create callback for this key */
4048         zsd_apply_all_keys(zsd_apply_create, zone);
4049 
4050         /* The callbacks are complete. Mark ZONE_IS_READY */
4051         mutex_enter(&zone_status_lock);
4052         ASSERT(zone_status_get(zone) == ZONE_IS_INITIALIZED);
4053         zone_status_set(zone, ZONE_IS_READY);
4054         mutex_exit(&zone_status_lock);
4055 
4056         /*
4057          * Once we see the zone transition to the ZONE_IS_BOOTING state,
4058          * we launch init, and set the state to running.
4059          */
4060         zone_status_wait_cpr(zone, ZONE_IS_BOOTING, "zsched");
4061 
4062         if (zone_status_get(zone) == ZONE_IS_BOOTING) {
4063                 id_t cid;
4064 
4065                 /*
4066                  * Ok, this is a little complicated.  We need to grab the
4067                  * zone's pool's scheduling class ID; note that by now, we
4068                  * are already bound to a pool if we need to be (zoneadmd
4069                  * will have done that to us while we're in the READY
4070                  * state).  *But* the scheduling class for the zone's 'init'
4071                  * must be explicitly passed to newproc, which doesn't
4072                  * respect pool bindings.
4073                  *
4074                  * We hold the pool_lock across the call to newproc() to
4075                  * close the obvious race: the pool's scheduling class
4076                  * could change before we manage to create the LWP with
4077                  * classid 'cid'.
4078                  */
4079                 pool_lock();
4080                 if (zone->zone_defaultcid > 0)
4081                         cid = zone->zone_defaultcid;
4082                 else
4083                         cid = pool_get_class(zone->zone_pool);
4084                 if (cid == -1)
4085                         cid = defaultcid;
4086 
4087                 /*
4088                  * If this fails, zone_boot will ultimately fail.  The
4089                  * state of the zone will be set to SHUTTING_DOWN-- userland
4090                  * will have to tear down the zone, and fail, or try again.
4091                  */
4092                 if ((zone->zone_boot_err = newproc(zone_start_init, NULL, cid,
4093                     minclsyspri - 1, &ct, 0)) != 0) {
4094                         mutex_enter(&zone_status_lock);
4095                         zone_status_set(zone, ZONE_IS_SHUTTING_DOWN);
4096                         mutex_exit(&zone_status_lock);
4097                 } else {
4098                         zone->zone_boot_time = gethrestime_sec();
4099                 }
4100 
4101                 pool_unlock();
4102         }
4103 
4104         /*
4105          * Wait for zone_destroy() to be called.  This is what we spend
4106          * most of our life doing.
4107          */
4108         zone_status_wait_cpr(zone, ZONE_IS_DYING, "zsched");
4109 
4110         if (ct)
4111                 /*
4112                  * At this point the process contract should be empty.
4113                  * (Though if it isn't, it's not the end of the world.)
4114                  */
4115                 VERIFY(contract_abandon(ct, curproc, B_TRUE) == 0);
4116 
4117         /*
4118          * Allow kcred to be freed when all referring processes
4119          * (including this one) go away.  We can't just do this in
4120          * zone_free because we need to wait for the zone_cred_ref to
4121          * drop to 0 before calling zone_free, and the existence of
4122          * zone_kcred will prevent that.  Thus, we call crfree here to
4123          * balance the crdup in zone_create.  The crhold calls earlier
4124          * in zsched will be dropped when the thread and process exit.
4125          */
4126         crfree(zone->zone_kcred);
4127         zone->zone_kcred = NULL;
4128 
4129         exit(CLD_EXITED, 0);
4130 }
4131 
4132 /*
4133  * Helper function to determine if there are any submounts of the
4134  * provided path.  Used to make sure the zone doesn't "inherit" any
4135  * mounts from before it is created.
4136  */
4137 static uint_t
4138 zone_mount_count(const char *rootpath)
4139 {
4140         vfs_t *vfsp;
4141         uint_t count = 0;
4142         size_t rootpathlen = strlen(rootpath);
4143 
4144         /*
4145          * Holding zonehash_lock prevents race conditions with
4146          * vfs_list_add()/vfs_list_remove() since we serialize with
4147          * zone_find_by_path().
4148          */
4149         ASSERT(MUTEX_HELD(&zonehash_lock));
4150         /*
4151          * The rootpath must end with a '/'
4152          */
4153         ASSERT(rootpath[rootpathlen - 1] == '/');
4154 
4155         /*
4156          * This intentionally does not count the rootpath itself if that
4157          * happens to be a mount point.
4158          */
4159         vfs_list_read_lock();
4160         vfsp = rootvfs;
4161         do {
4162                 if (strncmp(rootpath, refstr_value(vfsp->vfs_mntpt),
4163                     rootpathlen) == 0)
4164                         count++;
4165                 vfsp = vfsp->vfs_next;
4166         } while (vfsp != rootvfs);
4167         vfs_list_unlock();
4168         return (count);
4169 }
4170 
4171 /*
4172  * Helper function to make sure that a zone created on 'rootpath'
4173  * wouldn't end up containing other zones' rootpaths.
4174  */
4175 static boolean_t
4176 zone_is_nested(const char *rootpath)
4177 {
4178         zone_t *zone;
4179         size_t rootpathlen = strlen(rootpath);
4180         size_t len;
4181 
4182         ASSERT(MUTEX_HELD(&zonehash_lock));
4183 
4184         /*
4185          * zone_set_root() appended '/' and '\0' at the end of rootpath
4186          */
4187         if ((rootpathlen <= 3) && (rootpath[0] == '/') &&
4188             (rootpath[1] == '/') && (rootpath[2] == '\0'))
4189                 return (B_TRUE);
4190 
4191         for (zone = list_head(&zone_active); zone != NULL;
4192             zone = list_next(&zone_active, zone)) {
4193                 if (zone == global_zone)
4194                         continue;
4195                 len = strlen(zone->zone_rootpath);
4196                 if (strncmp(rootpath, zone->zone_rootpath,
4197                     MIN(rootpathlen, len)) == 0)
4198                         return (B_TRUE);
4199         }
4200         return (B_FALSE);
4201 }
4202 
4203 static int
4204 zone_set_privset(zone_t *zone, const priv_set_t *zone_privs,
4205     size_t zone_privssz)
4206 {
4207         priv_set_t *privs;
4208 
4209         if (zone_privssz < sizeof (priv_set_t))
4210                 return (ENOMEM);
4211 
4212         privs = kmem_alloc(sizeof (priv_set_t), KM_SLEEP);
4213 
4214         if (copyin(zone_privs, privs, sizeof (priv_set_t))) {
4215                 kmem_free(privs, sizeof (priv_set_t));
4216                 return (EFAULT);
4217         }
4218 
4219         zone->zone_privset = privs;
4220         return (0);
4221 }
4222 
4223 /*
4224  * We make creative use of nvlists to pass in rctls from userland.  The list is
4225  * a list of the following structures:
4226  *
4227  * (name = rctl_name, value = nvpair_list_array)
4228  *
4229  * Where each element of the nvpair_list_array is of the form:
4230  *
4231  * [(name = "privilege", value = RCPRIV_PRIVILEGED),
4232  *      (name = "limit", value = uint64_t),
4233  *      (name = "action", value = (RCTL_LOCAL_NOACTION || RCTL_LOCAL_DENY))]
4234  */
4235 static int
4236 parse_rctls(caddr_t ubuf, size_t buflen, nvlist_t **nvlp)
4237 {
4238         nvpair_t *nvp = NULL;
4239         nvlist_t *nvl = NULL;
4240         char *kbuf;
4241         int error;
4242         rctl_val_t rv;
4243 
4244         *nvlp = NULL;
4245 
4246         if (buflen == 0)
4247                 return (0);
4248 
4249         if ((kbuf = kmem_alloc(buflen, KM_NOSLEEP)) == NULL)
4250                 return (ENOMEM);
4251         if (copyin(ubuf, kbuf, buflen)) {
4252                 error = EFAULT;
4253                 goto out;
4254         }
4255         if (nvlist_unpack(kbuf, buflen, &nvl, KM_SLEEP) != 0) {
4256                 /*
4257                  * nvl may have been allocated/free'd, but the value set to
4258                  * non-NULL, so we reset it here.
4259                  */
4260                 nvl = NULL;
4261                 error = EINVAL;
4262                 goto out;
4263         }
4264         while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
4265                 rctl_dict_entry_t *rde;
4266                 rctl_hndl_t hndl;
4267                 nvlist_t **nvlarray;
4268                 uint_t i, nelem;
4269                 char *name;
4270 
4271                 error = EINVAL;
4272                 name = nvpair_name(nvp);
4273                 if (strncmp(nvpair_name(nvp), "zone.", sizeof ("zone.") - 1)
4274                     != 0 || nvpair_type(nvp) != DATA_TYPE_NVLIST_ARRAY) {
4275                         goto out;
4276                 }
4277                 if ((hndl = rctl_hndl_lookup(name)) == -1) {
4278                         goto out;
4279                 }
4280                 rde = rctl_dict_lookup_hndl(hndl);
4281                 error = nvpair_value_nvlist_array(nvp, &nvlarray, &nelem);
4282                 ASSERT(error == 0);
4283                 for (i = 0; i < nelem; i++) {
4284                         if (error = nvlist2rctlval(nvlarray[i], &rv))
4285                                 goto out;
4286                 }
4287                 if (rctl_invalid_value(rde, &rv)) {
4288                         error = EINVAL;
4289                         goto out;
4290                 }
4291         }
4292         error = 0;
4293         *nvlp = nvl;
4294 out:
4295         kmem_free(kbuf, buflen);
4296         if (error && nvl != NULL)
4297                 nvlist_free(nvl);
4298         return (error);
4299 }
4300 
4301 int
4302 zone_create_error(int er_error, int er_ext, int *er_out)
4303 {
4304         if (er_out != NULL) {
4305                 if (copyout(&er_ext, er_out, sizeof (int))) {
4306                         return (set_errno(EFAULT));
4307                 }
4308         }
4309         return (set_errno(er_error));
4310 }
4311 
4312 static int
4313 zone_set_label(zone_t *zone, const bslabel_t *lab, uint32_t doi)
4314 {
4315         ts_label_t *tsl;
4316         bslabel_t blab;
4317 
4318         /* Get label from user */
4319         if (copyin(lab, &blab, sizeof (blab)) != 0)
4320                 return (EFAULT);
4321         tsl = labelalloc(&blab, doi, KM_NOSLEEP);
4322         if (tsl == NULL)
4323                 return (ENOMEM);
4324 
4325         zone->zone_slabel = tsl;
4326         return (0);
4327 }
4328 
4329 /*
4330  * Parses a comma-separated list of ZFS datasets into a per-zone dictionary.
4331  */
4332 static int
4333 parse_zfs(zone_t *zone, caddr_t ubuf, size_t buflen)
4334 {
4335         char *kbuf;
4336         char *dataset, *next;
4337         zone_dataset_t *zd;
4338         size_t len;
4339 
4340         if (ubuf == NULL || buflen == 0)
4341                 return (0);
4342 
4343         if ((kbuf = kmem_alloc(buflen, KM_NOSLEEP)) == NULL)
4344                 return (ENOMEM);
4345 
4346         if (copyin(ubuf, kbuf, buflen) != 0) {
4347                 kmem_free(kbuf, buflen);
4348                 return (EFAULT);
4349         }
4350 
4351         dataset = next = kbuf;
4352         for (;;) {
4353                 zd = kmem_alloc(sizeof (zone_dataset_t), KM_SLEEP);
4354 
4355                 next = strchr(dataset, ',');
4356 
4357                 if (next == NULL)
4358                         len = strlen(dataset);
4359                 else
4360                         len = next - dataset;
4361 
4362                 zd->zd_dataset = kmem_alloc(len + 1, KM_SLEEP);
4363                 bcopy(dataset, zd->zd_dataset, len);
4364                 zd->zd_dataset[len] = '\0';
4365 
4366                 list_insert_head(&zone->zone_datasets, zd);
4367 
4368                 if (next == NULL)
4369                         break;
4370 
4371                 dataset = next + 1;
4372         }
4373 
4374         kmem_free(kbuf, buflen);
4375         return (0);
4376 }
4377 
4378 /*
4379  * System call to create/initialize a new zone named 'zone_name', rooted
4380  * at 'zone_root', with a zone-wide privilege limit set of 'zone_privs',
4381  * and initialized with the zone-wide rctls described in 'rctlbuf', and
4382  * with labeling set by 'match', 'doi', and 'label'.
4383  *
4384  * If extended error is non-null, we may use it to return more detailed
4385  * error information.
4386  */
4387 static zoneid_t
4388 zone_create(const char *zone_name, const char *zone_root,
4389     const priv_set_t *zone_privs, size_t zone_privssz,
4390     caddr_t rctlbuf, size_t rctlbufsz,
4391     caddr_t zfsbuf, size_t zfsbufsz, int *extended_error,
4392     int match, uint32_t doi, const bslabel_t *label,
4393     int flags)
4394 {
4395         struct zsched_arg zarg;
4396         nvlist_t *rctls = NULL;
4397         proc_t *pp = curproc;
4398         zone_t *zone, *ztmp;
4399         zoneid_t zoneid;
4400         int error;
4401         int error2 = 0;
4402         char *str;
4403         cred_t *zkcr;
4404         boolean_t insert_label_hash;
4405 
4406         if (secpolicy_zone_config(CRED()) != 0)
4407                 return (set_errno(EPERM));
4408 
4409         /* can't boot zone from within chroot environment */
4410         if (PTOU(pp)->u_rdir != NULL && PTOU(pp)->u_rdir != rootdir)
4411                 return (zone_create_error(ENOTSUP, ZE_CHROOTED,
4412                     extended_error));
4413 
4414         zone = kmem_zalloc(sizeof (zone_t), KM_SLEEP);
4415         zoneid = zone->zone_id = id_alloc(zoneid_space);
4416         zone->zone_status = ZONE_IS_UNINITIALIZED;
4417         zone->zone_pool = pool_default;
4418         zone->zone_pool_mod = gethrtime();
4419         zone->zone_psetid = ZONE_PS_INVAL;
4420         zone->zone_ncpus = 0;
4421         zone->zone_ncpus_online = 0;
4422         zone->zone_restart_init = B_TRUE;
4423         zone->zone_brand = &native_brand;
4424         zone->zone_initname = NULL;
4425         mutex_init(&zone->zone_lock, NULL, MUTEX_DEFAULT, NULL);
4426         mutex_init(&zone->zone_nlwps_lock, NULL, MUTEX_DEFAULT, NULL);
4427         mutex_init(&zone->zone_mem_lock, NULL, MUTEX_DEFAULT, NULL);
4428         cv_init(&zone->zone_cv, NULL, CV_DEFAULT, NULL);
4429         list_create(&zone->zone_ref_list, sizeof (zone_ref_t),
4430             offsetof(zone_ref_t, zref_linkage));
4431         list_create(&zone->zone_zsd, sizeof (struct zsd_entry),
4432             offsetof(struct zsd_entry, zsd_linkage));
4433         list_create(&zone->zone_datasets, sizeof (zone_dataset_t),
4434             offsetof(zone_dataset_t, zd_linkage));
4435         list_create(&zone->zone_dl_list, sizeof (zone_dl_t),
4436             offsetof(zone_dl_t, zdl_linkage));
4437         rw_init(&zone->zone_mlps.mlpl_rwlock, NULL, RW_DEFAULT, NULL);
4438         rw_init(&zone->zone_mntfs_db_lock, NULL, RW_DEFAULT, NULL);
4439 
4440         if (flags & ZCF_NET_EXCL) {
4441                 zone->zone_flags |= ZF_NET_EXCL;
4442         }
4443 
4444         if ((error = zone_set_name(zone, zone_name)) != 0) {
4445                 zone_free(zone);
4446                 return (zone_create_error(error, 0, extended_error));
4447         }
4448 
4449         if ((error = zone_set_root(zone, zone_root)) != 0) {
4450                 zone_free(zone);
4451                 return (zone_create_error(error, 0, extended_error));
4452         }
4453         if ((error = zone_set_privset(zone, zone_privs, zone_privssz)) != 0) {
4454                 zone_free(zone);
4455                 return (zone_create_error(error, 0, extended_error));
4456         }
4457 
4458         /* initialize node name to be the same as zone name */
4459         zone->zone_nodename = kmem_alloc(_SYS_NMLN, KM_SLEEP);
4460         (void) strncpy(zone->zone_nodename, zone->zone_name, _SYS_NMLN);
4461         zone->zone_nodename[_SYS_NMLN - 1] = '\0';
4462 
4463         zone->zone_domain = kmem_alloc(_SYS_NMLN, KM_SLEEP);
4464         zone->zone_domain[0] = '\0';
4465         zone->zone_hostid = HW_INVALID_HOSTID;
4466         zone->zone_shares = 1;
4467         zone->zone_shmmax = 0;
4468         zone->zone_ipc.ipcq_shmmni = 0;
4469         zone->zone_ipc.ipcq_semmni = 0;
4470         zone->zone_ipc.ipcq_msgmni = 0;
4471         zone->zone_bootargs = NULL;
4472         zone->zone_fs_allowed = NULL;
4473 
4474         secflags_zero(&zone0.zone_secflags.psf_lower);
4475         secflags_zero(&zone0.zone_secflags.psf_effective);
4476         secflags_zero(&zone0.zone_secflags.psf_inherit);
4477         secflags_fullset(&zone0.zone_secflags.psf_upper);
4478 
4479         zone->zone_initname =
4480             kmem_alloc(strlen(zone_default_initname) + 1, KM_SLEEP);
4481         (void) strcpy(zone->zone_initname, zone_default_initname);
4482         zone->zone_nlwps = 0;
4483         zone->zone_nlwps_ctl = INT_MAX;
4484         zone->zone_nprocs = 0;
4485         zone->zone_nprocs_ctl = INT_MAX;
4486         zone->zone_locked_mem = 0;
4487         zone->zone_locked_mem_ctl = UINT64_MAX;
4488         zone->zone_max_swap = 0;
4489         zone->zone_max_swap_ctl = UINT64_MAX;
4490         zone->zone_max_lofi = 0;
4491         zone->zone_max_lofi_ctl = UINT64_MAX;
4492         zone0.zone_lockedmem_kstat = NULL;
4493         zone0.zone_swapresv_kstat = NULL;
4494 
4495         /*
4496          * Zsched initializes the rctls.
4497          */
4498         zone->zone_rctls = NULL;
4499 
4500         if ((error = parse_rctls(rctlbuf, rctlbufsz, &rctls)) != 0) {
4501                 zone_free(zone);
4502                 return (zone_create_error(error, 0, extended_error));
4503         }
4504 
4505         if ((error = parse_zfs(zone, zfsbuf, zfsbufsz)) != 0) {
4506                 zone_free(zone);
4507                 return (set_errno(error));
4508         }
4509 
4510         /*
4511          * Read in the trusted system parameters:
4512          * match flag and sensitivity label.
4513          */
4514         zone->zone_match = match;
4515         if (is_system_labeled() && !(zone->zone_flags & ZF_IS_SCRATCH)) {
4516                 /* Fail if requested to set doi to anything but system's doi */
4517                 if (doi != 0 && doi != default_doi) {
4518                         zone_free(zone);
4519                         return (set_errno(EINVAL));
4520                 }
4521                 /* Always apply system's doi to the zone */
4522                 error = zone_set_label(zone, label, default_doi);
4523                 if (error != 0) {
4524                         zone_free(zone);
4525                         return (set_errno(error));
4526                 }
4527                 insert_label_hash = B_TRUE;
4528         } else {
4529                 /* all zones get an admin_low label if system is not labeled */
4530                 zone->zone_slabel = l_admin_low;
4531                 label_hold(l_admin_low);
4532                 insert_label_hash = B_FALSE;
4533         }
4534 
4535         /*
4536          * Stop all lwps since that's what normally happens as part of fork().
4537          * This needs to happen before we grab any locks to avoid deadlock
4538          * (another lwp in the process could be waiting for the held lock).
4539          */
4540         if (curthread != pp->p_agenttp && !holdlwps(SHOLDFORK)) {
4541                 zone_free(zone);
4542                 nvlist_free(rctls);
4543                 return (zone_create_error(error, 0, extended_error));
4544         }
4545 
4546         if (block_mounts(zone) == 0) {
4547                 mutex_enter(&pp->p_lock);
4548                 if (curthread != pp->p_agenttp)
4549                         continuelwps(pp);
4550                 mutex_exit(&pp->p_lock);
4551                 zone_free(zone);
4552                 nvlist_free(rctls);
4553                 return (zone_create_error(error, 0, extended_error));
4554         }
4555 
4556         /*
4557          * Set up credential for kernel access.  After this, any errors
4558          * should go through the dance in errout rather than calling
4559          * zone_free directly.
4560          */
4561         zone->zone_kcred = crdup(kcred);
4562         crsetzone(zone->zone_kcred, zone);
4563         priv_intersect(zone->zone_privset, &CR_PPRIV(zone->zone_kcred));
4564         priv_intersect(zone->zone_privset, &CR_EPRIV(zone->zone_kcred));
4565         priv_intersect(zone->zone_privset, &CR_IPRIV(zone->zone_kcred));
4566         priv_intersect(zone->zone_privset, &CR_LPRIV(zone->zone_kcred));
4567 
4568         mutex_enter(&zonehash_lock);
4569         /*
4570          * Make sure zone doesn't already exist.
4571          *
4572          * If the system and zone are labeled,
4573          * make sure no other zone exists that has the same label.
4574          */
4575         if ((ztmp = zone_find_all_by_name(zone->zone_name)) != NULL ||
4576             (insert_label_hash &&
4577             (ztmp = zone_find_all_by_label(zone->zone_slabel)) != NULL)) {
4578                 zone_status_t status;
4579 
4580                 status = zone_status_get(ztmp);
4581                 if (status == ZONE_IS_READY || status == ZONE_IS_RUNNING)
4582                         error = EEXIST;
4583                 else
4584                         error = EBUSY;
4585 
4586                 if (insert_label_hash)
4587                         error2 = ZE_LABELINUSE;
4588 
4589                 goto errout;
4590         }
4591 
4592         /*
4593          * Don't allow zone creations which would cause one zone's rootpath to
4594          * be accessible from that of another (non-global) zone.
4595          */
4596         if (zone_is_nested(zone->zone_rootpath)) {
4597                 error = EBUSY;
4598                 goto errout;
4599         }
4600 
4601         ASSERT(zonecount != 0);         /* check for leaks */
4602         if (zonecount + 1 > maxzones) {
4603                 error = ENOMEM;
4604                 goto errout;
4605         }
4606 
4607         if (zone_mount_count(zone->zone_rootpath) != 0) {
4608                 error = EBUSY;
4609                 error2 = ZE_AREMOUNTS;
4610                 goto errout;
4611         }
4612 
4613         /*
4614          * Zone is still incomplete, but we need to drop all locks while
4615          * zsched() initializes this zone's kernel process.  We
4616          * optimistically add the zone to the hashtable and associated
4617          * lists so a parallel zone_create() doesn't try to create the
4618          * same zone.
4619          */
4620         zonecount++;
4621         (void) mod_hash_insert(zonehashbyid,
4622             (mod_hash_key_t)(uintptr_t)zone->zone_id,
4623             (mod_hash_val_t)(uintptr_t)zone);
4624         str = kmem_alloc(strlen(zone->zone_name) + 1, KM_SLEEP);
4625         (void) strcpy(str, zone->zone_name);
4626         (void) mod_hash_insert(zonehashbyname, (mod_hash_key_t)str,
4627             (mod_hash_val_t)(uintptr_t)zone);
4628         if (insert_label_hash) {
4629                 (void) mod_hash_insert(zonehashbylabel,
4630                     (mod_hash_key_t)zone->zone_slabel, (mod_hash_val_t)zone);
4631                 zone->zone_flags |= ZF_HASHED_LABEL;
4632         }
4633 
4634         /*
4635          * Insert into active list.  At this point there are no 'hold's
4636          * on the zone, but everyone else knows not to use it, so we can
4637          * continue to use it.  zsched() will do a zone_hold() if the
4638          * newproc() is successful.
4639          */
4640         list_insert_tail(&zone_active, zone);
4641         mutex_exit(&zonehash_lock);
4642 
4643         zarg.zone = zone;
4644         zarg.nvlist = rctls;
4645         /*
4646          * The process, task, and project rctls are probably wrong;
4647          * we need an interface to get the default values of all rctls,
4648          * and initialize zsched appropriately.  I'm not sure that that
4649          * makes much of a difference, though.
4650          */
4651         error = newproc(zsched, (void *)&zarg, syscid, minclsyspri, NULL, 0);
4652         if (error != 0) {
4653                 /*
4654                  * We need to undo all globally visible state.
4655                  */
4656                 mutex_enter(&zonehash_lock);
4657                 list_remove(&zone_active, zone);
4658                 if (zone->zone_flags & ZF_HASHED_LABEL) {
4659                         ASSERT(zone->zone_slabel != NULL);
4660                         (void) mod_hash_destroy(zonehashbylabel,
4661                             (mod_hash_key_t)zone->zone_slabel);
4662                 }
4663                 (void) mod_hash_destroy(zonehashbyname,
4664                     (mod_hash_key_t)(uintptr_t)zone->zone_name);
4665                 (void) mod_hash_destroy(zonehashbyid,
4666                     (mod_hash_key_t)(uintptr_t)zone->zone_id);
4667                 ASSERT(zonecount > 1);
4668                 zonecount--;
4669                 goto errout;
4670         }
4671 
4672         /*
4673          * Zone creation can't fail from now on.
4674          */
4675 
4676         /*
4677          * Create zone kstats
4678          */
4679         zone_kstat_create(zone);
4680 
4681         /*
4682          * Let the other lwps continue.
4683          */
4684         mutex_enter(&pp->p_lock);
4685         if (curthread != pp->p_agenttp)
4686                 continuelwps(pp);
4687         mutex_exit(&pp->p_lock);
4688 
4689         /*
4690          * Wait for zsched to finish initializing the zone.
4691          */
4692         zone_status_wait(zone, ZONE_IS_READY);
4693         /*
4694          * The zone is fully visible, so we can let mounts progress.
4695          */
4696         resume_mounts(zone);
4697         nvlist_free(rctls);
4698 
4699         return (zoneid);
4700 
4701 errout:
4702         mutex_exit(&zonehash_lock);
4703         /*
4704          * Let the other lwps continue.
4705          */
4706         mutex_enter(&pp->p_lock);
4707         if (curthread != pp->p_agenttp)
4708                 continuelwps(pp);
4709         mutex_exit(&pp->p_lock);
4710 
4711         resume_mounts(zone);
4712         nvlist_free(rctls);
4713         /*
4714          * There is currently one reference to the zone, a cred_ref from
4715          * zone_kcred.  To free the zone, we call crfree, which will call
4716          * zone_cred_rele, which will call zone_free.
4717          */
4718         ASSERT(zone->zone_cred_ref == 1);
4719         ASSERT(zone->zone_kcred->cr_ref == 1);
4720         ASSERT(zone->zone_ref == 0);
4721         zkcr = zone->zone_kcred;
4722         zone->zone_kcred = NULL;
4723         crfree(zkcr);                           /* triggers call to zone_free */
4724         return (zone_create_error(error, error2, extended_error));
4725 }
4726 
4727 /*
4728  * Cause the zone to boot.  This is pretty simple, since we let zoneadmd do
4729  * the heavy lifting.  initname is the path to the program to launch
4730  * at the "top" of the zone; if this is NULL, we use the system default,
4731  * which is stored at zone_default_initname.
4732  */
4733 static int
4734 zone_boot(zoneid_t zoneid)
4735 {
4736         int err;
4737         zone_t *zone;
4738 
4739         if (secpolicy_zone_config(CRED()) != 0)
4740                 return (set_errno(EPERM));
4741         if (zoneid < MIN_USERZONEID || zoneid > MAX_ZONEID)
4742                 return (set_errno(EINVAL));
4743 
4744         mutex_enter(&zonehash_lock);
4745         /*
4746          * Look for zone under hash lock to prevent races with calls to
4747          * zone_shutdown, zone_destroy, etc.
4748          */
4749         if ((zone = zone_find_all_by_id(zoneid)) == NULL) {
4750                 mutex_exit(&zonehash_lock);
4751                 return (set_errno(EINVAL));
4752         }
4753 
4754         mutex_enter(&zone_status_lock);
4755         if (zone_status_get(zone) != ZONE_IS_READY) {
4756                 mutex_exit(&zone_status_lock);
4757                 mutex_exit(&zonehash_lock);
4758                 return (set_errno(EINVAL));
4759         }
4760         zone_status_set(zone, ZONE_IS_BOOTING);
4761         mutex_exit(&zone_status_lock);
4762 
4763         zone_hold(zone);        /* so we can use the zone_t later */
4764         mutex_exit(&zonehash_lock);
4765 
4766         if (zone_status_wait_sig(zone, ZONE_IS_RUNNING) == 0) {
4767                 zone_rele(zone);
4768                 return (set_errno(EINTR));
4769         }
4770 
4771         /*
4772          * Boot (starting init) might have failed, in which case the zone
4773          * will go to the SHUTTING_DOWN state; an appropriate errno will
4774          * be placed in zone->zone_boot_err, and so we return that.
4775          */
4776         err = zone->zone_boot_err;
4777         zone_rele(zone);
4778         return (err ? set_errno(err) : 0);
4779 }
4780 
4781 /*
4782  * Kills all user processes in the zone, waiting for them all to exit
4783  * before returning.
4784  */
4785 static int
4786 zone_empty(zone_t *zone)
4787 {
4788         int waitstatus;
4789 
4790         /*
4791          * We need to drop zonehash_lock before killing all
4792          * processes, otherwise we'll deadlock with zone_find_*
4793          * which can be called from the exit path.
4794          */
4795         ASSERT(MUTEX_NOT_HELD(&zonehash_lock));
4796         while ((waitstatus = zone_status_timedwait_sig(zone,
4797             ddi_get_lbolt() + hz, ZONE_IS_EMPTY)) == -1) {
4798                 killall(zone->zone_id);
4799         }
4800         /*
4801          * return EINTR if we were signaled
4802          */
4803         if (waitstatus == 0)
4804                 return (EINTR);
4805         return (0);
4806 }
4807 
4808 /*
4809  * This function implements the policy for zone visibility.
4810  *
4811  * In standard Solaris, a non-global zone can only see itself.
4812  *
4813  * In Trusted Extensions, a labeled zone can lookup any zone whose label
4814  * it dominates. For this test, the label of the global zone is treated as
4815  * admin_high so it is special-cased instead of being checked for dominance.
4816  *
4817  * Returns true if zone attributes are viewable, false otherwise.
4818  */
4819 static boolean_t
4820 zone_list_access(zone_t *zone)
4821 {
4822 
4823         if (curproc->p_zone == global_zone ||
4824             curproc->p_zone == zone) {
4825                 return (B_TRUE);
4826         } else if (is_system_labeled() && !(zone->zone_flags & ZF_IS_SCRATCH)) {
4827                 bslabel_t *curproc_label;
4828                 bslabel_t *zone_label;
4829 
4830                 curproc_label = label2bslabel(curproc->p_zone->zone_slabel);
4831                 zone_label = label2bslabel(zone->zone_slabel);
4832 
4833                 if (zone->zone_id != GLOBAL_ZONEID &&
4834                     bldominates(curproc_label, zone_label)) {
4835                         return (B_TRUE);
4836                 } else {
4837                         return (B_FALSE);
4838                 }
4839         } else {
4840                 return (B_FALSE);
4841         }
4842 }
4843 
4844 /*
4845  * Systemcall to start the zone's halt sequence.  By the time this
4846  * function successfully returns, all user processes and kernel threads
4847  * executing in it will have exited, ZSD shutdown callbacks executed,
4848  * and the zone status set to ZONE_IS_DOWN.
4849  *
4850  * It is possible that the call will interrupt itself if the caller is the
4851  * parent of any process running in the zone, and doesn't have SIGCHLD blocked.
4852  */
4853 static int
4854 zone_shutdown(zoneid_t zoneid)
4855 {
4856         int error;
4857         zone_t *zone;
4858         zone_status_t status;
4859 
4860         if (secpolicy_zone_config(CRED()) != 0)
4861                 return (set_errno(EPERM));
4862         if (zoneid < MIN_USERZONEID || zoneid > MAX_ZONEID)
4863                 return (set_errno(EINVAL));
4864 
4865         mutex_enter(&zonehash_lock);
4866         /*
4867          * Look for zone under hash lock to prevent races with other
4868          * calls to zone_shutdown and zone_destroy.
4869          */
4870         if ((zone = zone_find_all_by_id(zoneid)) == NULL) {
4871                 mutex_exit(&zonehash_lock);
4872                 return (set_errno(EINVAL));
4873         }
4874 
4875         /*
4876          * We have to drop zonehash_lock before calling block_mounts.
4877          * Hold the zone so we can continue to use the zone_t.
4878          */
4879         zone_hold(zone);
4880         mutex_exit(&zonehash_lock);
4881 
4882         /*
4883          * Block mounts so that VFS_MOUNT() can get an accurate view of
4884          * the zone's status with regards to ZONE_IS_SHUTTING down.
4885          *
4886          * e.g. NFS can fail the mount if it determines that the zone
4887          * has already begun the shutdown sequence.
4888          *
4889          */
4890         if (block_mounts(zone) == 0) {
4891                 zone_rele(zone);
4892                 return (set_errno(EINTR));
4893         }
4894 
4895         mutex_enter(&zonehash_lock);
4896         mutex_enter(&zone_status_lock);
4897         status = zone_status_get(zone);
4898         /*
4899          * Fail if the zone isn't fully initialized yet.
4900          */
4901         if (status < ZONE_IS_READY) {
4902                 mutex_exit(&zone_status_lock);
4903                 mutex_exit(&zonehash_lock);
4904                 resume_mounts(zone);
4905                 zone_rele(zone);
4906                 return (set_errno(EINVAL));
4907         }
4908         /*
4909          * If conditions required for zone_shutdown() to return have been met,
4910          * return success.
4911          */
4912         if (status >= ZONE_IS_DOWN) {
4913                 mutex_exit(&zone_status_lock);
4914                 mutex_exit(&zonehash_lock);
4915                 resume_mounts(zone);
4916                 zone_rele(zone);
4917                 return (0);
4918         }
4919         /*
4920          * If zone_shutdown() hasn't been called before, go through the motions.
4921          * If it has, there's nothing to do but wait for the kernel threads to
4922          * drain.
4923          */
4924         if (status < ZONE_IS_EMPTY) {
4925                 uint_t ntasks;
4926 
4927                 mutex_enter(&zone->zone_lock);
4928                 if ((ntasks = zone->zone_ntasks) != 1) {
4929                         /*
4930                          * There's still stuff running.
4931                          */
4932                         zone_status_set(zone, ZONE_IS_SHUTTING_DOWN);
4933                 }
4934                 mutex_exit(&zone->zone_lock);
4935                 if (ntasks == 1) {
4936                         /*
4937                          * The only way to create another task is through
4938                          * zone_enter(), which will block until we drop
4939                          * zonehash_lock.  The zone is empty.
4940                          */
4941                         if (zone->zone_kthreads == NULL) {
4942                                 /*
4943                                  * Skip ahead to ZONE_IS_DOWN
4944                                  */
4945                                 zone_status_set(zone, ZONE_IS_DOWN);
4946                         } else {
4947                                 zone_status_set(zone, ZONE_IS_EMPTY);
4948                         }
4949                 }
4950         }
4951         mutex_exit(&zone_status_lock);
4952         mutex_exit(&zonehash_lock);
4953         resume_mounts(zone);
4954 
4955         if (error = zone_empty(zone)) {
4956                 zone_rele(zone);
4957                 return (set_errno(error));
4958         }
4959         /*
4960          * After the zone status goes to ZONE_IS_DOWN this zone will no
4961          * longer be notified of changes to the pools configuration, so
4962          * in order to not end up with a stale pool pointer, we point
4963          * ourselves at the default pool and remove all resource
4964          * visibility.  This is especially important as the zone_t may
4965          * languish on the deathrow for a very long time waiting for
4966          * cred's to drain out.
4967          *
4968          * This rebinding of the zone can happen multiple times
4969          * (presumably due to interrupted or parallel systemcalls)
4970          * without any adverse effects.
4971          */
4972         if (pool_lock_intr() != 0) {
4973                 zone_rele(zone);
4974                 return (set_errno(EINTR));
4975         }
4976         if (pool_state == POOL_ENABLED) {
4977                 mutex_enter(&cpu_lock);
4978                 zone_pool_set(zone, pool_default);
4979                 /*
4980                  * The zone no longer needs to be able to see any cpus.
4981                  */
4982                 zone_pset_set(zone, ZONE_PS_INVAL);
4983                 mutex_exit(&cpu_lock);
4984         }
4985         pool_unlock();
4986 
4987         /*
4988          * ZSD shutdown callbacks can be executed multiple times, hence
4989          * it is safe to not be holding any locks across this call.
4990          */
4991         zone_zsd_callbacks(zone, ZSD_SHUTDOWN);
4992 
4993         mutex_enter(&zone_status_lock);
4994         if (zone->zone_kthreads == NULL && zone_status_get(zone) < ZONE_IS_DOWN)
4995                 zone_status_set(zone, ZONE_IS_DOWN);
4996         mutex_exit(&zone_status_lock);
4997 
4998         /*
4999          * Wait for kernel threads to drain.
5000          */
5001         if (!zone_status_wait_sig(zone, ZONE_IS_DOWN)) {
5002                 zone_rele(zone);
5003                 return (set_errno(EINTR));
5004         }
5005 
5006         /*
5007          * Zone can be become down/destroyable even if the above wait
5008          * returns EINTR, so any code added here may never execute.
5009          * (i.e. don't add code here)
5010          */
5011 
5012         zone_rele(zone);
5013         return (0);
5014 }
5015 
5016 /*
5017  * Log the specified zone's reference counts.  The caller should not be
5018  * holding the zone's zone_lock.
5019  */
5020 static void
5021 zone_log_refcounts(zone_t *zone)
5022 {
5023         char *buffer;
5024         char *buffer_position;
5025         uint32_t buffer_size;
5026         uint32_t index;
5027         uint_t ref;
5028         uint_t cred_ref;
5029 
5030         /*
5031          * Construct a string representing the subsystem-specific reference
5032          * counts.  The counts are printed in ascending order by index into the
5033          * zone_t::zone_subsys_ref array.  The list will be surrounded by
5034          * square brackets [] and will only contain nonzero reference counts.
5035          *
5036          * The buffer will hold two square bracket characters plus ten digits,
5037          * one colon, one space, one comma, and some characters for a
5038          * subsystem name per subsystem-specific reference count.  (Unsigned 32-
5039          * bit integers have at most ten decimal digits.)  The last
5040          * reference count's comma is replaced by the closing square
5041          * bracket and a NULL character to terminate the string.
5042          *
5043          * NOTE: We have to grab the zone's zone_lock to create a consistent
5044          * snapshot of the zone's reference counters.
5045          *
5046          * First, figure out how much space the string buffer will need.
5047          * The buffer's size is stored in buffer_size.
5048          */
5049         buffer_size = 2;                        /* for the square brackets */
5050         mutex_enter(&zone->zone_lock);
5051         zone->zone_flags |= ZF_REFCOUNTS_LOGGED;
5052         ref = zone->zone_ref;
5053         cred_ref = zone->zone_cred_ref;
5054         for (index = 0; index < ZONE_REF_NUM_SUBSYS; ++index)
5055                 if (zone->zone_subsys_ref[index] != 0)
5056                         buffer_size += strlen(zone_ref_subsys_names[index]) +
5057                             13;
5058         if (buffer_size == 2) {
5059                 /*
5060                  * No subsystems had nonzero reference counts.  Don't bother
5061                  * with allocating a buffer; just log the general-purpose and
5062                  * credential reference counts.
5063                  */
5064                 mutex_exit(&zone->zone_lock);
5065                 (void) strlog(0, 0, 1, SL_CONSOLE | SL_NOTE,
5066                     "Zone '%s' (ID: %d) is shutting down, but %u zone "
5067                     "references and %u credential references are still extant",
5068                     zone->zone_name, zone->zone_id, ref, cred_ref);
5069                 return;
5070         }
5071 
5072         /*
5073          * buffer_size contains the exact number of characters that the
5074          * buffer will need.  Allocate the buffer and fill it with nonzero
5075          * subsystem-specific reference counts.  Surround the results with
5076          * square brackets afterwards.
5077          */
5078         buffer = kmem_alloc(buffer_size, KM_SLEEP);
5079         buffer_position = &buffer[1];
5080         for (index = 0; index < ZONE_REF_NUM_SUBSYS; ++index) {
5081                 /*
5082                  * NOTE: The DDI's version of sprintf() returns a pointer to
5083                  * the modified buffer rather than the number of bytes written
5084                  * (as in snprintf(3C)).  This is unfortunate and annoying.
5085                  * Therefore, we'll use snprintf() with INT_MAX to get the
5086                  * number of bytes written.  Using INT_MAX is safe because
5087                  * the buffer is perfectly sized for the data: we'll never
5088                  * overrun the buffer.
5089                  */
5090                 if (zone->zone_subsys_ref[index] != 0)
5091                         buffer_position += snprintf(buffer_position, INT_MAX,
5092                             "%s: %u,", zone_ref_subsys_names[index],
5093                             zone->zone_subsys_ref[index]);
5094         }
5095         mutex_exit(&zone->zone_lock);
5096         buffer[0] = '[';
5097         ASSERT((uintptr_t)(buffer_position - buffer) < buffer_size);
5098         ASSERT(buffer_position[0] == '\0' && buffer_position[-1] == ',');
5099         buffer_position[-1] = ']';
5100 
5101         /*
5102          * Log the reference counts and free the message buffer.
5103          */
5104         (void) strlog(0, 0, 1, SL_CONSOLE | SL_NOTE,
5105             "Zone '%s' (ID: %d) is shutting down, but %u zone references and "
5106             "%u credential references are still extant %s", zone->zone_name,
5107             zone->zone_id, ref, cred_ref, buffer);
5108         kmem_free(buffer, buffer_size);
5109 }
5110 
5111 /*
5112  * Systemcall entry point to finalize the zone halt process.  The caller
5113  * must have already successfully called zone_shutdown().
5114  *
5115  * Upon successful completion, the zone will have been fully destroyed:
5116  * zsched will have exited, destructor callbacks executed, and the zone
5117  * removed from the list of active zones.
5118  */
5119 static int
5120 zone_destroy(zoneid_t zoneid)
5121 {
5122         uint64_t uniqid;
5123         zone_t *zone;
5124         zone_status_t status;
5125         clock_t wait_time;
5126         boolean_t log_refcounts;
5127 
5128         if (secpolicy_zone_config(CRED()) != 0)
5129                 return (set_errno(EPERM));
5130         if (zoneid < MIN_USERZONEID || zoneid > MAX_ZONEID)
5131                 return (set_errno(EINVAL));
5132 
5133         mutex_enter(&zonehash_lock);
5134         /*
5135          * Look for zone under hash lock to prevent races with other
5136          * calls to zone_destroy.
5137          */
5138         if ((zone = zone_find_all_by_id(zoneid)) == NULL) {
5139                 mutex_exit(&zonehash_lock);
5140                 return (set_errno(EINVAL));
5141         }
5142 
5143         if (zone_mount_count(zone->zone_rootpath) != 0) {
5144                 mutex_exit(&zonehash_lock);
5145                 return (set_errno(EBUSY));
5146         }
5147         mutex_enter(&zone_status_lock);
5148         status = zone_status_get(zone);
5149         if (status < ZONE_IS_DOWN) {
5150                 mutex_exit(&zone_status_lock);
5151                 mutex_exit(&zonehash_lock);
5152                 return (set_errno(EBUSY));
5153         } else if (status == ZONE_IS_DOWN) {
5154                 zone_status_set(zone, ZONE_IS_DYING); /* Tell zsched to exit */
5155         }
5156         mutex_exit(&zone_status_lock);
5157         zone_hold(zone);
5158         mutex_exit(&zonehash_lock);
5159 
5160         /*
5161          * wait for zsched to exit
5162          */
5163         zone_status_wait(zone, ZONE_IS_DEAD);
5164         zone_zsd_callbacks(zone, ZSD_DESTROY);
5165         zone->zone_netstack = NULL;
5166         uniqid = zone->zone_uniqid;
5167         zone_rele(zone);
5168         zone = NULL;    /* potentially free'd */
5169 
5170         log_refcounts = B_FALSE;
5171         wait_time = SEC_TO_TICK(ZONE_DESTROY_TIMEOUT_SECS);
5172         mutex_enter(&zonehash_lock);
5173         for (; /* ever */; ) {
5174                 boolean_t unref;
5175                 boolean_t refs_have_been_logged;
5176 
5177                 if ((zone = zone_find_all_by_id(zoneid)) == NULL ||
5178                     zone->zone_uniqid != uniqid) {
5179                         /*
5180                          * The zone has gone away.  Necessary conditions
5181                          * are met, so we return success.
5182                          */
5183                         mutex_exit(&zonehash_lock);
5184                         return (0);
5185                 }
5186                 mutex_enter(&zone->zone_lock);
5187                 unref = ZONE_IS_UNREF(zone);
5188                 refs_have_been_logged = (zone->zone_flags &
5189                     ZF_REFCOUNTS_LOGGED);
5190                 mutex_exit(&zone->zone_lock);
5191                 if (unref) {
5192                         /*
5193                          * There is only one reference to the zone -- that
5194                          * added when the zone was added to the hashtables --
5195                          * and things will remain this way until we drop
5196                          * zonehash_lock... we can go ahead and cleanup the
5197                          * zone.
5198                          */
5199                         break;
5200                 }
5201 
5202                 /*
5203                  * Wait for zone_rele_common() or zone_cred_rele() to signal
5204                  * zone_destroy_cv.  zone_destroy_cv is signaled only when
5205                  * some zone's general-purpose reference count reaches one.
5206                  * If ZONE_DESTROY_TIMEOUT_SECS seconds elapse while waiting
5207                  * on zone_destroy_cv, then log the zone's reference counts and
5208                  * continue to wait for zone_rele() and zone_cred_rele().
5209                  */
5210                 if (!refs_have_been_logged) {
5211                         if (!log_refcounts) {
5212                                 /*
5213                                  * This thread hasn't timed out waiting on
5214                                  * zone_destroy_cv yet.  Wait wait_time clock
5215                                  * ticks (initially ZONE_DESTROY_TIMEOUT_SECS
5216                                  * seconds) for the zone's references to clear.
5217                                  */
5218                                 ASSERT(wait_time > 0);
5219                                 wait_time = cv_reltimedwait_sig(
5220                                     &zone_destroy_cv, &zonehash_lock, wait_time,
5221                                     TR_SEC);
5222                                 if (wait_time > 0) {
5223                                         /*
5224                                          * A thread in zone_rele() or
5225                                          * zone_cred_rele() signaled
5226                                          * zone_destroy_cv before this thread's
5227                                          * wait timed out.  The zone might have
5228                                          * only one reference left; find out!
5229                                          */
5230                                         continue;
5231                                 } else if (wait_time == 0) {
5232                                         /* The thread's process was signaled. */
5233                                         mutex_exit(&zonehash_lock);
5234                                         return (set_errno(EINTR));
5235                                 }
5236 
5237                                 /*
5238                                  * The thread timed out while waiting on
5239                                  * zone_destroy_cv.  Even though the thread
5240                                  * timed out, it has to check whether another
5241                                  * thread woke up from zone_destroy_cv and
5242                                  * destroyed the zone.
5243                                  *
5244                                  * If the zone still exists and has more than
5245                                  * one unreleased general-purpose reference,
5246                                  * then log the zone's reference counts.
5247                                  */
5248                                 log_refcounts = B_TRUE;
5249                                 continue;
5250                         }
5251 
5252                         /*
5253                          * The thread already timed out on zone_destroy_cv while
5254                          * waiting for subsystems to release the zone's last
5255                          * general-purpose references.  Log the zone's reference
5256                          * counts and wait indefinitely on zone_destroy_cv.
5257                          */
5258                         zone_log_refcounts(zone);
5259                 }
5260                 if (cv_wait_sig(&zone_destroy_cv, &zonehash_lock) == 0) {
5261                         /* The thread's process was signaled. */
5262                         mutex_exit(&zonehash_lock);
5263                         return (set_errno(EINTR));
5264                 }
5265         }
5266 
5267         /*
5268          * Remove CPU cap for this zone now since we're not going to
5269          * fail below this point.
5270          */
5271         cpucaps_zone_remove(zone);
5272 
5273         /* Get rid of the zone's kstats */
5274         zone_kstat_delete(zone);
5275 
5276         /* remove the pfexecd doors */
5277         if (zone->zone_pfexecd != NULL) {
5278                 klpd_freelist(&zone->zone_pfexecd);
5279                 zone->zone_pfexecd = NULL;
5280         }
5281 
5282         /* free brand specific data */
5283         if (ZONE_IS_BRANDED(zone))
5284                 ZBROP(zone)->b_free_brand_data(zone);
5285 
5286         /* Say goodbye to brand framework. */
5287         brand_unregister_zone(zone->zone_brand);
5288 
5289         /*
5290          * It is now safe to let the zone be recreated; remove it from the
5291          * lists.  The memory will not be freed until the last cred
5292          * reference goes away.
5293          */
5294         ASSERT(zonecount > 1);       /* must be > 1; can't destroy global zone */
5295         zonecount--;
5296         /* remove from active list and hash tables */
5297         list_remove(&zone_active, zone);
5298         (void) mod_hash_destroy(zonehashbyname,
5299             (mod_hash_key_t)zone->zone_name);
5300         (void) mod_hash_destroy(zonehashbyid,
5301             (mod_hash_key_t)(uintptr_t)zone->zone_id);
5302         if (zone->zone_flags & ZF_HASHED_LABEL)
5303                 (void) mod_hash_destroy(zonehashbylabel,
5304                     (mod_hash_key_t)zone->zone_slabel);
5305         mutex_exit(&zonehash_lock);
5306 
5307         /*
5308          * Release the root vnode; we're not using it anymore.  Nor should any
5309          * other thread that might access it exist.
5310          */
5311         if (zone->zone_rootvp != NULL) {
5312                 VN_RELE(zone->zone_rootvp);
5313                 zone->zone_rootvp = NULL;
5314         }
5315 
5316         /* add to deathrow list */
5317         mutex_enter(&zone_deathrow_lock);
5318         list_insert_tail(&zone_deathrow, zone);
5319         mutex_exit(&zone_deathrow_lock);
5320 
5321         /*
5322          * Drop last reference (which was added by zsched()), this will
5323          * free the zone unless there are outstanding cred references.
5324          */
5325         zone_rele(zone);
5326         return (0);
5327 }
5328 
5329 /*
5330  * Systemcall entry point for zone_getattr(2).
5331  */
5332 static ssize_t
5333 zone_getattr(zoneid_t zoneid, int attr, void *buf, size_t bufsize)
5334 {
5335         size_t size;
5336         int error = 0, err;
5337         zone_t *zone;
5338         char *zonepath;
5339         char *outstr;
5340         zone_status_t zone_status;
5341         pid_t initpid;
5342         boolean_t global = (curzone == global_zone);
5343         boolean_t inzone = (curzone->zone_id == zoneid);
5344         ushort_t flags;
5345         zone_net_data_t *zbuf;
5346 
5347         mutex_enter(&zonehash_lock);
5348         if ((zone = zone_find_all_by_id(zoneid)) == NULL) {
5349                 mutex_exit(&zonehash_lock);
5350                 return (set_errno(EINVAL));
5351         }
5352         zone_status = zone_status_get(zone);
5353         if (zone_status < ZONE_IS_INITIALIZED) {
5354                 mutex_exit(&zonehash_lock);
5355                 return (set_errno(EINVAL));
5356         }
5357         zone_hold(zone);
5358         mutex_exit(&zonehash_lock);
5359 
5360         /*
5361          * If not in the global zone, don't show information about other zones,
5362          * unless the system is labeled and the local zone's label dominates
5363          * the other zone.
5364          */
5365         if (!zone_list_access(zone)) {
5366                 zone_rele(zone);
5367                 return (set_errno(EINVAL));
5368         }
5369 
5370         switch (attr) {
5371         case ZONE_ATTR_ROOT:
5372                 if (global) {
5373                         /*
5374                          * Copy the path to trim the trailing "/" (except for
5375                          * the global zone).
5376                          */
5377                         if (zone != global_zone)
5378                                 size = zone->zone_rootpathlen - 1;
5379                         else
5380                                 size = zone->zone_rootpathlen;
5381                         zonepath = kmem_alloc(size, KM_SLEEP);
5382                         bcopy(zone->zone_rootpath, zonepath, size);
5383                         zonepath[size - 1] = '\0';
5384                 } else {
5385                         if (inzone || !is_system_labeled()) {
5386                                 /*
5387                                  * Caller is not in the global zone.
5388                                  * if the query is on the current zone
5389                                  * or the system is not labeled,
5390                                  * just return faked-up path for current zone.
5391                                  */
5392                                 zonepath = "/";
5393                                 size = 2;
5394                         } else {
5395                                 /*
5396                                  * Return related path for current zone.
5397                                  */
5398                                 int prefix_len = strlen(zone_prefix);
5399                                 int zname_len = strlen(zone->zone_name);
5400 
5401                                 size = prefix_len + zname_len + 1;
5402                                 zonepath = kmem_alloc(size, KM_SLEEP);
5403                                 bcopy(zone_prefix, zonepath, prefix_len);
5404                                 bcopy(zone->zone_name, zonepath +
5405                                     prefix_len, zname_len);
5406                                 zonepath[size - 1] = '\0';
5407                         }
5408                 }
5409                 if (bufsize > size)
5410                         bufsize = size;
5411                 if (buf != NULL) {
5412                         err = copyoutstr(zonepath, buf, bufsize, NULL);
5413                         if (err != 0 && err != ENAMETOOLONG)
5414                                 error = EFAULT;
5415                 }
5416                 if (global || (is_system_labeled() && !inzone))
5417                         kmem_free(zonepath, size);
5418                 break;
5419 
5420         case ZONE_ATTR_NAME:
5421                 size = strlen(zone->zone_name) + 1;
5422                 if (bufsize > size)
5423                         bufsize = size;
5424                 if (buf != NULL) {
5425                         err = copyoutstr(zone->zone_name, buf, bufsize, NULL);
5426                         if (err != 0 && err != ENAMETOOLONG)
5427                                 error = EFAULT;
5428                 }
5429                 break;
5430 
5431         case ZONE_ATTR_STATUS:
5432                 /*
5433                  * Since we're not holding zonehash_lock, the zone status
5434                  * may be anything; leave it up to userland to sort it out.
5435                  */
5436                 size = sizeof (zone_status);
5437                 if (bufsize > size)
5438                         bufsize = size;
5439                 zone_status = zone_status_get(zone);
5440                 if (buf != NULL &&
5441                     copyout(&zone_status, buf, bufsize) != 0)
5442                         error = EFAULT;
5443                 break;
5444         case ZONE_ATTR_FLAGS:
5445                 size = sizeof (zone->zone_flags);
5446                 if (bufsize > size)
5447                         bufsize = size;
5448                 flags = zone->zone_flags;
5449                 if (buf != NULL &&
5450                     copyout(&flags, buf, bufsize) != 0)
5451                         error = EFAULT;
5452                 break;
5453         case ZONE_ATTR_PRIVSET:
5454                 size = sizeof (priv_set_t);
5455                 if (bufsize > size)
5456                         bufsize = size;
5457                 if (buf != NULL &&
5458                     copyout(zone->zone_privset, buf, bufsize) != 0)
5459                         error = EFAULT;
5460                 break;
5461         case ZONE_ATTR_UNIQID:
5462                 size = sizeof (zone->zone_uniqid);
5463                 if (bufsize > size)
5464                         bufsize = size;
5465                 if (buf != NULL &&
5466                     copyout(&zone->zone_uniqid, buf, bufsize) != 0)
5467                         error = EFAULT;
5468                 break;
5469         case ZONE_ATTR_POOLID:
5470                 {
5471                         pool_t *pool;
5472                         poolid_t poolid;
5473 
5474                         if (pool_lock_intr() != 0) {
5475                                 error = EINTR;
5476                                 break;
5477                         }
5478                         pool = zone_pool_get(zone);
5479                         poolid = pool->pool_id;
5480                         pool_unlock();
5481                         size = sizeof (poolid);
5482                         if (bufsize > size)
5483                                 bufsize = size;
5484                         if (buf != NULL && copyout(&poolid, buf, size) != 0)
5485                                 error = EFAULT;
5486                 }
5487                 break;
5488         case ZONE_ATTR_SLBL:
5489                 size = sizeof (bslabel_t);
5490                 if (bufsize > size)
5491                         bufsize = size;
5492                 if (zone->zone_slabel == NULL)
5493                         error = EINVAL;
5494                 else if (buf != NULL &&
5495                     copyout(label2bslabel(zone->zone_slabel), buf,
5496                     bufsize) != 0)
5497                         error = EFAULT;
5498                 break;
5499         case ZONE_ATTR_INITPID:
5500                 size = sizeof (initpid);
5501                 if (bufsize > size)
5502                         bufsize = size;
5503                 initpid = zone->zone_proc_initpid;
5504                 if (initpid == -1) {
5505                         error = ESRCH;
5506                         break;
5507                 }
5508                 if (buf != NULL &&
5509                     copyout(&initpid, buf, bufsize) != 0)
5510                         error = EFAULT;
5511                 break;
5512         case ZONE_ATTR_BRAND:
5513                 size = strlen(zone->zone_brand->b_name) + 1;
5514 
5515                 if (bufsize > size)
5516                         bufsize = size;
5517                 if (buf != NULL) {
5518                         err = copyoutstr(zone->zone_brand->b_name, buf,
5519                             bufsize, NULL);
5520                         if (err != 0 && err != ENAMETOOLONG)
5521                                 error = EFAULT;
5522                 }
5523                 break;
5524         case ZONE_ATTR_INITNAME:
5525                 size = strlen(zone->zone_initname) + 1;
5526                 if (bufsize > size)
5527                         bufsize = size;
5528                 if (buf != NULL) {
5529                         err = copyoutstr(zone->zone_initname, buf, bufsize,
5530                             NULL);
5531                         if (err != 0 && err != ENAMETOOLONG)
5532                                 error = EFAULT;
5533                 }
5534                 break;
5535         case ZONE_ATTR_BOOTARGS:
5536                 if (zone->zone_bootargs == NULL)
5537                         outstr = "";
5538                 else
5539                         outstr = zone->zone_bootargs;
5540                 size = strlen(outstr) + 1;
5541                 if (bufsize > size)
5542                         bufsize = size;
5543                 if (buf != NULL) {
5544                         err = copyoutstr(outstr, buf, bufsize, NULL);
5545                         if (err != 0 && err != ENAMETOOLONG)
5546                                 error = EFAULT;
5547                 }
5548                 break;
5549         case ZONE_ATTR_PHYS_MCAP:
5550                 size = sizeof (zone->zone_phys_mcap);
5551                 if (bufsize > size)
5552                         bufsize = size;
5553                 if (buf != NULL &&
5554                     copyout(&zone->zone_phys_mcap, buf, bufsize) != 0)
5555                         error = EFAULT;
5556                 break;
5557         case ZONE_ATTR_SCHED_CLASS:
5558                 mutex_enter(&class_lock);
5559 
5560                 if (zone->zone_defaultcid >= loaded_classes)
5561                         outstr = "";
5562                 else
5563                         outstr = sclass[zone->zone_defaultcid].cl_name;
5564                 size = strlen(outstr) + 1;
5565                 if (bufsize > size)
5566                         bufsize = size;
5567                 if (buf != NULL) {
5568                         err = copyoutstr(outstr, buf, bufsize, NULL);
5569                         if (err != 0 && err != ENAMETOOLONG)
5570                                 error = EFAULT;
5571                 }
5572 
5573                 mutex_exit(&class_lock);
5574                 break;
5575         case ZONE_ATTR_HOSTID:
5576                 if (zone->zone_hostid != HW_INVALID_HOSTID &&
5577                     bufsize == sizeof (zone->zone_hostid)) {
5578                         size = sizeof (zone->zone_hostid);
5579                         if (buf != NULL && copyout(&zone->zone_hostid, buf,
5580                             bufsize) != 0)
5581                                 error = EFAULT;
5582                 } else {
5583                         error = EINVAL;
5584                 }
5585                 break;
5586         case ZONE_ATTR_FS_ALLOWED:
5587                 if (zone->zone_fs_allowed == NULL)
5588                         outstr = "";
5589                 else
5590                         outstr = zone->zone_fs_allowed;
5591                 size = strlen(outstr) + 1;
5592                 if (bufsize > size)
5593                         bufsize = size;
5594                 if (buf != NULL) {
5595                         err = copyoutstr(outstr, buf, bufsize, NULL);
5596                         if (err != 0 && err != ENAMETOOLONG)
5597                                 error = EFAULT;
5598                 }
5599                 break;
5600         case ZONE_ATTR_SECFLAGS:
5601                 size = sizeof (zone->zone_secflags);
5602                 if (bufsize > size)
5603                         bufsize = size;
5604                 if ((err = copyout(&zone->zone_secflags, buf, bufsize)) != 0)
5605                         error = EFAULT;
5606                 break;
5607         case ZONE_ATTR_NETWORK:
5608                 zbuf = kmem_alloc(bufsize, KM_SLEEP);
5609                 if (copyin(buf, zbuf, bufsize) != 0) {
5610                         error = EFAULT;
5611                 } else {
5612                         error = zone_get_network(zoneid, zbuf);
5613                         if (error == 0 && copyout(zbuf, buf, bufsize) != 0)
5614                                 error = EFAULT;
5615                 }
5616                 kmem_free(zbuf, bufsize);
5617                 break;
5618         default:
5619                 if ((attr >= ZONE_ATTR_BRAND_ATTRS) && ZONE_IS_BRANDED(zone)) {
5620                         size = bufsize;
5621                         error = ZBROP(zone)->b_getattr(zone, attr, buf, &size);
5622                 } else {
5623                         error = EINVAL;
5624                 }
5625         }
5626         zone_rele(zone);
5627 
5628         if (error)
5629                 return (set_errno(error));
5630         return ((ssize_t)size);
5631 }
5632 
5633 /*
5634  * Systemcall entry point for zone_setattr(2).
5635  */
5636 /*ARGSUSED*/
5637 static int
5638 zone_setattr(zoneid_t zoneid, int attr, void *buf, size_t bufsize)
5639 {
5640         zone_t *zone;
5641         zone_status_t zone_status;
5642         int err = -1;
5643         zone_net_data_t *zbuf;
5644 
5645         if (secpolicy_zone_config(CRED()) != 0)
5646                 return (set_errno(EPERM));
5647 
5648         /*
5649          * Only the ZONE_ATTR_PHYS_MCAP attribute can be set on the
5650          * global zone.
5651          */
5652         if (zoneid == GLOBAL_ZONEID && attr != ZONE_ATTR_PHYS_MCAP) {
5653                 return (set_errno(EINVAL));
5654         }
5655 
5656         mutex_enter(&zonehash_lock);
5657         if ((zone = zone_find_all_by_id(zoneid)) == NULL) {
5658                 mutex_exit(&zonehash_lock);
5659                 return (set_errno(EINVAL));
5660         }
5661         zone_hold(zone);
5662         mutex_exit(&zonehash_lock);
5663 
5664         /*
5665          * At present most attributes can only be set on non-running,
5666          * non-global zones.
5667          */
5668         zone_status = zone_status_get(zone);
5669         if (attr != ZONE_ATTR_PHYS_MCAP && zone_status > ZONE_IS_READY) {
5670                 err = EINVAL;
5671                 goto done;
5672         }
5673 
5674         switch (attr) {
5675         case ZONE_ATTR_INITNAME:
5676                 err = zone_set_initname(zone, (const char *)buf);
5677                 break;
5678         case ZONE_ATTR_INITNORESTART:
5679                 zone->zone_restart_init = B_FALSE;
5680                 err = 0;
5681                 break;
5682         case ZONE_ATTR_BOOTARGS:
5683                 err = zone_set_bootargs(zone, (const char *)buf);
5684                 break;
5685         case ZONE_ATTR_BRAND:
5686                 err = zone_set_brand(zone, (const char *)buf);
5687                 break;
5688         case ZONE_ATTR_FS_ALLOWED:
5689                 err = zone_set_fs_allowed(zone, (const char *)buf);
5690                 break;
5691         case ZONE_ATTR_SECFLAGS:
5692                 err = zone_set_secflags(zone, (psecflags_t *)buf);
5693                 break;
5694         case ZONE_ATTR_PHYS_MCAP:
5695                 err = zone_set_phys_mcap(zone, (const uint64_t *)buf);
5696                 break;
5697         case ZONE_ATTR_SCHED_CLASS:
5698                 err = zone_set_sched_class(zone, (const char *)buf);
5699                 break;
5700         case ZONE_ATTR_HOSTID:
5701                 if (bufsize == sizeof (zone->zone_hostid)) {
5702                         if (copyin(buf, &zone->zone_hostid, bufsize) == 0)
5703                                 err = 0;
5704                         else
5705                                 err = EFAULT;
5706                 } else {
5707                         err = EINVAL;
5708                 }
5709                 break;
5710         case ZONE_ATTR_NETWORK:
5711                 if (bufsize > (PIPE_BUF + sizeof (zone_net_data_t))) {
5712                         err = EINVAL;
5713                         break;
5714                 }
5715                 zbuf = kmem_alloc(bufsize, KM_SLEEP);
5716                 if (copyin(buf, zbuf, bufsize) != 0) {
5717                         kmem_free(zbuf, bufsize);
5718                         err = EFAULT;
5719                         break;
5720                 }
5721                 err = zone_set_network(zoneid, zbuf);
5722                 kmem_free(zbuf, bufsize);
5723                 break;
5724         default:
5725                 if ((attr >= ZONE_ATTR_BRAND_ATTRS) && ZONE_IS_BRANDED(zone))
5726                         err = ZBROP(zone)->b_setattr(zone, attr, buf, bufsize);
5727                 else
5728                         err = EINVAL;
5729         }
5730 
5731 done:
5732         zone_rele(zone);
5733         ASSERT(err != -1);
5734         return (err != 0 ? set_errno(err) : 0);
5735 }
5736 
5737 /*
5738  * Return zero if the process has at least one vnode mapped in to its
5739  * address space which shouldn't be allowed to change zones.
5740  *
5741  * Also return zero if the process has any shared mappings which reserve
5742  * swap.  This is because the counting for zone.max-swap does not allow swap
5743  * reservation to be shared between zones.  zone swap reservation is counted
5744  * on zone->zone_max_swap.
5745  */
5746 static int
5747 as_can_change_zones(void)
5748 {
5749         proc_t *pp = curproc;
5750         struct seg *seg;
5751         struct as *as = pp->p_as;
5752         vnode_t *vp;
5753         int allow = 1;
5754 
5755         ASSERT(pp->p_as != &kas);
5756         AS_LOCK_ENTER(as, RW_READER);
5757         for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
5758 
5759                 /*
5760                  * Cannot enter zone with shared anon memory which
5761                  * reserves swap.  See comment above.
5762                  */
5763                 if (seg_can_change_zones(seg) == B_FALSE) {
5764                         allow = 0;
5765                         break;
5766                 }
5767                 /*
5768                  * if we can't get a backing vnode for this segment then skip
5769                  * it.
5770                  */
5771                 vp = NULL;
5772                 if (SEGOP_GETVP(seg, seg->s_base, &vp) != 0 || vp == NULL)
5773                         continue;
5774                 if (!vn_can_change_zones(vp)) { /* bail on first match */
5775                         allow = 0;
5776                         break;
5777                 }
5778         }
5779         AS_LOCK_EXIT(as);
5780         return (allow);
5781 }
5782 
5783 /*
5784  * Count swap reserved by curproc's address space
5785  */
5786 static size_t
5787 as_swresv(void)
5788 {
5789         proc_t *pp = curproc;
5790         struct seg *seg;
5791         struct as *as = pp->p_as;
5792         size_t swap = 0;
5793 
5794         ASSERT(pp->p_as != &kas);
5795         ASSERT(AS_WRITE_HELD(as));
5796         for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg))
5797                 swap += seg_swresv(seg);
5798 
5799         return (swap);
5800 }
5801 
5802 /*
5803  * Systemcall entry point for zone_enter().
5804  *
5805  * The current process is injected into said zone.  In the process
5806  * it will change its project membership, privileges, rootdir/cwd,
5807  * zone-wide rctls, and pool association to match those of the zone.
5808  *
5809  * The first zone_enter() called while the zone is in the ZONE_IS_READY
5810  * state will transition it to ZONE_IS_RUNNING.  Processes may only
5811  * enter a zone that is "ready" or "running".
5812  */
5813 static int
5814 zone_enter(zoneid_t zoneid)
5815 {
5816         zone_t *zone;
5817         vnode_t *vp;
5818         proc_t *pp = curproc;
5819         contract_t *ct;
5820         cont_process_t *ctp;
5821         task_t *tk, *oldtk;
5822         kproject_t *zone_proj0;
5823         cred_t *cr, *newcr;
5824         pool_t *oldpool, *newpool;
5825         sess_t *sp;
5826         uid_t uid;
5827         zone_status_t status;
5828         int err = 0;
5829         rctl_entity_p_t e;
5830         size_t swap;
5831         kthread_id_t t;
5832 
5833         if (secpolicy_zone_config(CRED()) != 0)
5834                 return (set_errno(EPERM));
5835         if (zoneid < MIN_USERZONEID || zoneid > MAX_ZONEID)
5836                 return (set_errno(EINVAL));
5837 
5838         /*
5839          * Stop all lwps so we don't need to hold a lock to look at
5840          * curproc->p_zone.  This needs to happen before we grab any
5841          * locks to avoid deadlock (another lwp in the process could
5842          * be waiting for the held lock).
5843          */
5844         if (curthread != pp->p_agenttp && !holdlwps(SHOLDFORK))
5845                 return (set_errno(EINTR));
5846 
5847         /*
5848          * Make sure we're not changing zones with files open or mapped in
5849          * to our address space which shouldn't be changing zones.
5850          */
5851         if (!files_can_change_zones()) {
5852                 err = EBADF;
5853                 goto out;
5854         }
5855         if (!as_can_change_zones()) {
5856                 err = EFAULT;
5857                 goto out;
5858         }
5859 
5860         mutex_enter(&zonehash_lock);
5861         if (pp->p_zone != global_zone) {
5862                 mutex_exit(&zonehash_lock);
5863                 err = EINVAL;
5864                 goto out;
5865         }
5866 
5867         zone = zone_find_all_by_id(zoneid);
5868         if (zone == NULL) {
5869                 mutex_exit(&zonehash_lock);
5870                 err = EINVAL;
5871                 goto out;
5872         }
5873 
5874         /*
5875          * To prevent processes in a zone from holding contracts on
5876          * extrazonal resources, and to avoid process contract
5877          * memberships which span zones, contract holders and processes
5878          * which aren't the sole members of their encapsulating process
5879          * contracts are not allowed to zone_enter.
5880          */
5881         ctp = pp->p_ct_process;
5882         ct = &ctp->conp_contract;
5883         mutex_enter(&ct->ct_lock);
5884         mutex_enter(&pp->p_lock);
5885         if ((avl_numnodes(&pp->p_ct_held) != 0) || (ctp->conp_nmembers != 1)) {
5886                 mutex_exit(&pp->p_lock);
5887                 mutex_exit(&ct->ct_lock);
5888                 mutex_exit(&zonehash_lock);
5889                 err = EINVAL;
5890                 goto out;
5891         }
5892 
5893         /*
5894          * Moreover, we don't allow processes whose encapsulating
5895          * process contracts have inherited extrazonal contracts.
5896          * While it would be easier to eliminate all process contracts
5897          * with inherited contracts, we need to be able to give a
5898          * restarted init (or other zone-penetrating process) its
5899          * predecessor's contracts.
5900          */
5901         if (ctp->conp_ninherited != 0) {
5902                 contract_t *next;
5903                 for (next = list_head(&ctp->conp_inherited); next;
5904                     next = list_next(&ctp->conp_inherited, next)) {
5905                         if (contract_getzuniqid(next) != zone->zone_uniqid) {
5906                                 mutex_exit(&pp->p_lock);
5907                                 mutex_exit(&ct->ct_lock);
5908                                 mutex_exit(&zonehash_lock);
5909                                 err = EINVAL;
5910                                 goto out;
5911                         }
5912                 }
5913         }
5914 
5915         mutex_exit(&pp->p_lock);
5916         mutex_exit(&ct->ct_lock);
5917 
5918         status = zone_status_get(zone);
5919         if (status < ZONE_IS_READY || status >= ZONE_IS_SHUTTING_DOWN) {
5920                 /*
5921                  * Can't join
5922                  */
5923                 mutex_exit(&zonehash_lock);
5924                 err = EINVAL;
5925                 goto out;
5926         }
5927 
5928         /*
5929          * Make sure new priv set is within the permitted set for caller
5930          */
5931         if (!priv_issubset(zone->zone_privset, &CR_OPPRIV(CRED()))) {
5932                 mutex_exit(&zonehash_lock);
5933                 err = EPERM;
5934                 goto out;
5935         }
5936         /*
5937          * We want to momentarily drop zonehash_lock while we optimistically
5938          * bind curproc to the pool it should be running in.  This is safe
5939          * since the zone can't disappear (we have a hold on it).
5940          */
5941         zone_hold(zone);
5942         mutex_exit(&zonehash_lock);
5943 
5944         /*
5945          * Grab pool_lock to keep the pools configuration from changing
5946          * and to stop ourselves from getting rebound to another pool
5947          * until we join the zone.
5948          */
5949         if (pool_lock_intr() != 0) {
5950                 zone_rele(zone);
5951                 err = EINTR;
5952                 goto out;
5953         }
5954         ASSERT(secpolicy_pool(CRED()) == 0);
5955         /*
5956          * Bind ourselves to the pool currently associated with the zone.
5957          */
5958         oldpool = curproc->p_pool;
5959         newpool = zone_pool_get(zone);
5960         if (pool_state == POOL_ENABLED && newpool != oldpool &&
5961             (err = pool_do_bind(newpool, P_PID, P_MYID,
5962             POOL_BIND_ALL)) != 0) {
5963                 pool_unlock();
5964                 zone_rele(zone);
5965                 goto out;
5966         }
5967 
5968         /*
5969          * Grab cpu_lock now; we'll need it later when we call
5970          * task_join().
5971          */
5972         mutex_enter(&cpu_lock);
5973         mutex_enter(&zonehash_lock);
5974         /*
5975          * Make sure the zone hasn't moved on since we dropped zonehash_lock.
5976          */
5977         if (zone_status_get(zone) >= ZONE_IS_SHUTTING_DOWN) {
5978                 /*
5979                  * Can't join anymore.
5980                  */
5981                 mutex_exit(&zonehash_lock);
5982                 mutex_exit(&cpu_lock);
5983                 if (pool_state == POOL_ENABLED &&
5984                     newpool != oldpool)
5985                         (void) pool_do_bind(oldpool, P_PID, P_MYID,
5986                             POOL_BIND_ALL);
5987                 pool_unlock();
5988                 zone_rele(zone);
5989                 err = EINVAL;
5990                 goto out;
5991         }
5992 
5993         /*
5994          * a_lock must be held while transfering locked memory and swap
5995          * reservation from the global zone to the non global zone because
5996          * asynchronous faults on the processes' address space can lock
5997          * memory and reserve swap via MCL_FUTURE and MAP_NORESERVE
5998          * segments respectively.
5999          */
6000         AS_LOCK_ENTER(pp->p_as, RW_WRITER);
6001         swap = as_swresv();
6002         mutex_enter(&pp->p_lock);
6003         zone_proj0 = zone->zone_zsched->p_task->tk_proj;
6004         /* verify that we do not exceed and task or lwp limits */
6005         mutex_enter(&zone->zone_nlwps_lock);
6006         /* add new lwps to zone and zone's proj0 */
6007         zone_proj0->kpj_nlwps += pp->p_lwpcnt;
6008         zone->zone_nlwps += pp->p_lwpcnt;
6009         /* add 1 task to zone's proj0 */
6010         zone_proj0->kpj_ntasks += 1;
6011 
6012         zone_proj0->kpj_nprocs++;
6013         zone->zone_nprocs++;
6014         mutex_exit(&zone->zone_nlwps_lock);
6015 
6016         mutex_enter(&zone->zone_mem_lock);
6017         zone->zone_locked_mem += pp->p_locked_mem;
6018         zone_proj0->kpj_data.kpd_locked_mem += pp->p_locked_mem;
6019         zone->zone_max_swap += swap;
6020         mutex_exit(&zone->zone_mem_lock);
6021 
6022         mutex_enter(&(zone_proj0->kpj_data.kpd_crypto_lock));
6023         zone_proj0->kpj_data.kpd_crypto_mem += pp->p_crypto_mem;
6024         mutex_exit(&(zone_proj0->kpj_data.kpd_crypto_lock));
6025 
6026         /* remove lwps and process from proc's old zone and old project */
6027         mutex_enter(&pp->p_zone->zone_nlwps_lock);
6028         pp->p_zone->zone_nlwps -= pp->p_lwpcnt;
6029         pp->p_task->tk_proj->kpj_nlwps -= pp->p_lwpcnt;
6030         pp->p_task->tk_proj->kpj_nprocs--;
6031         pp->p_zone->zone_nprocs--;
6032         mutex_exit(&pp->p_zone->zone_nlwps_lock);
6033 
6034         mutex_enter(&pp->p_zone->zone_mem_lock);
6035         pp->p_zone->zone_locked_mem -= pp->p_locked_mem;
6036         pp->p_task->tk_proj->kpj_data.kpd_locked_mem -= pp->p_locked_mem;
6037         pp->p_zone->zone_max_swap -= swap;
6038         mutex_exit(&pp->p_zone->zone_mem_lock);
6039 
6040         mutex_enter(&(pp->p_task->tk_proj->kpj_data.kpd_crypto_lock));
6041         pp->p_task->tk_proj->kpj_data.kpd_crypto_mem -= pp->p_crypto_mem;
6042         mutex_exit(&(pp->p_task->tk_proj->kpj_data.kpd_crypto_lock));
6043 
6044         pp->p_flag |= SZONETOP;
6045         pp->p_zone = zone;
6046         mutex_exit(&pp->p_lock);
6047         AS_LOCK_EXIT(pp->p_as);
6048 
6049         /*
6050          * Joining the zone cannot fail from now on.
6051          *
6052          * This means that a lot of the following code can be commonized and
6053          * shared with zsched().
6054          */
6055 
6056         /*
6057          * If the process contract fmri was inherited, we need to
6058          * flag this so that any contract status will not leak
6059          * extra zone information, svc_fmri in this case
6060          */
6061         if (ctp->conp_svc_ctid != ct->ct_id) {
6062                 mutex_enter(&ct->ct_lock);
6063                 ctp->conp_svc_zone_enter = ct->ct_id;
6064                 mutex_exit(&ct->ct_lock);
6065         }
6066 
6067         /*
6068          * Reset the encapsulating process contract's zone.
6069          */
6070         ASSERT(ct->ct_mzuniqid == GLOBAL_ZONEUNIQID);
6071         contract_setzuniqid(ct, zone->zone_uniqid);
6072 
6073         /*
6074          * Create a new task and associate the process with the project keyed
6075          * by (projid,zoneid).
6076          *
6077          * We might as well be in project 0; the global zone's projid doesn't
6078          * make much sense in a zone anyhow.
6079          *
6080          * This also increments zone_ntasks, and returns with p_lock held.
6081          */
6082         tk = task_create(0, zone);
6083         oldtk = task_join(tk, 0);
6084         mutex_exit(&cpu_lock);
6085 
6086         /*
6087          * call RCTLOP_SET functions on this proc
6088          */
6089         e.rcep_p.zone = zone;
6090         e.rcep_t = RCENTITY_ZONE;
6091         (void) rctl_set_dup(NULL, NULL, pp, &e, zone->zone_rctls, NULL,
6092             RCD_CALLBACK);
6093         mutex_exit(&pp->p_lock);
6094 
6095         /*
6096          * We don't need to hold any of zsched's locks here; not only do we know
6097          * the process and zone aren't going away, we know its session isn't
6098          * changing either.
6099          *
6100          * By joining zsched's session here, we mimic the behavior in the
6101          * global zone of init's sid being the pid of sched.  We extend this
6102          * to all zlogin-like zone_enter()'ing processes as well.
6103          */
6104         mutex_enter(&pidlock);
6105         sp = zone->zone_zsched->p_sessp;
6106         sess_hold(zone->zone_zsched);
6107         mutex_enter(&pp->p_lock);
6108         pgexit(pp);
6109         sess_rele(pp->p_sessp, B_TRUE);
6110         pp->p_sessp = sp;
6111         pgjoin(pp, zone->zone_zsched->p_pidp);
6112 
6113         /*
6114          * If any threads are scheduled to be placed on zone wait queue they
6115          * should abandon the idea since the wait queue is changing.
6116          * We need to be holding pidlock & p_lock to do this.
6117          */
6118         if ((t = pp->p_tlist) != NULL) {
6119                 do {
6120                         thread_lock(t);
6121                         /*
6122                          * Kick this thread so that he doesn't sit
6123                          * on a wrong wait queue.
6124                          */
6125                         if (ISWAITING(t))
6126                                 setrun_locked(t);
6127 
6128                         if (t->t_schedflag & TS_ANYWAITQ)
6129                                 t->t_schedflag &= ~ TS_ANYWAITQ;
6130 
6131                         thread_unlock(t);
6132                 } while ((t = t->t_forw) != pp->p_tlist);
6133         }
6134 
6135         /*
6136          * If there is a default scheduling class for the zone and it is not
6137          * the class we are currently in, change all of the threads in the
6138          * process to the new class.  We need to be holding pidlock & p_lock
6139          * when we call parmsset so this is a good place to do it.
6140          */
6141         if (zone->zone_defaultcid > 0 &&
6142             zone->zone_defaultcid != curthread->t_cid) {
6143                 pcparms_t pcparms;
6144 
6145                 pcparms.pc_cid = zone->zone_defaultcid;
6146                 pcparms.pc_clparms[0] = 0;
6147 
6148                 /*
6149                  * If setting the class fails, we still want to enter the zone.
6150                  */
6151                 if ((t = pp->p_tlist) != NULL) {
6152                         do {
6153                                 (void) parmsset(&pcparms, t);
6154                         } while ((t = t->t_forw) != pp->p_tlist);
6155                 }
6156         }
6157 
6158         mutex_exit(&pp->p_lock);
6159         mutex_exit(&pidlock);
6160 
6161         mutex_exit(&zonehash_lock);
6162         /*
6163          * We're firmly in the zone; let pools progress.
6164          */
6165         pool_unlock();
6166         task_rele(oldtk);
6167         /*
6168          * We don't need to retain a hold on the zone since we already
6169          * incremented zone_ntasks, so the zone isn't going anywhere.
6170          */
6171         zone_rele(zone);
6172 
6173         /*
6174          * Chroot
6175          */
6176         vp = zone->zone_rootvp;
6177         zone_chdir(vp, &PTOU(pp)->u_cdir, pp);
6178         zone_chdir(vp, &PTOU(pp)->u_rdir, pp);
6179 
6180         /*
6181          * Change process credentials
6182          */
6183         newcr = cralloc();
6184         mutex_enter(&pp->p_crlock);
6185         cr = pp->p_cred;
6186         crcopy_to(cr, newcr);
6187         crsetzone(newcr, zone);
6188         pp->p_cred = newcr;
6189 
6190         /*
6191          * Restrict all process privilege sets to zone limit
6192          */
6193         priv_intersect(zone->zone_privset, &CR_PPRIV(newcr));
6194         priv_intersect(zone->zone_privset, &CR_EPRIV(newcr));
6195         priv_intersect(zone->zone_privset, &CR_IPRIV(newcr));
6196         priv_intersect(zone->zone_privset, &CR_LPRIV(newcr));
6197         mutex_exit(&pp->p_crlock);
6198         crset(pp, newcr);
6199 
6200         /*
6201          * Adjust upcount to reflect zone entry.
6202          */
6203         uid = crgetruid(newcr);
6204         mutex_enter(&pidlock);
6205         upcount_dec(uid, GLOBAL_ZONEID);
6206         upcount_inc(uid, zoneid);
6207         mutex_exit(&pidlock);
6208 
6209         /*
6210          * Set up core file path and content.
6211          */
6212         set_core_defaults();
6213 
6214 out:
6215         /*
6216          * Let the other lwps continue.
6217          */
6218         mutex_enter(&pp->p_lock);
6219         if (curthread != pp->p_agenttp)
6220                 continuelwps(pp);
6221         mutex_exit(&pp->p_lock);
6222 
6223         return (err != 0 ? set_errno(err) : 0);
6224 }
6225 
6226 /*
6227  * Systemcall entry point for zone_list(2).
6228  *
6229  * Processes running in a (non-global) zone only see themselves.
6230  * On labeled systems, they see all zones whose label they dominate.
6231  */
6232 static int
6233 zone_list(zoneid_t *zoneidlist, uint_t *numzones)
6234 {
6235         zoneid_t *zoneids;
6236         zone_t *zone, *myzone;
6237         uint_t user_nzones, real_nzones;
6238         uint_t domi_nzones;
6239         int error;
6240 
6241         if (copyin(numzones, &user_nzones, sizeof (uint_t)) != 0)
6242                 return (set_errno(EFAULT));
6243 
6244         myzone = curproc->p_zone;
6245         if (myzone != global_zone) {
6246                 bslabel_t *mybslab;
6247 
6248                 if (!is_system_labeled()) {
6249                         /* just return current zone */
6250                         real_nzones = domi_nzones = 1;
6251                         zoneids = kmem_alloc(sizeof (zoneid_t), KM_SLEEP);
6252                         zoneids[0] = myzone->zone_id;
6253                 } else {
6254                         /* return all zones that are dominated */
6255                         mutex_enter(&zonehash_lock);
6256                         real_nzones = zonecount;
6257                         domi_nzones = 0;
6258                         if (real_nzones > 0) {
6259                                 zoneids = kmem_alloc(real_nzones *
6260                                     sizeof (zoneid_t), KM_SLEEP);
6261                                 mybslab = label2bslabel(myzone->zone_slabel);
6262                                 for (zone = list_head(&zone_active);
6263                                     zone != NULL;
6264                                     zone = list_next(&zone_active, zone)) {
6265                                         if (zone->zone_id == GLOBAL_ZONEID)
6266                                                 continue;
6267                                         if (zone != myzone &&
6268                                             (zone->zone_flags & ZF_IS_SCRATCH))
6269                                                 continue;
6270                                         /*
6271                                          * Note that a label always dominates
6272                                          * itself, so myzone is always included
6273                                          * in the list.
6274                                          */
6275                                         if (bldominates(mybslab,
6276                                             label2bslabel(zone->zone_slabel))) {
6277                                                 zoneids[domi_nzones++] =
6278                                                     zone->zone_id;
6279                                         }
6280                                 }
6281                         }
6282                         mutex_exit(&zonehash_lock);
6283                 }
6284         } else {
6285                 mutex_enter(&zonehash_lock);
6286                 real_nzones = zonecount;
6287                 domi_nzones = 0;
6288                 if (real_nzones > 0) {
6289                         zoneids = kmem_alloc(real_nzones * sizeof (zoneid_t),
6290                             KM_SLEEP);
6291                         for (zone = list_head(&zone_active); zone != NULL;
6292                             zone = list_next(&zone_active, zone))
6293                                 zoneids[domi_nzones++] = zone->zone_id;
6294                         ASSERT(domi_nzones == real_nzones);
6295                 }
6296                 mutex_exit(&zonehash_lock);
6297         }
6298 
6299         /*
6300          * If user has allocated space for fewer entries than we found, then
6301          * return only up to his limit.  Either way, tell him exactly how many
6302          * we found.
6303          */
6304         if (domi_nzones < user_nzones)
6305                 user_nzones = domi_nzones;
6306         error = 0;
6307         if (copyout(&domi_nzones, numzones, sizeof (uint_t)) != 0) {
6308                 error = EFAULT;
6309         } else if (zoneidlist != NULL && user_nzones != 0) {
6310                 if (copyout(zoneids, zoneidlist,
6311                     user_nzones * sizeof (zoneid_t)) != 0)
6312                         error = EFAULT;
6313         }
6314 
6315         if (real_nzones > 0)
6316                 kmem_free(zoneids, real_nzones * sizeof (zoneid_t));
6317 
6318         if (error != 0)
6319                 return (set_errno(error));
6320         else
6321                 return (0);
6322 }
6323 
6324 /*
6325  * Systemcall entry point for zone_lookup(2).
6326  *
6327  * Non-global zones are only able to see themselves and (on labeled systems)
6328  * the zones they dominate.
6329  */
6330 static zoneid_t
6331 zone_lookup(const char *zone_name)
6332 {
6333         char *kname;
6334         zone_t *zone;
6335         zoneid_t zoneid;
6336         int err;
6337 
6338         if (zone_name == NULL) {
6339                 /* return caller's zone id */
6340                 return (getzoneid());
6341         }
6342 
6343         kname = kmem_zalloc(ZONENAME_MAX, KM_SLEEP);
6344         if ((err = copyinstr(zone_name, kname, ZONENAME_MAX, NULL)) != 0) {
6345                 kmem_free(kname, ZONENAME_MAX);
6346                 return (set_errno(err));
6347         }
6348 
6349         mutex_enter(&zonehash_lock);
6350         zone = zone_find_all_by_name(kname);
6351         kmem_free(kname, ZONENAME_MAX);
6352         /*
6353          * In a non-global zone, can only lookup global and own name.
6354          * In Trusted Extensions zone label dominance rules apply.
6355          */
6356         if (zone == NULL ||
6357             zone_status_get(zone) < ZONE_IS_READY ||
6358             !zone_list_access(zone)) {
6359                 mutex_exit(&zonehash_lock);
6360                 return (set_errno(EINVAL));
6361         } else {
6362                 zoneid = zone->zone_id;
6363                 mutex_exit(&zonehash_lock);
6364                 return (zoneid);
6365         }
6366 }
6367 
6368 static int
6369 zone_version(int *version_arg)
6370 {
6371         int version = ZONE_SYSCALL_API_VERSION;
6372 
6373         if (copyout(&version, version_arg, sizeof (int)) != 0)
6374                 return (set_errno(EFAULT));
6375         return (0);
6376 }
6377 
6378 /* ARGSUSED */
6379 long
6380 zone(int cmd, void *arg1, void *arg2, void *arg3, void *arg4)
6381 {
6382         zone_def zs;
6383         int err;
6384 
6385         switch (cmd) {
6386         case ZONE_CREATE:
6387                 if (get_udatamodel() == DATAMODEL_NATIVE) {
6388                         if (copyin(arg1, &zs, sizeof (zone_def))) {
6389                                 return (set_errno(EFAULT));
6390                         }
6391                 } else {
6392 #ifdef _SYSCALL32_IMPL
6393                         zone_def32 zs32;
6394 
6395                         if (copyin(arg1, &zs32, sizeof (zone_def32))) {
6396                                 return (set_errno(EFAULT));
6397                         }
6398                         zs.zone_name =
6399                             (const char *)(unsigned long)zs32.zone_name;
6400                         zs.zone_root =
6401                             (const char *)(unsigned long)zs32.zone_root;
6402                         zs.zone_privs =
6403                             (const struct priv_set *)
6404                             (unsigned long)zs32.zone_privs;
6405                         zs.zone_privssz = zs32.zone_privssz;
6406                         zs.rctlbuf = (caddr_t)(unsigned long)zs32.rctlbuf;
6407                         zs.rctlbufsz = zs32.rctlbufsz;
6408                         zs.zfsbuf = (caddr_t)(unsigned long)zs32.zfsbuf;
6409                         zs.zfsbufsz = zs32.zfsbufsz;
6410                         zs.extended_error =
6411                             (int *)(unsigned long)zs32.extended_error;
6412                         zs.match = zs32.match;
6413                         zs.doi = zs32.doi;
6414                         zs.label = (const bslabel_t *)(uintptr_t)zs32.label;
6415                         zs.flags = zs32.flags;
6416 #else
6417                         panic("get_udatamodel() returned bogus result\n");
6418 #endif
6419                 }
6420 
6421                 return (zone_create(zs.zone_name, zs.zone_root,
6422                     zs.zone_privs, zs.zone_privssz,
6423                     (caddr_t)zs.rctlbuf, zs.rctlbufsz,
6424                     (caddr_t)zs.zfsbuf, zs.zfsbufsz,
6425                     zs.extended_error, zs.match, zs.doi,
6426                     zs.label, zs.flags));
6427         case ZONE_BOOT:
6428                 return (zone_boot((zoneid_t)(uintptr_t)arg1));
6429         case ZONE_DESTROY:
6430                 return (zone_destroy((zoneid_t)(uintptr_t)arg1));
6431         case ZONE_GETATTR:
6432                 return (zone_getattr((zoneid_t)(uintptr_t)arg1,
6433                     (int)(uintptr_t)arg2, arg3, (size_t)arg4));
6434         case ZONE_SETATTR:
6435                 return (zone_setattr((zoneid_t)(uintptr_t)arg1,
6436                     (int)(uintptr_t)arg2, arg3, (size_t)arg4));
6437         case ZONE_ENTER:
6438                 return (zone_enter((zoneid_t)(uintptr_t)arg1));
6439         case ZONE_LIST:
6440                 return (zone_list((zoneid_t *)arg1, (uint_t *)arg2));
6441         case ZONE_SHUTDOWN:
6442                 return (zone_shutdown((zoneid_t)(uintptr_t)arg1));
6443         case ZONE_LOOKUP:
6444                 return (zone_lookup((const char *)arg1));
6445         case ZONE_VERSION:
6446                 return (zone_version((int *)arg1));
6447         case ZONE_ADD_DATALINK:
6448                 return (zone_add_datalink((zoneid_t)(uintptr_t)arg1,
6449                     (datalink_id_t)(uintptr_t)arg2));
6450         case ZONE_DEL_DATALINK:
6451                 return (zone_remove_datalink((zoneid_t)(uintptr_t)arg1,
6452                     (datalink_id_t)(uintptr_t)arg2));
6453         case ZONE_CHECK_DATALINK: {
6454                 zoneid_t        zoneid;
6455                 boolean_t       need_copyout;
6456 
6457                 if (copyin(arg1, &zoneid, sizeof (zoneid)) != 0)
6458                         return (EFAULT);
6459                 need_copyout = (zoneid == ALL_ZONES);
6460                 err = zone_check_datalink(&zoneid,
6461                     (datalink_id_t)(uintptr_t)arg2);
6462                 if (err == 0 && need_copyout) {
6463                         if (copyout(&zoneid, arg1, sizeof (zoneid)) != 0)
6464                                 err = EFAULT;
6465                 }
6466                 return (err == 0 ? 0 : set_errno(err));
6467         }
6468         case ZONE_LIST_DATALINK:
6469                 return (zone_list_datalink((zoneid_t)(uintptr_t)arg1,
6470                     (int *)arg2, (datalink_id_t *)(uintptr_t)arg3));
6471         default:
6472                 return (set_errno(EINVAL));
6473         }
6474 }
6475 
6476 struct zarg {
6477         zone_t *zone;
6478         zone_cmd_arg_t arg;
6479 };
6480 
6481 static int
6482 zone_lookup_door(const char *zone_name, door_handle_t *doorp)
6483 {
6484         char *buf;
6485         size_t buflen;
6486         int error;
6487 
6488         buflen = sizeof (ZONE_DOOR_PATH) + strlen(zone_name);
6489         buf = kmem_alloc(buflen, KM_SLEEP);
6490         (void) snprintf(buf, buflen, ZONE_DOOR_PATH, zone_name);
6491         error = door_ki_open(buf, doorp);
6492         kmem_free(buf, buflen);
6493         return (error);
6494 }
6495 
6496 static void
6497 zone_release_door(door_handle_t *doorp)
6498 {
6499         door_ki_rele(*doorp);
6500         *doorp = NULL;
6501 }
6502 
6503 static void
6504 zone_ki_call_zoneadmd(struct zarg *zargp)
6505 {
6506         door_handle_t door = NULL;
6507         door_arg_t darg, save_arg;
6508         char *zone_name;
6509         size_t zone_namelen;
6510         zoneid_t zoneid;
6511         zone_t *zone;
6512         zone_cmd_arg_t arg;
6513         uint64_t uniqid;
6514         size_t size;
6515         int error;
6516         int retry;
6517 
6518         zone = zargp->zone;
6519         arg = zargp->arg;
6520         kmem_free(zargp, sizeof (*zargp));
6521 
6522         zone_namelen = strlen(zone->zone_name) + 1;
6523         zone_name = kmem_alloc(zone_namelen, KM_SLEEP);
6524         bcopy(zone->zone_name, zone_name, zone_namelen);
6525         zoneid = zone->zone_id;
6526         uniqid = zone->zone_uniqid;
6527         /*
6528          * zoneadmd may be down, but at least we can empty out the zone.
6529          * We can ignore the return value of zone_empty() since we're called
6530          * from a kernel thread and know we won't be delivered any signals.
6531          */
6532         ASSERT(curproc == &p0);
6533         (void) zone_empty(zone);
6534         ASSERT(zone_status_get(zone) >= ZONE_IS_EMPTY);
6535         zone_rele(zone);
6536 
6537         size = sizeof (arg);
6538         darg.rbuf = (char *)&arg;
6539         darg.data_ptr = (char *)&arg;
6540         darg.rsize = size;
6541         darg.data_size = size;
6542         darg.desc_ptr = NULL;
6543         darg.desc_num = 0;
6544 
6545         save_arg = darg;
6546         /*
6547          * Since we're not holding a reference to the zone, any number of
6548          * things can go wrong, including the zone disappearing before we get a
6549          * chance to talk to zoneadmd.
6550          */
6551         for (retry = 0; /* forever */; retry++) {
6552                 if (door == NULL &&
6553                     (error = zone_lookup_door(zone_name, &door)) != 0) {
6554                         goto next;
6555                 }
6556                 ASSERT(door != NULL);
6557 
6558                 if ((error = door_ki_upcall_limited(door, &darg, NULL,
6559                     SIZE_MAX, 0)) == 0) {
6560                         break;
6561                 }
6562                 switch (error) {
6563                 case EINTR:
6564                         /* FALLTHROUGH */
6565                 case EAGAIN:    /* process may be forking */
6566                         /*
6567                          * Back off for a bit
6568                          */
6569                         break;
6570                 case EBADF:
6571                         zone_release_door(&door);
6572                         if (zone_lookup_door(zone_name, &door) != 0) {
6573                                 /*
6574                                  * zoneadmd may be dead, but it may come back to
6575                                  * life later.
6576                                  */
6577                                 break;
6578                         }
6579                         break;
6580                 default:
6581                         cmn_err(CE_WARN,
6582                             "zone_ki_call_zoneadmd: door_ki_upcall error %d\n",
6583                             error);
6584                         goto out;
6585                 }
6586 next:
6587                 /*
6588                  * If this isn't the same zone_t that we originally had in mind,
6589                  * then this is the same as if two kadmin requests come in at
6590                  * the same time: the first one wins.  This means we lose, so we
6591                  * bail.
6592                  */
6593                 if ((zone = zone_find_by_id(zoneid)) == NULL) {
6594                         /*
6595                          * Problem is solved.
6596                          */
6597                         break;
6598                 }
6599                 if (zone->zone_uniqid != uniqid) {
6600                         /*
6601                          * zoneid recycled
6602                          */
6603                         zone_rele(zone);
6604                         break;
6605                 }
6606                 /*
6607                  * We could zone_status_timedwait(), but there doesn't seem to
6608                  * be much point in doing that (plus, it would mean that
6609                  * zone_free() isn't called until this thread exits).
6610                  */
6611                 zone_rele(zone);
6612                 delay(hz);
6613                 darg = save_arg;
6614         }
6615 out:
6616         if (door != NULL) {
6617                 zone_release_door(&door);
6618         }
6619         kmem_free(zone_name, zone_namelen);
6620         thread_exit();
6621 }
6622 
6623 /*
6624  * Entry point for uadmin() to tell the zone to go away or reboot.  Analog to
6625  * kadmin().  The caller is a process in the zone.
6626  *
6627  * In order to shutdown the zone, we will hand off control to zoneadmd
6628  * (running in the global zone) via a door.  We do a half-hearted job at
6629  * killing all processes in the zone, create a kernel thread to contact
6630  * zoneadmd, and make note of the "uniqid" of the zone.  The uniqid is
6631  * a form of generation number used to let zoneadmd (as well as
6632  * zone_destroy()) know exactly which zone they're re talking about.
6633  */
6634 int
6635 zone_kadmin(int cmd, int fcn, const char *mdep, cred_t *credp)
6636 {
6637         struct zarg *zargp;
6638         zone_cmd_t zcmd;
6639         zone_t *zone;
6640 
6641         zone = curproc->p_zone;
6642         ASSERT(getzoneid() != GLOBAL_ZONEID);
6643 
6644         switch (cmd) {
6645         case A_SHUTDOWN:
6646                 switch (fcn) {
6647                 case AD_HALT:
6648                 case AD_POWEROFF:
6649                         zcmd = Z_HALT;
6650                         break;
6651                 case AD_BOOT:
6652                         zcmd = Z_REBOOT;
6653                         break;
6654                 case AD_IBOOT:
6655                 case AD_SBOOT:
6656                 case AD_SIBOOT:
6657                 case AD_NOSYNC:
6658                         return (ENOTSUP);
6659                 default:
6660                         return (EINVAL);
6661                 }
6662                 break;
6663         case A_REBOOT:
6664                 zcmd = Z_REBOOT;
6665                 break;
6666         case A_FTRACE:
6667         case A_REMOUNT:
6668         case A_FREEZE:
6669         case A_DUMP:
6670         case A_CONFIG:
6671                 return (ENOTSUP);
6672         default:
6673                 ASSERT(cmd != A_SWAPCTL);       /* handled by uadmin() */
6674                 return (EINVAL);
6675         }
6676 
6677         if (secpolicy_zone_admin(credp, B_FALSE))
6678                 return (EPERM);
6679         mutex_enter(&zone_status_lock);
6680 
6681         /*
6682          * zone_status can't be ZONE_IS_EMPTY or higher since curproc
6683          * is in the zone.
6684          */
6685         ASSERT(zone_status_get(zone) < ZONE_IS_EMPTY);
6686         if (zone_status_get(zone) > ZONE_IS_RUNNING) {
6687                 /*
6688                  * This zone is already on its way down.
6689                  */
6690                 mutex_exit(&zone_status_lock);
6691                 return (0);
6692         }
6693         /*
6694          * Prevent future zone_enter()s
6695          */
6696         zone_status_set(zone, ZONE_IS_SHUTTING_DOWN);
6697         mutex_exit(&zone_status_lock);
6698 
6699         /*
6700          * Kill everyone now and call zoneadmd later.
6701          * zone_ki_call_zoneadmd() will do a more thorough job of this
6702          * later.
6703          */
6704         killall(zone->zone_id);
6705         /*
6706          * Now, create the thread to contact zoneadmd and do the rest of the
6707          * work.  This thread can't be created in our zone otherwise
6708          * zone_destroy() would deadlock.
6709          */
6710         zargp = kmem_zalloc(sizeof (*zargp), KM_SLEEP);
6711         zargp->arg.cmd = zcmd;
6712         zargp->arg.uniqid = zone->zone_uniqid;
6713         zargp->zone = zone;
6714         (void) strcpy(zargp->arg.locale, "C");
6715         /* mdep was already copied in for us by uadmin */
6716         if (mdep != NULL)
6717                 (void) strlcpy(zargp->arg.bootbuf, mdep,
6718                     sizeof (zargp->arg.bootbuf));
6719         zone_hold(zone);
6720 
6721         (void) thread_create(NULL, 0, zone_ki_call_zoneadmd, zargp, 0, &p0,
6722             TS_RUN, minclsyspri);
6723         exit(CLD_EXITED, 0);
6724 
6725         return (EINVAL);
6726 }
6727 
6728 /*
6729  * Entry point so kadmin(A_SHUTDOWN, ...) can set the global zone's
6730  * status to ZONE_IS_SHUTTING_DOWN.
6731  *
6732  * This function also shuts down all running zones to ensure that they won't
6733  * fork new processes.
6734  */
6735 void
6736 zone_shutdown_global(void)
6737 {
6738         zone_t *current_zonep;
6739 
6740         ASSERT(INGLOBALZONE(curproc));
6741         mutex_enter(&zonehash_lock);
6742         mutex_enter(&zone_status_lock);
6743 
6744         /* Modify the global zone's status first. */
6745         ASSERT(zone_status_get(global_zone) == ZONE_IS_RUNNING);
6746         zone_status_set(global_zone, ZONE_IS_SHUTTING_DOWN);
6747 
6748         /*
6749          * Now change the states of all running zones to ZONE_IS_SHUTTING_DOWN.
6750          * We don't mark all zones with ZONE_IS_SHUTTING_DOWN because doing so
6751          * could cause assertions to fail (e.g., assertions about a zone's
6752          * state during initialization, readying, or booting) or produce races.
6753          * We'll let threads continue to initialize and ready new zones: they'll
6754          * fail to boot the new zones when they see that the global zone is
6755          * shutting down.
6756          */
6757         for (current_zonep = list_head(&zone_active); current_zonep != NULL;
6758             current_zonep = list_next(&zone_active, current_zonep)) {
6759                 if (zone_status_get(current_zonep) == ZONE_IS_RUNNING)
6760                         zone_status_set(current_zonep, ZONE_IS_SHUTTING_DOWN);
6761         }
6762         mutex_exit(&zone_status_lock);
6763         mutex_exit(&zonehash_lock);
6764 }
6765 
6766 /*
6767  * Returns true if the named dataset is visible in the current zone.
6768  * The 'write' parameter is set to 1 if the dataset is also writable.
6769  */
6770 int
6771 zone_dataset_visible(const char *dataset, int *write)
6772 {
6773         static int zfstype = -1;
6774         zone_dataset_t *zd;
6775         size_t len;
6776         zone_t *zone = curproc->p_zone;
6777         const char *name = NULL;
6778         vfs_t *vfsp = NULL;
6779 
6780         if (dataset[0] == '\0')
6781                 return (0);
6782 
6783         /*
6784          * Walk the list once, looking for datasets which match exactly, or
6785          * specify a dataset underneath an exported dataset.  If found, return
6786          * true and note that it is writable.
6787          */
6788         for (zd = list_head(&zone->zone_datasets); zd != NULL;
6789             zd = list_next(&zone->zone_datasets, zd)) {
6790 
6791                 len = strlen(zd->zd_dataset);
6792                 if (strlen(dataset) >= len &&
6793                     bcmp(dataset, zd->zd_dataset, len) == 0 &&
6794                     (dataset[len] == '\0' || dataset[len] == '/' ||
6795                     dataset[len] == '@')) {
6796                         if (write)
6797                                 *write = 1;
6798                         return (1);
6799                 }
6800         }
6801 
6802         /*
6803          * Walk the list a second time, searching for datasets which are parents
6804          * of exported datasets.  These should be visible, but read-only.
6805          *
6806          * Note that we also have to support forms such as 'pool/dataset/', with
6807          * a trailing slash.
6808          */
6809         for (zd = list_head(&zone->zone_datasets); zd != NULL;
6810             zd = list_next(&zone->zone_datasets, zd)) {
6811 
6812                 len = strlen(dataset);
6813                 if (dataset[len - 1] == '/')
6814                         len--;  /* Ignore trailing slash */
6815                 if (len < strlen(zd->zd_dataset) &&
6816                     bcmp(dataset, zd->zd_dataset, len) == 0 &&
6817                     zd->zd_dataset[len] == '/') {
6818                         if (write)
6819                                 *write = 0;
6820                         return (1);
6821                 }
6822         }
6823 
6824         /*
6825          * We reach here if the given dataset is not found in the zone_dataset
6826          * list. Check if this dataset was added as a filesystem (ie. "add fs")
6827          * instead of delegation. For this we search for the dataset in the
6828          * zone_vfslist of this zone. If found, return true and note that it is
6829          * not writable.
6830          */
6831 
6832         /*
6833          * Initialize zfstype if it is not initialized yet.
6834          */
6835         if (zfstype == -1) {
6836                 struct vfssw *vswp = vfs_getvfssw("zfs");
6837                 zfstype = vswp - vfssw;
6838                 vfs_unrefvfssw(vswp);
6839         }
6840 
6841         vfs_list_read_lock();
6842         vfsp = zone->zone_vfslist;
6843         do {
6844                 ASSERT(vfsp);
6845                 if (vfsp->vfs_fstype == zfstype) {
6846                         name = refstr_value(vfsp->vfs_resource);
6847 
6848                         /*
6849                          * Check if we have an exact match.
6850                          */
6851                         if (strcmp(dataset, name) == 0) {
6852                                 vfs_list_unlock();
6853                                 if (write)
6854                                         *write = 0;
6855                                 return (1);
6856                         }
6857                         /*
6858                          * We need to check if we are looking for parents of
6859                          * a dataset. These should be visible, but read-only.
6860                          */
6861                         len = strlen(dataset);
6862                         if (dataset[len - 1] == '/')
6863                                 len--;
6864 
6865                         if (len < strlen(name) &&
6866                             bcmp(dataset, name, len) == 0 && name[len] == '/') {
6867                                 vfs_list_unlock();
6868                                 if (write)
6869                                         *write = 0;
6870                                 return (1);
6871                         }
6872                 }
6873                 vfsp = vfsp->vfs_zone_next;
6874         } while (vfsp != zone->zone_vfslist);
6875 
6876         vfs_list_unlock();
6877         return (0);
6878 }
6879 
6880 /*
6881  * zone_find_by_any_path() -
6882  *
6883  * kernel-private routine similar to zone_find_by_path(), but which
6884  * effectively compares against zone paths rather than zonerootpath
6885  * (i.e., the last component of zonerootpaths, which should be "root/",
6886  * are not compared.)  This is done in order to accurately identify all
6887  * paths, whether zone-visible or not, including those which are parallel
6888  * to /root/, such as /dev/, /home/, etc...
6889  *
6890  * If the specified path does not fall under any zone path then global
6891  * zone is returned.
6892  *
6893  * The treat_abs parameter indicates whether the path should be treated as
6894  * an absolute path although it does not begin with "/".  (This supports
6895  * nfs mount syntax such as host:any/path.)
6896  *
6897  * The caller is responsible for zone_rele of the returned zone.
6898  */
6899 zone_t *
6900 zone_find_by_any_path(const char *path, boolean_t treat_abs)
6901 {
6902         zone_t *zone;
6903         int path_offset = 0;
6904 
6905         if (path == NULL) {
6906                 zone_hold(global_zone);
6907                 return (global_zone);
6908         }
6909 
6910         if (*path != '/') {
6911                 ASSERT(treat_abs);
6912                 path_offset = 1;
6913         }
6914 
6915         mutex_enter(&zonehash_lock);
6916         for (zone = list_head(&zone_active); zone != NULL;
6917             zone = list_next(&zone_active, zone)) {
6918                 char    *c;
6919                 size_t  pathlen;
6920                 char *rootpath_start;
6921 
6922                 if (zone == global_zone)        /* skip global zone */
6923                         continue;
6924 
6925                 /* scan backwards to find start of last component */
6926                 c = zone->zone_rootpath + zone->zone_rootpathlen - 2;
6927                 do {
6928                         c--;
6929                 } while (*c != '/');
6930 
6931                 pathlen = c - zone->zone_rootpath + 1 - path_offset;
6932                 rootpath_start = (zone->zone_rootpath + path_offset);
6933                 if (strncmp(path, rootpath_start, pathlen) == 0)
6934                         break;
6935         }
6936         if (zone == NULL)
6937                 zone = global_zone;
6938         zone_hold(zone);
6939         mutex_exit(&zonehash_lock);
6940         return (zone);
6941 }
6942 
6943 /*
6944  * Finds a zone_dl_t with the given linkid in the given zone.  Returns the
6945  * zone_dl_t pointer if found, and NULL otherwise.
6946  */
6947 static zone_dl_t *
6948 zone_find_dl(zone_t *zone, datalink_id_t linkid)
6949 {
6950         zone_dl_t *zdl;
6951 
6952         ASSERT(mutex_owned(&zone->zone_lock));
6953         for (zdl = list_head(&zone->zone_dl_list); zdl != NULL;
6954             zdl = list_next(&zone->zone_dl_list, zdl)) {
6955                 if (zdl->zdl_id == linkid)
6956                         break;
6957         }
6958         return (zdl);
6959 }
6960 
6961 static boolean_t
6962 zone_dl_exists(zone_t *zone, datalink_id_t linkid)
6963 {
6964         boolean_t exists;
6965 
6966         mutex_enter(&zone->zone_lock);
6967         exists = (zone_find_dl(zone, linkid) != NULL);
6968         mutex_exit(&zone->zone_lock);
6969         return (exists);
6970 }
6971 
6972 /*
6973  * Add an data link name for the zone.
6974  */
6975 static int
6976 zone_add_datalink(zoneid_t zoneid, datalink_id_t linkid)
6977 {
6978         zone_dl_t *zdl;
6979         zone_t *zone;
6980         zone_t *thiszone;
6981 
6982         if ((thiszone = zone_find_by_id(zoneid)) == NULL)
6983                 return (set_errno(ENXIO));
6984 
6985         /* Verify that the datalink ID doesn't already belong to a zone. */
6986         mutex_enter(&zonehash_lock);
6987         for (zone = list_head(&zone_active); zone != NULL;
6988             zone = list_next(&zone_active, zone)) {
6989                 if (zone_dl_exists(zone, linkid)) {
6990                         mutex_exit(&zonehash_lock);
6991                         zone_rele(thiszone);
6992                         return (set_errno((zone == thiszone) ? EEXIST : EPERM));
6993                 }
6994         }
6995 
6996         zdl = kmem_zalloc(sizeof (*zdl), KM_SLEEP);
6997         zdl->zdl_id = linkid;
6998         zdl->zdl_net = NULL;
6999         mutex_enter(&thiszone->zone_lock);
7000         list_insert_head(&thiszone->zone_dl_list, zdl);
7001         mutex_exit(&thiszone->zone_lock);
7002         mutex_exit(&zonehash_lock);
7003         zone_rele(thiszone);
7004         return (0);
7005 }
7006 
7007 static int
7008 zone_remove_datalink(zoneid_t zoneid, datalink_id_t linkid)
7009 {
7010         zone_dl_t *zdl;
7011         zone_t *zone;
7012         int err = 0;
7013 
7014         if ((zone = zone_find_by_id(zoneid)) == NULL)
7015                 return (set_errno(EINVAL));
7016 
7017         mutex_enter(&zone->zone_lock);
7018         if ((zdl = zone_find_dl(zone, linkid)) == NULL) {
7019                 err = ENXIO;
7020         } else {
7021                 list_remove(&zone->zone_dl_list, zdl);
7022                 nvlist_free(zdl->zdl_net);
7023                 kmem_free(zdl, sizeof (zone_dl_t));
7024         }
7025         mutex_exit(&zone->zone_lock);
7026         zone_rele(zone);
7027         return (err == 0 ? 0 : set_errno(err));
7028 }
7029 
7030 /*
7031  * Using the zoneidp as ALL_ZONES, we can lookup which zone has been assigned
7032  * the linkid.  Otherwise we just check if the specified zoneidp has been
7033  * assigned the supplied linkid.
7034  */
7035 int
7036 zone_check_datalink(zoneid_t *zoneidp, datalink_id_t linkid)
7037 {
7038         zone_t *zone;
7039         int err = ENXIO;
7040 
7041         if (*zoneidp != ALL_ZONES) {
7042                 if ((zone = zone_find_by_id(*zoneidp)) != NULL) {
7043                         if (zone_dl_exists(zone, linkid))
7044                                 err = 0;
7045                         zone_rele(zone);
7046                 }
7047                 return (err);
7048         }
7049 
7050         mutex_enter(&zonehash_lock);
7051         for (zone = list_head(&zone_active); zone != NULL;
7052             zone = list_next(&zone_active, zone)) {
7053                 if (zone_dl_exists(zone, linkid)) {
7054                         *zoneidp = zone->zone_id;
7055                         err = 0;
7056                         break;
7057                 }
7058         }
7059         mutex_exit(&zonehash_lock);
7060         return (err);
7061 }
7062 
7063 /*
7064  * Get the list of datalink IDs assigned to a zone.
7065  *
7066  * On input, *nump is the number of datalink IDs that can fit in the supplied
7067  * idarray.  Upon return, *nump is either set to the number of datalink IDs
7068  * that were placed in the array if the array was large enough, or to the
7069  * number of datalink IDs that the function needs to place in the array if the
7070  * array is too small.
7071  */
7072 static int
7073 zone_list_datalink(zoneid_t zoneid, int *nump, datalink_id_t *idarray)
7074 {
7075         uint_t num, dlcount;
7076         zone_t *zone;
7077         zone_dl_t *zdl;
7078         datalink_id_t *idptr = idarray;
7079 
7080         if (copyin(nump, &dlcount, sizeof (dlcount)) != 0)
7081                 return (set_errno(EFAULT));
7082         if ((zone = zone_find_by_id(zoneid)) == NULL)
7083                 return (set_errno(ENXIO));
7084 
7085         num = 0;
7086         mutex_enter(&zone->zone_lock);
7087         for (zdl = list_head(&zone->zone_dl_list); zdl != NULL;
7088             zdl = list_next(&zone->zone_dl_list, zdl)) {
7089                 /*
7090                  * If the list is bigger than what the caller supplied, just
7091                  * count, don't do copyout.
7092                  */
7093                 if (++num > dlcount)
7094                         continue;
7095                 if (copyout(&zdl->zdl_id, idptr, sizeof (*idptr)) != 0) {
7096                         mutex_exit(&zone->zone_lock);
7097                         zone_rele(zone);
7098                         return (set_errno(EFAULT));
7099                 }
7100                 idptr++;
7101         }
7102         mutex_exit(&zone->zone_lock);
7103         zone_rele(zone);
7104 
7105         /* Increased or decreased, caller should be notified. */
7106         if (num != dlcount) {
7107                 if (copyout(&num, nump, sizeof (num)) != 0)
7108                         return (set_errno(EFAULT));
7109         }
7110         return (0);
7111 }
7112 
7113 /*
7114  * Public interface for looking up a zone by zoneid. It's a customized version
7115  * for netstack_zone_create(). It can only be called from the zsd create
7116  * callbacks, since it doesn't have reference on the zone structure hence if
7117  * it is called elsewhere the zone could disappear after the zonehash_lock
7118  * is dropped.
7119  *
7120  * Furthermore it
7121  * 1. Doesn't check the status of the zone.
7122  * 2. It will be called even before zone_init is called, in that case the
7123  *    address of zone0 is returned directly, and netstack_zone_create()
7124  *    will only assign a value to zone0.zone_netstack, won't break anything.
7125  * 3. Returns without the zone being held.
7126  */
7127 zone_t *
7128 zone_find_by_id_nolock(zoneid_t zoneid)
7129 {
7130         zone_t *zone;
7131 
7132         mutex_enter(&zonehash_lock);
7133         if (zonehashbyid == NULL)
7134                 zone = &zone0;
7135         else
7136                 zone = zone_find_all_by_id(zoneid);
7137         mutex_exit(&zonehash_lock);
7138         return (zone);
7139 }
7140 
7141 /*
7142  * Walk the datalinks for a given zone
7143  */
7144 int
7145 zone_datalink_walk(zoneid_t zoneid, int (*cb)(datalink_id_t, void *),
7146     void *data)
7147 {
7148         zone_t          *zone;
7149         zone_dl_t       *zdl;
7150         datalink_id_t   *idarray;
7151         uint_t          idcount = 0;
7152         int             i, ret = 0;
7153 
7154         if ((zone = zone_find_by_id(zoneid)) == NULL)
7155                 return (ENOENT);
7156 
7157         /*
7158          * We first build an array of linkid's so that we can walk these and
7159          * execute the callback with the zone_lock dropped.
7160          */
7161         mutex_enter(&zone->zone_lock);
7162         for (zdl = list_head(&zone->zone_dl_list); zdl != NULL;
7163             zdl = list_next(&zone->zone_dl_list, zdl)) {
7164                 idcount++;
7165         }
7166 
7167         if (idcount == 0) {
7168                 mutex_exit(&zone->zone_lock);
7169                 zone_rele(zone);
7170                 return (0);
7171         }
7172 
7173         idarray = kmem_alloc(sizeof (datalink_id_t) * idcount, KM_NOSLEEP);
7174         if (idarray == NULL) {
7175                 mutex_exit(&zone->zone_lock);
7176                 zone_rele(zone);
7177                 return (ENOMEM);
7178         }
7179 
7180         for (i = 0, zdl = list_head(&zone->zone_dl_list); zdl != NULL;
7181             i++, zdl = list_next(&zone->zone_dl_list, zdl)) {
7182                 idarray[i] = zdl->zdl_id;
7183         }
7184 
7185         mutex_exit(&zone->zone_lock);
7186 
7187         for (i = 0; i < idcount && ret == 0; i++) {
7188                 if ((ret = (*cb)(idarray[i], data)) != 0)
7189                         break;
7190         }
7191 
7192         zone_rele(zone);
7193         kmem_free(idarray, sizeof (datalink_id_t) * idcount);
7194         return (ret);
7195 }
7196 
7197 static char *
7198 zone_net_type2name(int type)
7199 {
7200         switch (type) {
7201         case ZONE_NETWORK_ADDRESS:
7202                 return (ZONE_NET_ADDRNAME);
7203         case ZONE_NETWORK_DEFROUTER:
7204                 return (ZONE_NET_RTRNAME);
7205         default:
7206                 return (NULL);
7207         }
7208 }
7209 
7210 static int
7211 zone_set_network(zoneid_t zoneid, zone_net_data_t *znbuf)
7212 {
7213         zone_t *zone;
7214         zone_dl_t *zdl;
7215         nvlist_t *nvl;
7216         int err = 0;
7217         uint8_t *new = NULL;
7218         char *nvname;
7219         int bufsize;
7220         datalink_id_t linkid = znbuf->zn_linkid;
7221 
7222         if (secpolicy_zone_config(CRED()) != 0)
7223                 return (set_errno(EPERM));
7224 
7225         if (zoneid == GLOBAL_ZONEID)
7226                 return (set_errno(EINVAL));
7227 
7228         nvname = zone_net_type2name(znbuf->zn_type);
7229         bufsize = znbuf->zn_len;
7230         new = znbuf->zn_val;
7231         if (nvname == NULL)
7232                 return (set_errno(EINVAL));
7233 
7234         if ((zone = zone_find_by_id(zoneid)) == NULL) {
7235                 return (set_errno(EINVAL));
7236         }
7237 
7238         mutex_enter(&zone->zone_lock);
7239         if ((zdl = zone_find_dl(zone, linkid)) == NULL) {
7240                 err = ENXIO;
7241                 goto done;
7242         }
7243         if ((nvl = zdl->zdl_net) == NULL) {
7244                 if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP)) {
7245                         err = ENOMEM;
7246                         goto done;
7247                 } else {
7248                         zdl->zdl_net = nvl;
7249                 }
7250         }
7251         if (nvlist_exists(nvl, nvname)) {
7252                 err = EINVAL;
7253                 goto done;
7254         }
7255         err = nvlist_add_uint8_array(nvl, nvname, new, bufsize);
7256         ASSERT(err == 0);
7257 done:
7258         mutex_exit(&zone->zone_lock);
7259         zone_rele(zone);
7260         if (err != 0)
7261                 return (set_errno(err));
7262         else
7263                 return (0);
7264 }
7265 
7266 static int
7267 zone_get_network(zoneid_t zoneid, zone_net_data_t *znbuf)
7268 {
7269         zone_t *zone;
7270         zone_dl_t *zdl;
7271         nvlist_t *nvl;
7272         uint8_t *ptr;
7273         uint_t psize;
7274         int err = 0;
7275         char *nvname;
7276         int bufsize;
7277         void *buf;
7278         datalink_id_t linkid = znbuf->zn_linkid;
7279 
7280         if (zoneid == GLOBAL_ZONEID)
7281                 return (set_errno(EINVAL));
7282 
7283         nvname = zone_net_type2name(znbuf->zn_type);
7284         bufsize = znbuf->zn_len;
7285         buf = znbuf->zn_val;
7286 
7287         if (nvname == NULL)
7288                 return (set_errno(EINVAL));
7289         if ((zone = zone_find_by_id(zoneid)) == NULL)
7290                 return (set_errno(EINVAL));
7291 
7292         mutex_enter(&zone->zone_lock);
7293         if ((zdl = zone_find_dl(zone, linkid)) == NULL) {
7294                 err = ENXIO;
7295                 goto done;
7296         }
7297         if ((nvl = zdl->zdl_net) == NULL || !nvlist_exists(nvl, nvname)) {
7298                 err = ENOENT;
7299                 goto done;
7300         }
7301         err = nvlist_lookup_uint8_array(nvl, nvname, &ptr, &psize);
7302         ASSERT(err == 0);
7303 
7304         if (psize > bufsize) {
7305                 err = ENOBUFS;
7306                 goto done;
7307         }
7308         znbuf->zn_len = psize;
7309         bcopy(ptr, buf, psize);
7310 done:
7311         mutex_exit(&zone->zone_lock);
7312         zone_rele(zone);
7313         if (err != 0)
7314                 return (set_errno(err));
7315         else
7316                 return (0);
7317 }