diff options
Diffstat (limited to 'usr/src/cmd/zoneadmd')
| -rw-r--r-- | usr/src/cmd/zoneadmd/vplat.c | 28 | ||||
| -rw-r--r-- | usr/src/cmd/zoneadmd/zoneadmd.c | 51 | ||||
| -rw-r--r-- | usr/src/cmd/zoneadmd/zoneadmd.h | 5 |
3 files changed, 62 insertions, 22 deletions
diff --git a/usr/src/cmd/zoneadmd/vplat.c b/usr/src/cmd/zoneadmd/vplat.c index b4cc20951f..9e4dca604d 100644 --- a/usr/src/cmd/zoneadmd/vplat.c +++ b/usr/src/cmd/zoneadmd/vplat.c @@ -2471,6 +2471,7 @@ add_datalink(zlog_t *zlogp, char *zone_name, datalink_id_t linkid, char *dlname) { dladm_status_t err; boolean_t cpuset, poolset; + char *poolp; /* First check if it's in use by global zone. */ if (zonecfg_ifname_exists(AF_INET, dlname) || @@ -2508,8 +2509,9 @@ add_datalink(zlog_t *zlogp, char *zone_name, datalink_id_t linkid, char *dlname) } if ((strlen(pool_name) != 0) && !cpuset && !poolset) { + poolp = pool_name; err = dladm_set_linkprop(dld_handle, linkid, "pool", - &pool_name, 1, DLADM_OPT_ACTIVE); + &poolp, 1, DLADM_OPT_ACTIVE); if (err != DLADM_STATUS_OK) { zerror(zlogp, B_FALSE, "WARNING: unable to set " "pool %s to datalink %s", pool_name, dlname); @@ -2552,7 +2554,7 @@ ipv4_prefixlen(struct sockaddr_in *sin) m = SIN(&mask); m->sin_family = AF_INET; if (getnetmaskbyaddr(sin->sin_addr, &m->sin_addr) == 0) { - return (mask2plen(&mask)); + return (mask2plen((struct sockaddr *)&mask)); } else if (IN_CLASSA(htonl(sin->sin_addr.s_addr))) { return (8); } else if (IN_CLASSB(ntohl(sin->sin_addr.s_addr))) { @@ -3107,17 +3109,25 @@ remove_datalink_protect(zlog_t *zlogp, zoneid_t zoneid) } for (i = 0, dllink = dllinks; i < dlnum; i++, dllink++) { + char dlerr[DLADM_STRSIZE]; + dlstatus = dladm_set_linkprop(dld_handle, *dllink, "protection", NULL, 0, DLADM_OPT_ACTIVE); + if (dlstatus == DLADM_STATUS_NOTFOUND) { + /* datalink does not belong to the GZ */ + continue; + } if (dlstatus != DLADM_STATUS_OK) { - zerror(zlogp, B_TRUE, "could not reset protection\n"); + zerror(zlogp, B_FALSE, + dladm_status2str(dlstatus, dlerr)); free(dllinks); return (-1); } dlstatus = dladm_set_linkprop(dld_handle, *dllink, "allowed-ips", NULL, 0, DLADM_OPT_ACTIVE); if (dlstatus != DLADM_STATUS_OK) { - zerror(zlogp, B_TRUE, "could not reset allowed-ips\n"); + zerror(zlogp, B_FALSE, + dladm_status2str(dlstatus, dlerr)); free(dllinks); return (-1); } @@ -4508,6 +4518,8 @@ setup_zone_rm(zlog_t *zlogp, char *zone_name, zoneid_t zoneid) zerror(zlogp, B_FALSE, "WARNING: %s", zonecfg_strerror(res)); } + + /* Update saved pool name in case it has changed */ (void) zonecfg_get_poolname(handle, zone_name, pool_name, MAXPATHLEN); zonecfg_fini_handle(handle); @@ -4799,12 +4811,6 @@ vplat_create(zlog_t *zlogp, zone_mnt_t mount_cmd) goto error; } - if ((pool_name = malloc(MAXPATHLEN)) == NULL) { - zerror(zlogp, B_TRUE, "memory allocation failed"); - return (Z_NOMEM); - } - bzero(pool_name, MAXPATHLEN); - /* * The following actions are not performed when merely mounting a zone * for administrative use. @@ -5270,8 +5276,6 @@ vplat_teardown(zlog_t *zlogp, boolean_t unmount_cmd, boolean_t rebooting) } } - free(pool_name); - remove_mlps(zlogp, zoneid); if (zone_destroy(zoneid) != 0) { diff --git a/usr/src/cmd/zoneadmd/zoneadmd.c b/usr/src/cmd/zoneadmd/zoneadmd.c index 743370c1ad..94ab464193 100644 --- a/usr/src/cmd/zoneadmd/zoneadmd.c +++ b/usr/src/cmd/zoneadmd/zoneadmd.c @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -102,11 +101,12 @@ #include <sys/dls_mgmt.h> #include <libzonecfg.h> +#include <zonestat_impl.h> #include "zoneadmd.h" static char *progname; char *zone_name; /* zone which we are managing */ -char *pool_name; +char pool_name[MAXNAMELEN]; char default_brand[MAXNAMELEN]; char brand_name[MAXNAMELEN]; boolean_t zone_isnative; @@ -457,12 +457,14 @@ static int brand_prestatechg(zlog_t *zlogp, int state, int cmd) { char cmdbuf[2 * MAXPATHLEN]; + const char *altroot; if (pre_statechg_hook[0] == '\0') return (0); - if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d", pre_statechg_hook, - state, cmd) > sizeof (cmdbuf)) + altroot = zonecfg_get_root(); + if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d %s", pre_statechg_hook, + state, cmd, altroot) > sizeof (cmdbuf)) return (-1); if (do_subproc(zlogp, cmdbuf, NULL) != 0) @@ -478,12 +480,14 @@ static int brand_poststatechg(zlog_t *zlogp, int state, int cmd) { char cmdbuf[2 * MAXPATHLEN]; + const char *altroot; if (post_statechg_hook[0] == '\0') return (0); - if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d", post_statechg_hook, - state, cmd) > sizeof (cmdbuf)) + altroot = zonecfg_get_root(); + if (snprintf(cmdbuf, sizeof (cmdbuf), "%s %d %d %s", post_statechg_hook, + state, cmd, altroot) > sizeof (cmdbuf)) return (-1); if (do_subproc(zlogp, cmdbuf, NULL) != 0) @@ -493,6 +497,33 @@ brand_poststatechg(zlog_t *zlogp, int state, int cmd) } /* + * Notify zonestatd of the new zone. If zonestatd is not running, this + * will do nothing. + */ +static void +notify_zonestatd(zoneid_t zoneid) +{ + int cmd[2]; + int fd; + door_arg_t params; + + fd = open(ZS_DOOR_PATH, O_RDONLY); + if (fd < 0) + return; + + cmd[0] = ZSD_CMD_NEW_ZONE; + cmd[1] = zoneid; + params.data_ptr = (char *)&cmd; + params.data_size = sizeof (cmd); + params.desc_ptr = NULL; + params.desc_num = 0; + params.rbuf = NULL; + params.rsize = NULL; + (void) door_call(fd, ¶ms); + (void) close(fd); +} + +/* * Bring a zone up to the pre-boot "ready" stage. The mount_cmd argument is * 'true' if this is being invoked as part of the processing for the "mount" * subcommand. @@ -904,6 +935,12 @@ zone_bootup(zlog_t *zlogp, const char *bootargs, int zstate) goto bad; } + /* + * Inform zonestatd of a new zone so that it can install a door for + * the zone to contact it. + */ + notify_zonestatd(zone_id); + if (zone_boot(zoneid) == -1) { zerror(zlogp, B_TRUE, "unable to boot zone"); goto bad; diff --git a/usr/src/cmd/zoneadmd/zoneadmd.h b/usr/src/cmd/zoneadmd/zoneadmd.h index da6aa369ed..63b23481d2 100644 --- a/usr/src/cmd/zoneadmd/zoneadmd.h +++ b/usr/src/cmd/zoneadmd/zoneadmd.h @@ -20,8 +20,7 @@ */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _ZONEADMD_H @@ -86,7 +85,7 @@ extern mutex_t msglock; extern boolean_t in_death_throes; extern boolean_t bringup_failure_recovery; extern char *zone_name; -extern char *pool_name; +extern char pool_name[MAXNAMELEN]; extern char brand_name[MAXNAMELEN]; extern char default_brand[MAXNAMELEN]; extern char boot_args[BOOTARGS_MAX]; |
