diff options
author | eh208807 <none@none> | 2007-08-09 16:19:02 -0700 |
---|---|---|
committer | eh208807 <none@none> | 2007-08-09 16:19:02 -0700 |
commit | 6ff14d8c34ba24afb23f87d044c08da8245f3c84 (patch) | |
tree | 64eea16ca0a5cd0e0d4cd170a285bfa50eb4cef6 /usr/src/uts | |
parent | 4a5b2e70a1a587f05589329302db05d4166477dd (diff) | |
download | illumos-joyent-6ff14d8c34ba24afb23f87d044c08da8245f3c84.tar.gz |
6574205 No support for abstract namespace UNIX sockets in lx brand library emulation
6584784 Symbolic links and access control broken in proc emulation for lx zone
6586078 Improved linux distribution support for lx brand
6587018 Per zone brand specific data structure needed
Diffstat (limited to 'usr/src/uts')
-rw-r--r-- | usr/src/uts/common/brand/lx/os/lx_brand.c | 74 | ||||
-rw-r--r-- | usr/src/uts/common/brand/lx/os/lx_syscall.c | 47 | ||||
-rw-r--r-- | usr/src/uts/common/brand/lx/procfs/lx_prvnops.c | 119 | ||||
-rw-r--r-- | usr/src/uts/common/brand/lx/sys/lx_brand.h | 20 | ||||
-rw-r--r-- | usr/src/uts/common/brand/lx/sys/lx_futex.h | 6 | ||||
-rw-r--r-- | usr/src/uts/common/brand/sn1/sn1_brand.c | 16 | ||||
-rw-r--r-- | usr/src/uts/common/os/zone.c | 7 | ||||
-rw-r--r-- | usr/src/uts/common/sys/brand.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/sys/zone.h | 1 |
9 files changed, 259 insertions, 33 deletions
diff --git a/usr/src/uts/common/brand/lx/os/lx_brand.c b/usr/src/uts/common/brand/lx/os/lx_brand.c index 3180028bd5..e9d417e123 100644 --- a/usr/src/uts/common/brand/lx/os/lx_brand.c +++ b/usr/src/uts/common/brand/lx/os/lx_brand.c @@ -57,11 +57,15 @@ int lx_debug = 0; +void lx_init_brand_data(zone_t *); +void lx_free_brand_data(zone_t *); void lx_setbrand(proc_t *); int lx_getattr(zone_t *, int, void *, size_t *); int lx_setattr(zone_t *, int, void *, size_t); int lx_brandsys(int, int64_t *, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); +int lx_get_kern_version(void); +void lx_set_kern_version(zone_t *, int); void lx_copy_procdata(proc_t *, proc_t *); extern void lx_setrval(klwp_t *, int, int); @@ -87,6 +91,8 @@ static int lx_elfexec(struct vnode *vp, struct execa *uap, struct uarg *args, /* lx brand */ struct brand_ops lx_brops = { + lx_init_brand_data, + lx_free_brand_data, lx_brandsys, lx_setbrand, lx_getattr, @@ -180,6 +186,7 @@ int lx_setattr(zone_t *zone, int attr, void *buf, size_t bufsize) { boolean_t val; + int num; if (attr == LX_ATTR_RESTART_INIT) { if (bufsize > sizeof (boolean_t)) @@ -190,6 +197,13 @@ lx_setattr(zone_t *zone, int attr, void *buf, size_t bufsize) return (EINVAL); zone->zone_restart_init = val; return (0); + } else if (attr == LX_KERN_VERSION_NUM) { + if (bufsize > sizeof (int)) + return (ERANGE); + if (copyin(buf, &num, sizeof (num)) != 0) + return (EFAULT); + lx_set_kern_version(zone, num); + return (0); } return (EINVAL); } @@ -198,6 +212,7 @@ lx_setattr(zone_t *zone, int attr, void *buf, size_t bufsize) int lx_getattr(zone_t *zone, int attr, void *buf, size_t *bufsize) { + int num; if (attr == LX_ATTR_RESTART_INIT) { if (*bufsize < sizeof (boolean_t)) return (ERANGE); @@ -206,6 +221,14 @@ lx_getattr(zone_t *zone, int attr, void *buf, size_t *bufsize) return (EFAULT); *bufsize = sizeof (boolean_t); return (0); + } else if (attr == LX_KERN_VERSION_NUM) { + if (*bufsize < sizeof (int)) + return (ERANGE); + num = lx_get_kern_version(); + if (copyout(&num, buf, sizeof (int)) != 0) + return (EFAULT); + *bufsize = sizeof (int); + return (0); } return (-EINVAL); } @@ -329,6 +352,27 @@ lx_brand_systrace_disable(void) lx_systrace_enabled = 0; } +void +lx_init_brand_data(zone_t *zone) +{ + lx_zone_data_t *data; + ASSERT(zone->zone_brand == &lx_brand); + ASSERT(zone->zone_brand_data == NULL); + data = (lx_zone_data_t *)kmem_zalloc(sizeof (lx_zone_data_t), KM_SLEEP); + /* + * Default kernel_version to LX_KERN_2_4, this can be changed by a call + * to setattr() which is made during zone boot + */ + data->kernel_version = LX_KERN_2_4; + zone->zone_brand_data = data; +} + +void +lx_free_brand_data(zone_t *zone) +{ + kmem_free(zone->zone_brand_data, sizeof (lx_zone_data_t)); +} + /* * Get the addresses of the user-space system call handler and attach it to * the proc structure. Returning 0 indicates success; the value returned @@ -548,6 +592,12 @@ lx_brandsys(int cmd, int64_t *rval, uintptr_t arg1, uintptr_t arg2, default: linux_call = cmd - B_EMULATE_SYSCALL; + /* + * Only checking against highest syscall number for all kernel + * versions, since check for specific kernel version is done + * in userland prior to this call, and duplicating logic would + * be redundant. + */ if (linux_call >= 0 && linux_call < LX_NSYSCALLS) { *rval = lx_emulate_syscall(linux_call, arg1, arg2, arg3, arg4, arg5, arg6); @@ -558,6 +608,24 @@ lx_brandsys(int cmd, int64_t *rval, uintptr_t arg1, uintptr_t arg2, return (EINVAL); } +int +lx_get_zone_kern_version(zone_t *zone) +{ + return (((lx_zone_data_t *)zone->zone_brand_data)->kernel_version); +} + +int +lx_get_kern_version() +{ + return (lx_get_zone_kern_version(curzone)); +} + +void +lx_set_kern_version(zone_t *zone, int vers) +{ + ((lx_zone_data_t *)zone->zone_brand_data)->kernel_version = vers; +} + /* * Copy the per-process brand data from a parent proc to a child. */ @@ -763,8 +831,10 @@ lx_elfexec(struct vnode *vp, struct execa *uap, struct uarg *args, * Linux 2.6 programs such as ps will print an error message if the * following aux entry is missing */ - phdr_auxv32[1].a_type = AT_CLKTCK; - phdr_auxv32[1].a_un.a_val = hz; + if (lx_get_kern_version() >= LX_KERN_2_6) { + phdr_auxv32[1].a_type = AT_CLKTCK; + phdr_auxv32[1].a_un.a_val = hz; + } if (copyout(&phdr_auxv32, args->auxp_brand, sizeof (phdr_auxv32)) == -1) diff --git a/usr/src/uts/common/brand/lx/os/lx_syscall.c b/usr/src/uts/common/brand/lx/os/lx_syscall.c index 686afea458..4ccefe1f2d 100644 --- a/usr/src/uts/common/brand/lx/os/lx_syscall.c +++ b/usr/src/uts/common/brand/lx/os/lx_syscall.c @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -342,9 +342,54 @@ lx_sysent_t lx_sysent[] = LX_NOSYS("statfs64"), LX_NOSYS("fstatfs64"), LX_NOSYS("tgkill"), /* 270 */ + /* The following are Linux 2.6 system calls */ LX_NOSYS("utimes"), LX_NOSYS("fadvise64_64"), LX_NOSYS("vserver"), + LX_NOSYS("mbind"), + LX_NOSYS("get_mempolicy"), + LX_NOSYS("set_mempolicy"), + LX_NOSYS("mq_open"), + LX_NOSYS("mq_unlink"), + LX_NOSYS("mq_timedsend"), + LX_NOSYS("mq_timedreceive"), /* 280 */ + LX_NOSYS("mq_notify"), + LX_NOSYS("mq_getsetattr"), + LX_NOSYS("kexec_load"), + LX_NOSYS("waitid"), + LX_NOSYS("sys_setaltroot"), + LX_NOSYS("add_key"), + LX_NOSYS("request_key"), + LX_NOSYS("keyctl"), + LX_NOSYS("ioprio_set"), + LX_NOSYS("ioprio_get"), /* 290 */ + LX_NOSYS("inotify_init"), + LX_NOSYS("inotify_add_watch"), + LX_NOSYS("inotify_rm_watch"), + LX_NOSYS("migrate_pages"), + LX_NOSYS("openat"), + LX_NOSYS("mkdirat"), + LX_NOSYS("mknodat"), + LX_NOSYS("fchownat"), + LX_NOSYS("futimesat"), + LX_NOSYS("fstatat64"), /* 300 */ + LX_NOSYS("unlinkat"), + LX_NOSYS("renameat"), + LX_NOSYS("linkat"), + LX_NOSYS("syslinkat"), + LX_NOSYS("readlinkat"), + LX_NOSYS("fchmodat"), + LX_NOSYS("faccessat"), + LX_NOSYS("pselect6"), + LX_NOSYS("ppoll"), + LX_NOSYS("unshare"), /* 310 */ + LX_NOSYS("set_robust_list"), + LX_NOSYS("get_robust_list"), + LX_NOSYS("splice"), + LX_NOSYS("sync_file_range"), + LX_NOSYS("tee"), + LX_NOSYS("vmsplice"), + LX_NOSYS("move_pages"), NULL /* NULL-termination is required for lx_systrace */ }; diff --git a/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c b/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c index 14fa5f9122..d08b37c5eb 100644 --- a/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c +++ b/usr/src/uts/common/brand/lx/procfs/lx_prvnops.c @@ -1539,10 +1539,16 @@ lxpr_read_partitions(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) static void lxpr_read_version(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) { + char *vers; + if (lx_get_zone_kern_version(LXPTOZ(lxpnp)) <= LX_KERN_2_4) + vers = LX_UNAME_RELEASE_2_4; + else + vers = LX_UNAME_RELEASE_2_6; + lxpr_uiobuf_printf(uiobuf, "%s version %s (%s version %d.%d.%d) " "#%s SMP %s\n", - LX_UNAME_SYSNAME, LX_UNAME_RELEASE, + LX_UNAME_SYSNAME, vers, #if defined(__GNUC__) "gcc", __GNUC__, @@ -1564,6 +1570,7 @@ lxpr_read_version(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) * */ /* ARGSUSED */ + static void lxpr_read_stat(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) { @@ -1572,6 +1579,10 @@ lxpr_read_stat(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) ulong_t idle_cum = 0; ulong_t sys_cum = 0; ulong_t user_cum = 0; + ulong_t irq_cum = 0; + uint_t cpu_nrunnable_cum = 0; + uint_t w_io_cum = 0; + ulong_t pgpgin_cum = 0; ulong_t pgpgout_cum = 0; ulong_t pgswapout_cum = 0; @@ -1580,6 +1591,9 @@ lxpr_read_stat(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) ulong_t pswitch_cum = 0; ulong_t forks_cum = 0; hrtime_t msnsecs[NCMSTATES]; + int lx_kern_version = lx_get_zone_kern_version(LXPTOZ(lxpnp)); + /* temporary variable since scalehrtime modifies data in place */ + hrtime_t tmptime; ASSERT(lxpnp->lxpr_type == LXPR_STAT); @@ -1610,6 +1624,16 @@ lxpr_read_stat(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) pgswapin_cum += CPU_STATS(cp, vm.pgswapin); pgswapout_cum += CPU_STATS(cp, vm.pgswapout); + if (lx_kern_version >= LX_KERN_2_6) { + cpu_nrunnable_cum += cp->cpu_disp->disp_nrunnable; + w_io_cum += CPU_STATS(cp, sys.iowait); + for (i = 0; i < NCMSTATES; i++) { + tmptime = cp->cpu_intracct[i]; + scalehrtime(&tmptime); + irq_cum += NSEC_TO_TICK(tmptime); + } + } + for (i = 0; i < PIL_MAX; i++) intr_cum += CPU_STATS(cp, sys.intr[i]); @@ -1623,15 +1647,24 @@ lxpr_read_stat(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) cp = cp->cpu_next; } while (cp != cpstart); - lxpr_uiobuf_printf(uiobuf, - "cpu %ld %ld %ld %ld\n", - user_cum, 0, sys_cum, idle_cum); + if (lx_kern_version >= LX_KERN_2_6) { + lxpr_uiobuf_printf(uiobuf, + "cpu %ld %ld %ld %ld %ld %ld %ld\n", + user_cum, 0, sys_cum, idle_cum, 0, irq_cum, 0); + } else { + lxpr_uiobuf_printf(uiobuf, + "cpu %ld %ld %ld %ld\n", + user_cum, 0, sys_cum, idle_cum); + } /* Do per processor stats */ do { + int i; + ulong_t idle_ticks; ulong_t sys_ticks; ulong_t user_ticks; + ulong_t irq_ticks = 0; /* * Don't count CPUs that aren't even in the system @@ -1647,10 +1680,23 @@ lxpr_read_stat(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) sys_ticks = NSEC_TO_TICK(msnsecs[CMS_SYSTEM]); user_ticks = NSEC_TO_TICK(msnsecs[CMS_USER]); - lxpr_uiobuf_printf(uiobuf, - "cpu%d %ld %ld %ld %ld\n", - cp->cpu_id, - user_ticks, 0, sys_ticks, idle_ticks); + if (lx_kern_version >= LX_KERN_2_6) { + for (i = 0; i < NCMSTATES; i++) { + tmptime = cp->cpu_intracct[i]; + scalehrtime(&tmptime); + irq_ticks += NSEC_TO_TICK(tmptime); + } + + lxpr_uiobuf_printf(uiobuf, + "cpu%d %ld %ld %ld %ld %ld %ld %ld\n", + cp->cpu_id, user_ticks, 0, sys_ticks, idle_ticks, + 0, irq_ticks, 0); + } else { + lxpr_uiobuf_printf(uiobuf, + "cpu%d %ld %ld %ld %ld\n", + cp->cpu_id, + user_ticks, 0, sys_ticks, idle_ticks); + } if (pools_enabled) cp = cp->cpu_next_part; @@ -1660,19 +1706,39 @@ lxpr_read_stat(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) mutex_exit(&cpu_lock); - lxpr_uiobuf_printf(uiobuf, - "page %lu %lu\n" - "swap %lu %lu\n" - "intr %lu\n" - "ctxt %lu\n" - "btime %lu\n" - "processes %lu\n", - pgpgin_cum, pgpgout_cum, - pgswapin_cum, pgswapout_cum, - intr_cum, - pswitch_cum, - boot_time, - forks_cum); + if (lx_kern_version >= LX_KERN_2_6) { + lxpr_uiobuf_printf(uiobuf, + "page %lu %lu\n" + "swap %lu %lu\n" + "intr %lu\n" + "ctxt %lu\n" + "btime %lu\n" + "processes %lu\n" + "procs_running %lu\n" + "procs_blocked %lu\n", + pgpgin_cum, pgpgout_cum, + pgswapin_cum, pgswapout_cum, + intr_cum, + pswitch_cum, + boot_time, + forks_cum, + cpu_nrunnable_cum, + w_io_cum); + } else { + lxpr_uiobuf_printf(uiobuf, + "page %lu %lu\n" + "swap %lu %lu\n" + "intr %lu\n" + "ctxt %lu\n" + "btime %lu\n" + "processes %lu\n", + pgpgin_cum, pgpgout_cum, + pgswapin_cum, pgswapout_cum, + intr_cum, + pswitch_cum, + boot_time, + forks_cum); + } } @@ -2099,6 +2165,10 @@ lxpr_access(vnode_t *vp, int mode, int flags, cred_t *cr) return (VOP_ACCESS(lxpnp->lxpr_realvp, mode, flags, cr)); } + /* If user is root allow access regardless of permission bits */ + if (secpolicy_proc_access(cr) == 0) + return (0); + /* * Access check is based on only * one of owner, group, public. @@ -2852,11 +2922,8 @@ lxpr_readlink(vnode_t *vp, uio_t *uiop, cred_t *cr) if (vp->v_type != VLNK) return (EINVAL); - /* - * Try to produce a symlink name for anything that's really a regular - * file or directory (but not for anything else) - */ - if (rvp != NULL && (rvp->v_type == VDIR || rvp->v_type == VREG)) { + /* Try to produce a symlink name for anything that has a realvp */ + if (rvp != NULL) { if ((error = lxpr_access(vp, VREAD, 0, CRED())) != 0) return (error); if ((error = vnodetopath(NULL, rvp, bp, buflen, CRED())) != 0) diff --git a/usr/src/uts/common/brand/lx/sys/lx_brand.h b/usr/src/uts/common/brand/lx/sys/lx_brand.h index 03ac9d09e6..b1d0281a32 100644 --- a/usr/src/uts/common/brand/lx/sys/lx_brand.h +++ b/usr/src/uts/common/brand/lx/sys/lx_brand.h @@ -31,6 +31,7 @@ #ifndef _ASM #include <sys/types.h> #include <sys/cpuvar.h> +#include <sys/zone.h> #endif #ifdef __cplusplus @@ -43,7 +44,8 @@ extern "C" { * Brand uname info */ #define LX_UNAME_SYSNAME "Linux" -#define LX_UNAME_RELEASE "2.4.21" +#define LX_UNAME_RELEASE_2_6 "2.6.18" +#define LX_UNAME_RELEASE_2_4 "2.4.21" #define LX_UNAME_VERSION "BrandZ fake linux" #define LX_UNAME_MACHINE "i686" @@ -54,7 +56,12 @@ extern "C" { #define LX_LIB "lx_brand.so.1" #define LX_LIB_PATH LIB_PATH LX_LIB -#define LX_NSYSCALLS 270 +#define LX_NSYSCALLS_2_4 270 +#define LX_NSYSCALLS_2_6 317 +#define LX_NSYSCALLS LX_NSYSCALLS_2_6 + +#define LX_KERN_2_4 0 +#define LX_KERN_2_6 1 /* * brand(2) subcommands @@ -76,6 +83,7 @@ extern "C" { #define LX_VERSION LX_VERSION_1 #define LX_ATTR_RESTART_INIT ZONE_ATTR_BRAND_ATTRS +#define LX_KERN_VERSION_NUM (ZONE_ATTR_BRAND_ATTRS + 1) /* Aux vector containing phdr of linux executable, used by lx_librtld_db */ #define AT_SUN_BRAND_LX_PHDR AT_SUN_BRAND_AUX1 @@ -193,6 +201,11 @@ typedef struct lx_lwp_data { uint_t br_ptrace; /* ptrace is active for this LWP */ } lx_lwp_data_t; +/* brand specific data */ +typedef struct lx_zone_data { + int kernel_version; +} lx_zone_data_t; + #define BR_CPU_BOUND 0x0001 #define ttolxlwp(t) ((struct lx_lwp_data *)ttolwpbrand(t)) @@ -203,6 +216,9 @@ void lx_brand_int80_callback(void); int64_t lx_emulate_syscall(int, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); +extern int lx_get_zone_kern_version(zone_t *); +extern int lx_get_kern_version(void); + extern int lx_debug; #define lx_print if (lx_debug) printf diff --git a/usr/src/uts/common/brand/lx/sys/lx_futex.h b/usr/src/uts/common/brand/lx/sys/lx_futex.h index ac963b015b..b5c5334bff 100644 --- a/usr/src/uts/common/brand/lx/sys/lx_futex.h +++ b/usr/src/uts/common/brand/lx/sys/lx_futex.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -39,10 +39,12 @@ extern "C" { #define FUTEX_CMP_REQUEUE 4 #define FUTEX_MAX_CMD FUTEX_CMP_REQUEUE +#ifdef _KERNEL extern long lx_futex(uintptr_t addr, int cmd, int val, uintptr_t lx_timeout, - uintptr_t addr2, int val2); + uintptr_t addr2, int val2); extern void lx_futex_init(void); extern int lx_futex_fini(void); +#endif /* _KERNEL */ #ifdef __cplusplus } diff --git a/usr/src/uts/common/brand/sn1/sn1_brand.c b/usr/src/uts/common/brand/sn1/sn1_brand.c index 25041d1b18..4c233ca407 100644 --- a/usr/src/uts/common/brand/sn1/sn1_brand.c +++ b/usr/src/uts/common/brand/sn1/sn1_brand.c @@ -43,6 +43,8 @@ char *sn1_emulation_table = NULL; +void sn1_init_brand_data(zone_t *); +void sn1_free_brand_data(zone_t *); void sn1_setbrand(proc_t *); int sn1_getattr(zone_t *, int, void *, size_t *); int sn1_setattr(zone_t *, int, void *, size_t); @@ -60,6 +62,8 @@ int sn1_elfexec(vnode_t *, execa_t *, uarg_t *, intpdata_t *, int, /* sn1 brand */ struct brand_ops sn1_brops = { + sn1_init_brand_data, + sn1_free_brand_data, sn1_brandsys, sn1_setbrand, sn1_getattr, @@ -202,6 +206,18 @@ sn1_initlwp(klwp_t *l) /*ARGSUSED*/ void +sn1_init_brand_data(zone_t *zone) +{ +} + +/*ARGSUSED*/ +void +sn1_free_brand_data(zone_t *zone) +{ +} + +/*ARGSUSED*/ +void sn1_forklwp(klwp_t *p, klwp_t *c) { } diff --git a/usr/src/uts/common/os/zone.c b/usr/src/uts/common/os/zone.c index 2468192505..c89945e756 100644 --- a/usr/src/uts/common/os/zone.c +++ b/usr/src/uts/common/os/zone.c @@ -1728,7 +1728,10 @@ zone_set_brand(zone_t *zone, const char *brand) return (EPERM); } + /* set up the brand specific data */ zone->zone_brand = bp; + ZBROP(zone)->b_init_brand_data(zone); + mutex_exit(&zone_status_lock); return (0); } @@ -3999,6 +4002,10 @@ zone_destroy(zoneid_t zoneid) /* Get rid of the zone's kstats */ zone_kstat_delete(zone); + /* free brand specific data */ + if (ZONE_IS_BRANDED(zone)) + ZBROP(zone)->b_free_brand_data(zone); + /* Say goodbye to brand framework. */ brand_unregister_zone(zone->zone_brand); diff --git a/usr/src/uts/common/sys/brand.h b/usr/src/uts/common/sys/brand.h index 99314a95f0..bf7d6d4359 100644 --- a/usr/src/uts/common/sys/brand.h +++ b/usr/src/uts/common/sys/brand.h @@ -75,6 +75,8 @@ struct intpdata; struct execa; struct brand_ops { + void (*b_init_brand_data)(zone_t *); + void (*b_free_brand_data)(zone_t *); int (*b_brandsys)(int, int64_t *, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t, uintptr_t); void (*b_setbrand)(struct proc *); diff --git a/usr/src/uts/common/sys/zone.h b/usr/src/uts/common/sys/zone.h index eba224333f..7e7dd9e88a 100644 --- a/usr/src/uts/common/sys/zone.h +++ b/usr/src/uts/common/sys/zone.h @@ -411,6 +411,7 @@ typedef struct zone { boolean_t zone_restart_init; /* Restart init if it dies? */ struct brand *zone_brand; /* zone's brand */ + void *zone_brand_data; /* store brand specific data */ id_t zone_defaultcid; /* dflt scheduling class id */ kstat_t *zone_swapresv_kstat; kstat_t *zone_lockedmem_kstat; |