zone.h revision 5880:3f55db3cd80f
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 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _SYS_ZONE_H
27#define	_SYS_ZONE_H
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31#include <sys/types.h>
32#include <sys/mutex.h>
33#include <sys/param.h>
34#include <sys/rctl.h>
35#include <sys/ipc_rctl.h>
36#include <sys/pset.h>
37#include <sys/tsol/label.h>
38#include <sys/cred.h>
39#include <sys/netstack.h>
40#include <sys/uadmin.h>
41
42#ifdef	__cplusplus
43extern "C" {
44#endif
45
46/*
47 * NOTE
48 *
49 * The contents of this file are private to the implementation of
50 * Solaris and are subject to change at any time without notice.
51 * Applications and drivers using these interfaces may fail to
52 * run on future releases.
53 */
54
55/* Available both in kernel and for user space */
56
57/* zone id restrictions and special ids */
58#define	MAX_ZONEID	9999
59#define	MIN_USERZONEID	1	/* lowest user-creatable zone ID */
60#define	MIN_ZONEID	0	/* minimum zone ID on system */
61#define	GLOBAL_ZONEID	0
62#define	ZONEID_WIDTH	4	/* for printf */
63
64/*
65 * Special zoneid_t token to refer to all zones.
66 */
67#define	ALL_ZONES	(-1)
68
69/* system call subcodes */
70#define	ZONE_CREATE		0
71#define	ZONE_DESTROY		1
72#define	ZONE_GETATTR		2
73#define	ZONE_ENTER		3
74#define	ZONE_LIST		4
75#define	ZONE_SHUTDOWN		5
76#define	ZONE_LOOKUP		6
77#define	ZONE_BOOT		7
78#define	ZONE_VERSION		8
79#define	ZONE_SETATTR		9
80#define	ZONE_ADD_DATALINK	10
81#define	ZONE_DEL_DATALINK	11
82#define	ZONE_CHECK_DATALINK	12
83#define	ZONE_LIST_DATALINK	13
84
85/* zone attributes */
86#define	ZONE_ATTR_ROOT		1
87#define	ZONE_ATTR_NAME		2
88#define	ZONE_ATTR_STATUS	3
89#define	ZONE_ATTR_PRIVSET	4
90#define	ZONE_ATTR_UNIQID	5
91#define	ZONE_ATTR_POOLID	6
92#define	ZONE_ATTR_INITPID	7
93#define	ZONE_ATTR_SLBL		8
94#define	ZONE_ATTR_INITNAME	9
95#define	ZONE_ATTR_BOOTARGS	10
96#define	ZONE_ATTR_BRAND		11
97#define	ZONE_ATTR_PHYS_MCAP	12
98#define	ZONE_ATTR_SCHED_CLASS	13
99#define	ZONE_ATTR_FLAGS		14
100
101/* Start of the brand-specific attribute namespace */
102#define	ZONE_ATTR_BRAND_ATTRS	32768
103
104#define	ZONE_EVENT_CHANNEL	"com.sun:zones:status"
105#define	ZONE_EVENT_STATUS_CLASS	"status"
106#define	ZONE_EVENT_STATUS_SUBCLASS	"change"
107
108#define	ZONE_EVENT_UNINITIALIZED	"uninitialized"
109#define	ZONE_EVENT_INITIALIZED		"initialized"
110#define	ZONE_EVENT_READY		"ready"
111#define	ZONE_EVENT_RUNNING		"running"
112#define	ZONE_EVENT_SHUTTING_DOWN	"shutting_down"
113
114#define	ZONE_CB_NAME		"zonename"
115#define	ZONE_CB_NEWSTATE	"newstate"
116#define	ZONE_CB_OLDSTATE	"oldstate"
117#define	ZONE_CB_TIMESTAMP	"when"
118#define	ZONE_CB_ZONEID		"zoneid"
119
120/*
121 * Exit values that may be returned by scripts or programs invoked by various
122 * zone commands.
123 *
124 * These are defined as:
125 *
126 *	ZONE_SUBPROC_OK
127 *	===============
128 *	The subprocess completed successfully.
129 *
130 *	ZONE_SUBPROC_USAGE
131 *	==================
132 *	The subprocess failed with a usage message, or a usage message should
133 *	be output in its behalf.
134 *
135 *	ZONE_SUBPROC_NOTCOMPLETE
136 *	========================
137 *	The subprocess did not complete, but the actions performed by the
138 *	subprocess require no recovery actions by the user.
139 *
140 *	For example, if the subprocess were called by "zoneadm install," the
141 *	installation of the zone did not succeed but the user need not perform
142 *	a "zoneadm uninstall" before attempting another install.
143 *
144 *	ZONE_SUBPROC_FATAL
145 *	==================
146 *	The subprocess failed in a fatal manner, usually one that will require
147 *	some type of recovery action by the user.
148 *
149 *	For example, if the subprocess were called by "zoneadm install," the
150 *	installation of the zone did not succeed and the user will need to
151 *	perform a "zoneadm uninstall" before another install attempt is
152 *	possible.
153 *
154 *	The non-success exit values are large to avoid accidental collision
155 *	with values used internally by some commands (e.g. "Z_ERR" and
156 *	"Z_USAGE" as used by zoneadm.)
157 */
158#define	ZONE_SUBPROC_OK			0
159#define	ZONE_SUBPROC_USAGE		253
160#define	ZONE_SUBPROC_NOTCOMPLETE	254
161#define	ZONE_SUBPROC_FATAL		255
162
163#ifdef _SYSCALL32
164typedef struct {
165	caddr32_t zone_name;
166	caddr32_t zone_root;
167	caddr32_t zone_privs;
168	size32_t zone_privssz;
169	caddr32_t rctlbuf;
170	size32_t rctlbufsz;
171	caddr32_t extended_error;
172	caddr32_t zfsbuf;
173	size32_t  zfsbufsz;
174	int match;			/* match level */
175	uint32_t doi;			/* DOI for label */
176	caddr32_t label;		/* label associated with zone */
177	int flags;
178} zone_def32;
179#endif
180typedef struct {
181	const char *zone_name;
182	const char *zone_root;
183	const struct priv_set *zone_privs;
184	size_t zone_privssz;
185	const char *rctlbuf;
186	size_t rctlbufsz;
187	int *extended_error;
188	const char *zfsbuf;
189	size_t zfsbufsz;
190	int match;			/* match level */
191	uint32_t doi;			/* DOI for label */
192	const bslabel_t *label;		/* label associated with zone */
193	int flags;
194} zone_def;
195
196/* extended error information */
197#define	ZE_UNKNOWN	0	/* No extended error info */
198#define	ZE_CHROOTED	1	/* tried to zone_create from chroot */
199#define	ZE_AREMOUNTS	2	/* there are mounts within the zone */
200#define	ZE_LABELINUSE	3	/* label is already in use by some other zone */
201
202/* zone_status */
203typedef enum {
204	ZONE_IS_UNINITIALIZED = 0,
205	ZONE_IS_INITIALIZED,
206	ZONE_IS_READY,
207	ZONE_IS_BOOTING,
208	ZONE_IS_RUNNING,
209	ZONE_IS_SHUTTING_DOWN,
210	ZONE_IS_EMPTY,
211	ZONE_IS_DOWN,
212	ZONE_IS_DYING,
213	ZONE_IS_DEAD
214} zone_status_t;
215#define	ZONE_MIN_STATE		ZONE_IS_UNINITIALIZED
216#define	ZONE_MAX_STATE		ZONE_IS_DEAD
217
218/*
219 * Valid commands which may be issued by zoneadm to zoneadmd.  The kernel also
220 * communicates with zoneadmd, but only uses Z_REBOOT and Z_HALT.
221 */
222typedef enum zone_cmd {
223	Z_READY, Z_BOOT, Z_FORCEBOOT, Z_REBOOT, Z_HALT, Z_NOTE_UNINSTALLING,
224	Z_MOUNT, Z_FORCEMOUNT, Z_UNMOUNT
225} zone_cmd_t;
226
227/*
228 * The structure of a request to zoneadmd.
229 */
230typedef struct zone_cmd_arg {
231	uint64_t	uniqid;		/* unique "generation number" */
232	zone_cmd_t	cmd;		/* requested action */
233	uint32_t	_pad;		/* need consistent 32/64 bit alignmt */
234	char locale[MAXPATHLEN];	/* locale in which to render messages */
235	char bootbuf[BOOTARGS_MAX];	/* arguments passed to zone_boot() */
236} zone_cmd_arg_t;
237
238/*
239 * Structure of zoneadmd's response to a request.  A NULL return value means
240 * the caller should attempt to restart zoneadmd and retry.
241 */
242typedef struct zone_cmd_rval {
243	int rval;			/* return value of request */
244	char errbuf[1];	/* variable-sized buffer containing error messages */
245} zone_cmd_rval_t;
246
247/*
248 * The zone support infrastructure uses the zone name as a component
249 * of unix domain (AF_UNIX) sockets, which are limited to 108 characters
250 * in length, so ZONENAME_MAX is limited by that.
251 */
252#define	ZONENAME_MAX		64
253
254#define	GLOBAL_ZONENAME		"global"
255
256/*
257 * Extended Regular expression (see regex(5)) which matches all valid zone
258 * names.
259 */
260#define	ZONENAME_REGEXP		"[a-zA-Z0-9][-_.a-zA-Z0-9]{0,62}"
261
262/*
263 * Where the zones support infrastructure places temporary files.
264 */
265#define	ZONES_TMPDIR		"/var/run/zones"
266
267/*
268 * The path to the door used by clients to communicate with zoneadmd.
269 */
270#define	ZONE_DOOR_PATH		ZONES_TMPDIR "/%s.zoneadmd_door"
271
272/* zone_flags */
273#define	ZF_HASHED_LABEL		0x2	/* zone has a unique label */
274#define	ZF_IS_SCRATCH		0x4	/* scratch zone */
275#define	ZF_NET_EXCL		0x8	/* Zone has an exclusive IP stack */
276
277/* zone_create flags */
278#define	ZCF_NET_EXCL		0x1	/* Create a zone with exclusive IP */
279
280#ifdef _KERNEL
281/*
282 * We need to protect the definition of 'list_t' from userland applications and
283 * libraries which may be defining ther own versions.
284 */
285#include <sys/list.h>
286
287#define	GLOBAL_ZONEUNIQID	0	/* uniqid of the global zone */
288
289struct pool;
290struct brand;
291struct dlnamelist;
292
293/*
294 * Structure to record list of ZFS datasets exported to a zone.
295 */
296typedef struct zone_dataset {
297	char		*zd_dataset;
298	list_node_t	zd_linkage;
299} zone_dataset_t;
300
301/*
302 * structure for zone kstats
303 */
304typedef struct zone_kstat {
305	kstat_named_t zk_zonename;
306	kstat_named_t zk_usage;
307	kstat_named_t zk_value;
308} zone_kstat_t;
309
310struct cpucap;
311
312typedef struct zone {
313	/*
314	 * zone_name is never modified once set.
315	 */
316	char		*zone_name;	/* zone's configuration name */
317	/*
318	 * zone_nodename and zone_domain are never freed once allocated.
319	 */
320	char		*zone_nodename;	/* utsname.nodename equivalent */
321	char		*zone_domain;	/* srpc_domain equivalent */
322	/*
323	 * zone_lock protects the following fields of a zone_t:
324	 * 	zone_ref
325	 * 	zone_cred_ref
326	 * 	zone_ntasks
327	 * 	zone_flags
328	 * 	zone_zsd
329	 */
330	kmutex_t	zone_lock;
331	/*
332	 * zone_linkage is the zone's linkage into the active or
333	 * death-row list.  The field is protected by zonehash_lock.
334	 */
335	list_node_t	zone_linkage;
336	zoneid_t	zone_id;	/* ID of zone */
337	uint_t		zone_ref;	/* count of zone_hold()s on zone */
338	uint_t		zone_cred_ref;	/* count of zone_hold_cred()s on zone */
339	/*
340	 * zone_rootvp and zone_rootpath can never be modified once set.
341	 */
342	struct vnode	*zone_rootvp;	/* zone's root vnode */
343	char		*zone_rootpath;	/* Path to zone's root + '/' */
344	ushort_t	zone_flags;	/* misc flags */
345	zone_status_t	zone_status;	/* protected by zone_status_lock */
346	uint_t		zone_ntasks;	/* number of tasks executing in zone */
347	kmutex_t	zone_nlwps_lock; /* protects zone_nlwps, and *_nlwps */
348					/* counters in projects and tasks */
349					/* that are within the zone */
350	rctl_qty_t	zone_nlwps;	/* number of lwps in zone */
351	rctl_qty_t	zone_nlwps_ctl; /* protected by zone_rctls->rcs_lock */
352	rctl_qty_t	zone_shmmax;	/* System V shared memory usage */
353	ipc_rqty_t	zone_ipc;	/* System V IPC id resource usage */
354
355	uint_t		zone_rootpathlen; /* strlen(zone_rootpath) + 1 */
356	uint32_t	zone_shares;	/* FSS shares allocated to zone */
357	rctl_set_t	*zone_rctls;	/* zone-wide (zone.*) rctls */
358	kmutex_t	zone_mem_lock;	/* protects zone_locked_mem and */
359					/* kpd_locked_mem for all */
360					/* projects in zone. */
361					/* Also protects zone_max_swap */
362					/* grab after p_lock, before rcs_lock */
363	rctl_qty_t	zone_locked_mem;	/* bytes of locked memory in */
364						/* zone */
365	rctl_qty_t	zone_locked_mem_ctl;	/* Current locked memory */
366						/* limit.  Protected by */
367						/* zone_rctls->rcs_lock */
368	rctl_qty_t	zone_max_swap; /* bytes of swap reserved by zone */
369	rctl_qty_t	zone_max_swap_ctl;	/* current swap limit. */
370						/* Protected by */
371						/* zone_rctls->rcs_lock */
372	list_t		zone_zsd;	/* list of Zone-Specific Data values */
373	kcondvar_t	zone_cv;	/* used to signal state changes */
374	struct proc	*zone_zsched;	/* Dummy kernel "zsched" process */
375	pid_t		zone_proc_initpid; /* pid of "init" for this zone */
376	char		*zone_initname;	/* fs path to 'init' */
377	int		zone_boot_err;  /* for zone_boot() if boot fails */
378	char		*zone_bootargs;	/* arguments passed via zone_boot() */
379	uint64_t	zone_phys_mcap;	/* physical memory cap */
380	/*
381	 * zone_kthreads is protected by zone_status_lock.
382	 */
383	kthread_t	*zone_kthreads;	/* kernel threads in zone */
384	struct priv_set	*zone_privset;	/* limit set for zone */
385	/*
386	 * zone_vfslist is protected by vfs_list_lock().
387	 */
388	struct vfs	*zone_vfslist;	/* list of FS's mounted in zone */
389	uint64_t	zone_uniqid;	/* unique zone generation number */
390	struct cred	*zone_kcred;	/* kcred-like, zone-limited cred */
391	/*
392	 * zone_pool is protected by pool_lock().
393	 */
394	struct pool	*zone_pool;	/* pool the zone is bound to */
395	hrtime_t	zone_pool_mod;	/* last pool bind modification time */
396	/* zone_psetid is protected by cpu_lock */
397	psetid_t	zone_psetid;	/* pset the zone is bound to */
398	/*
399	 * The following two can be read without holding any locks.  They are
400	 * updated under cpu_lock.
401	 */
402	int		zone_ncpus;  /* zone's idea of ncpus */
403	int		zone_ncpus_online; /* zone's idea of ncpus_online */
404	/*
405	 * List of ZFS datasets exported to this zone.
406	 */
407	list_t		zone_datasets;	/* list of datasets */
408
409	ts_label_t	*zone_slabel;	/* zone sensitivity label */
410	int		zone_match;	/* require label match for packets */
411	tsol_mlp_list_t zone_mlps;	/* MLPs on zone-private addresses */
412
413	boolean_t	zone_restart_init;	/* Restart init if it dies? */
414	struct brand	*zone_brand;		/* zone's brand */
415	void 		*zone_brand_data;	/* store brand specific data */
416	id_t		zone_defaultcid;	/* dflt scheduling class id */
417	kstat_t		*zone_swapresv_kstat;
418	kstat_t		*zone_lockedmem_kstat;
419	/*
420	 * zone_dl_list is protected by zone_lock
421	 */
422	struct dlnamelist *zone_dl_list;
423	netstack_t	*zone_netstack;
424	struct cpucap	*zone_cpucap;	/* CPU caps data */
425	/*
426	 * Solaris Auditing per-zone audit context
427	 */
428	struct au_kcontext	*zone_audit_kctxt;
429} zone_t;
430
431/*
432 * Special value of zone_psetid to indicate that pools are disabled.
433 */
434#define	ZONE_PS_INVAL	PS_MYID
435
436
437extern zone_t zone0;
438extern zone_t *global_zone;
439extern uint_t maxzones;
440extern rctl_hndl_t rc_zone_nlwps;
441
442extern long zone(int, void *, void *, void *, void *);
443extern void zone_zsd_init(void);
444extern void zone_init(void);
445extern void zone_hold(zone_t *);
446extern void zone_rele(zone_t *);
447extern void zone_cred_hold(zone_t *);
448extern void zone_cred_rele(zone_t *);
449extern void zone_task_hold(zone_t *);
450extern void zone_task_rele(zone_t *);
451extern zone_t *zone_find_by_id(zoneid_t);
452extern zone_t *zone_find_by_label(const ts_label_t *);
453extern zone_t *zone_find_by_name(char *);
454extern zone_t *zone_find_by_any_path(const char *, boolean_t);
455extern zone_t *zone_find_by_path(const char *);
456extern zoneid_t getzoneid(void);
457extern zone_t *zone_find_by_id_nolock(zoneid_t);
458
459/*
460 * Zone-specific data (ZSD) APIs
461 */
462/*
463 * The following is what code should be initializing its zone_key_t to if it
464 * calls zone_getspecific() without necessarily knowing that zone_key_create()
465 * has been called on the key.
466 */
467#define	ZONE_KEY_UNINITIALIZED	0
468
469typedef uint_t zone_key_t;
470
471extern void	zone_key_create(zone_key_t *, void *(*)(zoneid_t),
472    void (*)(zoneid_t, void *), void (*)(zoneid_t, void *));
473extern int 	zone_key_delete(zone_key_t);
474extern void	*zone_getspecific(zone_key_t, zone_t *);
475extern int	zone_setspecific(zone_key_t, zone_t *, const void *);
476
477/*
478 * The definition of a zsd_entry is truly private to zone.c and is only
479 * placed here so it can be shared with mdb.
480 *
481 * State maintained for each zone times each registered key, which tracks
482 * the state of the create, shutdown and destroy callbacks.
483 *
484 * zsd_flags is used to keep track of pending actions to avoid holding locks
485 * when calling the create/shutdown/destroy callbacks, since doing so
486 * could lead to deadlocks.
487 */
488struct zsd_entry {
489	zone_key_t		zsd_key;	/* Key used to lookup value */
490	void			*zsd_data;	/* Caller-managed value */
491	/*
492	 * Callbacks to be executed when a zone is created, shutdown, and
493	 * destroyed, respectively.
494	 */
495	void			*(*zsd_create)(zoneid_t);
496	void			(*zsd_shutdown)(zoneid_t, void *);
497	void			(*zsd_destroy)(zoneid_t, void *);
498	list_node_t		zsd_linkage;
499	uint16_t 		zsd_flags;	/* See below */
500	kcondvar_t		zsd_cv;
501};
502
503/*
504 * zsd_flags
505 */
506#define	ZSD_CREATE_NEEDED	0x0001
507#define	ZSD_CREATE_INPROGRESS	0x0002
508#define	ZSD_CREATE_COMPLETED	0x0004
509#define	ZSD_SHUTDOWN_NEEDED	0x0010
510#define	ZSD_SHUTDOWN_INPROGRESS	0x0020
511#define	ZSD_SHUTDOWN_COMPLETED	0x0040
512#define	ZSD_DESTROY_NEEDED	0x0100
513#define	ZSD_DESTROY_INPROGRESS	0x0200
514#define	ZSD_DESTROY_COMPLETED	0x0400
515
516#define	ZSD_CREATE_ALL	\
517	(ZSD_CREATE_NEEDED|ZSD_CREATE_INPROGRESS|ZSD_CREATE_COMPLETED)
518#define	ZSD_SHUTDOWN_ALL	\
519	(ZSD_SHUTDOWN_NEEDED|ZSD_SHUTDOWN_INPROGRESS|ZSD_SHUTDOWN_COMPLETED)
520#define	ZSD_DESTROY_ALL	\
521	(ZSD_DESTROY_NEEDED|ZSD_DESTROY_INPROGRESS|ZSD_DESTROY_COMPLETED)
522
523#define	ZSD_ALL_INPROGRESS \
524	(ZSD_CREATE_INPROGRESS|ZSD_SHUTDOWN_INPROGRESS|ZSD_DESTROY_INPROGRESS)
525
526/*
527 * Macros to help with zone visibility restrictions.
528 */
529
530/*
531 * Is process in the global zone?
532 */
533#define	INGLOBALZONE(p) \
534	((p)->p_zone == global_zone)
535
536/*
537 * Can process view objects in given zone?
538 */
539#define	HASZONEACCESS(p, zoneid) \
540	((p)->p_zone->zone_id == (zoneid) || INGLOBALZONE(p))
541
542/*
543 * Convenience macro to see if a resolved path is visible from within a
544 * given zone.
545 *
546 * The basic idea is that the first (zone_rootpathlen - 1) bytes of the
547 * two strings must be equal.  Since the rootpathlen has a trailing '/',
548 * we want to skip everything in the path up to (but not including) the
549 * trailing '/'.
550 */
551#define	ZONE_PATH_VISIBLE(path, zone) \
552	(strncmp((path), (zone)->zone_rootpath,		\
553	    (zone)->zone_rootpathlen - 1) == 0)
554
555/*
556 * Convenience macro to go from the global view of a path to that seen
557 * from within said zone.  It is the responsibility of the caller to
558 * ensure that the path is a resolved one (ie, no '..'s or '.'s), and is
559 * in fact visible from within the zone.
560 */
561#define	ZONE_PATH_TRANSLATE(path, zone)	\
562	(ASSERT(ZONE_PATH_VISIBLE(path, zone)),	\
563	(path) + (zone)->zone_rootpathlen - 2)
564
565/*
566 * Special processes visible in all zones.
567 */
568#define	ZONE_SPECIALPID(x)	 ((x) == 0 || (x) == 1)
569
570/*
571 * Zone-safe version of thread_create() to be used when the caller wants to
572 * create a kernel thread to run within the current zone's context.
573 */
574extern kthread_t *zthread_create(caddr_t, size_t, void (*)(), void *, size_t,
575    pri_t);
576extern void zthread_exit(void);
577
578/*
579 * Functions for an external observer to register interest in a zone's status
580 * change.  Observers will be woken up when the zone status equals the status
581 * argument passed in (in the case of zone_status_timedwait, the function may
582 * also return because of a timeout; zone_status_wait_sig may return early due
583 * to a signal being delivered; zone_status_timedwait_sig may return for any of
584 * the above reasons).
585 *
586 * Otherwise these behave identically to cv_timedwait(), cv_wait(), and
587 * cv_wait_sig() respectively.
588 */
589extern clock_t zone_status_timedwait(zone_t *, clock_t, zone_status_t);
590extern clock_t zone_status_timedwait_sig(zone_t *, clock_t, zone_status_t);
591extern void zone_status_wait(zone_t *, zone_status_t);
592extern int zone_status_wait_sig(zone_t *, zone_status_t);
593
594/*
595 * Get the status  of the zone (at the time it was called).  The state may
596 * have progressed by the time it is returned.
597 */
598extern zone_status_t zone_status_get(zone_t *);
599
600/*
601 * Get the "kcred" credentials corresponding to the given zone.
602 */
603extern struct cred *zone_get_kcred(zoneid_t);
604
605/*
606 * Get/set the pool the zone is currently bound to.
607 */
608extern struct pool *zone_pool_get(zone_t *);
609extern void zone_pool_set(zone_t *, struct pool *);
610
611/*
612 * Get/set the pset the zone is currently using.
613 */
614extern psetid_t zone_pset_get(zone_t *);
615extern void zone_pset_set(zone_t *, psetid_t);
616
617/*
618 * Get the number of cpus/online-cpus visible from the given zone.
619 */
620extern int zone_ncpus_get(zone_t *);
621extern int zone_ncpus_online_get(zone_t *);
622
623/*
624 * Returns true if the named pool/dataset is visible in the current zone.
625 */
626extern int zone_dataset_visible(const char *, int *);
627
628/*
629 * zone version of kadmin()
630 */
631extern int zone_kadmin(int, int, const char *, cred_t *);
632extern void zone_shutdown_global(void);
633
634extern void mount_in_progress(void);
635extern void mount_completed(void);
636
637extern int zone_walk(int (*)(zone_t *, void *), void *);
638
639extern rctl_hndl_t rc_zone_locked_mem;
640extern rctl_hndl_t rc_zone_max_swap;
641
642#endif	/* _KERNEL */
643
644#ifdef	__cplusplus
645}
646#endif
647
648#endif	/* _SYS_ZONE_H */
649