summaryrefslogtreecommitdiff
path: root/usr/src/cmd/zoneadmd
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/zoneadmd')
-rw-r--r--usr/src/cmd/zoneadmd/vplat.c28
-rw-r--r--usr/src/cmd/zoneadmd/zoneadmd.c51
-rw-r--r--usr/src/cmd/zoneadmd/zoneadmd.h5
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, &params);
+ (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];