changeset 10943:b45d62b629cd

6889379 zoneadm mount fails on opensolaris
author Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
date Tue, 03 Nov 2009 19:20:02 -0800
parents eaa343de0d06
children 30bda6952fd0
files usr/src/cmd/zlogin/zlogin.c usr/src/cmd/zoneadm/zoneadm.c usr/src/cmd/zoneadmd/vplat.c usr/src/cmd/zoneadmd/zoneadmd.c usr/src/cmd/zoneadmd/zoneadmd.h usr/src/head/libzonecfg.h usr/src/lib/libbrand/common/libbrand.c usr/src/lib/libbrand/common/libbrand.h usr/src/lib/libbrand/common/mapfile-vers usr/src/lib/libzonecfg/common/libzonecfg.c usr/src/lib/libzonecfg/common/mapfile-vers
diffstat 11 files changed, 94 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/zlogin/zlogin.c	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zlogin/zlogin.c	Tue Nov 03 19:20:02 2009 -0800
@@ -1679,6 +1679,7 @@
 	priv_set_t *privset;
 	int tmpl_fd;
 	char zonebrand[MAXNAMELEN];
+	char default_brand[MAXNAMELEN];
 	struct stat sb;
 	char kernzone[ZONENAME_MAX];
 	brand_handle_t bh;
@@ -1908,11 +1909,16 @@
 	 * brand may not exist in the miniroot (such as in net install
 	 * upgrade).
 	 */
+	if (zonecfg_default_brand(default_brand,
+	    sizeof (default_brand)) != Z_OK) {
+		zerror(gettext("unable to determine default brand"));
+		return (1);
+	}
 	if (zonecfg_in_alt_root() &&
 	    strcmp(zonebrand, CLUSTER_BRAND_NAME) == 0) {
-		(void) strlcpy(zonebrand, NATIVE_BRAND_NAME,
-		    sizeof (zonebrand));
+		(void) strlcpy(zonebrand, default_brand, sizeof (zonebrand));
 	}
+
 	if ((bh = brand_open(zonebrand)) == NULL) {
 		zerror(gettext("could not open brand for zone %s"), zonename);
 		return (1);
--- a/usr/src/cmd/zoneadm/zoneadm.c	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadm/zoneadm.c	Tue Nov 03 19:20:02 2009 -0800
@@ -198,6 +198,7 @@
 /* set early in main(), never modified thereafter, used all over the place */
 static char *execname;
 static char target_brand[MAXNAMELEN];
+static char default_brand[MAXPATHLEN];
 static char *locale;
 char *target_zone;
 static char *target_uuid;
@@ -525,7 +526,7 @@
 	 */
 	if (getzoneid() != GLOBAL_ZONEID) {
 		assert(is_system_labeled() != 0);
-		(void) strlcpy(zent->zbrand, NATIVE_BRAND_NAME,
+		(void) strlcpy(zent->zbrand, default_brand,
 		    sizeof (zent->zbrand));
 	} else if (zone_get_brand(zent->zname, zent->zbrand,
 	    sizeof (zent->zbrand)) != Z_OK) {
@@ -5651,6 +5652,13 @@
 	 */
 	zonecfg_init_lock_file(target_zone, &zone_lock_env);
 
+	/* Figure out what the system's default brand is */
+	if (zonecfg_default_brand(default_brand,
+	    sizeof (default_brand)) != Z_OK) {
+		zerror(gettext("unable to determine default brand"));
+		return (Z_ERR);
+	}
+
 	/*
 	 * If we are going to be operating on a single zone, retrieve its
 	 * brand type and determine whether it is native or not.
@@ -5672,7 +5680,7 @@
 		 */
 		if (strcmp(target_brand, CLUSTER_BRAND_NAME) == 0) {
 			if (zonecfg_in_alt_root()) {
-				(void) strlcpy(target_brand, NATIVE_BRAND_NAME,
+				(void) strlcpy(target_brand, default_brand,
 				    sizeof (target_brand));
 			}
 		}
--- a/usr/src/cmd/zoneadmd/vplat.c	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadmd/vplat.c	Tue Nov 03 19:20:02 2009 -0800
@@ -1085,11 +1085,11 @@
 
 	/*
 	 * Get a handle to the brand info for this zone.
-	 * If we are mounting the zone, then we must always use the native
+	 * If we are mounting the zone, then we must always use the default
 	 * brand device mounts.
 	 */
 	if (ALT_MOUNT(mount_cmd)) {
-		(void) strlcpy(brand, NATIVE_BRAND_NAME, sizeof (brand));
+		(void) strlcpy(brand, default_brand, sizeof (brand));
 	} else {
 		(void) strlcpy(brand, brand_name, sizeof (brand));
 	}
@@ -1759,11 +1759,11 @@
 	}
 
 	/*
-	 * If we are mounting the zone, then we must always use the native
+	 * If we are mounting the zone, then we must always use the default
 	 * brand global mounts.
 	 */
 	if (ALT_MOUNT(mount_cmd)) {
-		(void) strlcpy(brand, NATIVE_BRAND_NAME, sizeof (brand));
+		(void) strlcpy(brand, default_brand, sizeof (brand));
 	} else {
 		(void) strlcpy(brand, brand_name, sizeof (brand));
 	}
--- a/usr/src/cmd/zoneadmd/zoneadmd.c	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadmd/zoneadmd.c	Tue Nov 03 19:20:02 2009 -0800
@@ -106,6 +106,7 @@
 
 static char *progname;
 char *zone_name;	/* zone which we are managing */
+char default_brand[MAXNAMELEN];
 char brand_name[MAXNAMELEN];
 boolean_t zone_isnative;
 boolean_t zone_iscluster;
@@ -1239,11 +1240,11 @@
 			eventstream_write(Z_EVT_ZONE_READIED);
 
 			/*
-			 * Get a handle to the native brand info.
-			 * We must always use the native brand file system
+			 * Get a handle to the default brand info.
+			 * We must always use the default brand file system
 			 * list when mounting the zone.
 			 */
-			if ((bh = brand_open(NATIVE_BRAND_NAME)) == NULL) {
+			if ((bh = brand_open(default_brand)) == NULL) {
 				rval = -1;
 				break;
 			}
@@ -1747,6 +1748,12 @@
 		return (1);
 	}
 
+	if (zonecfg_default_brand(default_brand,
+	    sizeof (default_brand)) != Z_OK) {
+		zerror(zlogp, B_FALSE, "unable to determine default brand");
+		return (1);
+	}
+
 	/* Get a handle to the brand info for this zone */
 	if (zone_get_brand(zone_name, brand_name, sizeof (brand_name))
 	    != Z_OK) {
@@ -1767,7 +1774,7 @@
 	if (strcmp(brand_name, CLUSTER_BRAND_NAME) == 0) {
 		zone_iscluster = B_TRUE;
 		if (zonecfg_in_alt_root()) {
-			(void) strlcpy(brand_name, NATIVE_BRAND_NAME,
+			(void) strlcpy(brand_name, default_brand,
 			    sizeof (brand_name));
 		}
 	} else {
--- a/usr/src/cmd/zoneadmd/zoneadmd.h	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/cmd/zoneadmd/zoneadmd.h	Tue Nov 03 19:20:02 2009 -0800
@@ -87,6 +87,7 @@
 extern boolean_t bringup_failure_recovery;
 extern char *zone_name;
 extern char brand_name[MAXNAMELEN];
+extern char default_brand[MAXNAMELEN];
 extern char boot_args[BOOTARGS_MAX];
 extern char bad_boot_arg[BOOTARGS_MAX];
 extern boolean_t zone_isnative;
--- a/usr/src/head/libzonecfg.h	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/head/libzonecfg.h	Tue Nov 03 19:20:02 2009 -0800
@@ -504,6 +504,7 @@
 extern	char	*zone_state_str(zone_state_t);
 extern	int	zonecfg_get_name_by_uuid(const uuid_t, char *, size_t);
 extern	int	zonecfg_get_uuid(const char *, uuid_t);
+extern	int	zonecfg_default_brand(char *, size_t);
 
 /*
  * Iterator for configured zones.
--- a/usr/src/lib/libbrand/common/libbrand.c	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libbrand/common/libbrand.c	Tue Nov 03 19:20:02 2009 -0800
@@ -688,13 +688,6 @@
 	    buf, len, DTD_ELEM_SYSBOOT, B_TRUE, B_TRUE));
 }
 
-int
-brand_is_native(brand_handle_t bh)
-{
-	struct brand_handle *bhp = (struct brand_handle *)bh;
-	return ((strcmp(bhp->bh_name, NATIVE_BRAND_NAME) == 0) ? 1 : 0);
-}
-
 boolean_t
 brand_allow_exclusive_ip(brand_handle_t bh)
 {
--- a/usr/src/lib/libbrand/common/libbrand.h	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libbrand/common/libbrand.h	Tue Nov 03 19:20:02 2009 -0800
@@ -44,8 +44,6 @@
 extern brand_handle_t brand_open(const char *);
 extern void brand_close(brand_handle_t);
 
-extern int brand_is_native(brand_handle_t);
-
 extern boolean_t brand_allow_exclusive_ip(brand_handle_t);
 
 extern int brand_get_attach(brand_handle_t, const char *, const char *,
--- a/usr/src/lib/libbrand/common/mapfile-vers	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libbrand/common/mapfile-vers	Tue Nov 03 19:20:02 2009 -0800
@@ -69,7 +69,6 @@
 	brand_get_validatesnap;
 	brand_get_verify_adm;
 	brand_get_verify_cfg;
-	brand_is_native;
 	brand_open;
 	brand_platform_iter_devices;
 	brand_platform_iter_gmounts;
--- a/usr/src/lib/libzonecfg/common/libzonecfg.c	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libzonecfg/common/libzonecfg.c	Tue Nov 03 19:20:02 2009 -0800
@@ -914,23 +914,37 @@
 	return (setrootattr(handle, DTD_ATTR_ZONEPATH, zonepath));
 }
 
-int
-zonecfg_get_brand(zone_dochandle_t handle, char *brand, size_t brandsize)
+static int
+i_zonecfg_get_brand(zone_dochandle_t handle, char *brand, size_t brandsize,
+    boolean_t default_query)
 {
 	int ret, sz;
 
 	ret = getrootattr(handle, DTD_ATTR_BRAND, brand, brandsize);
 
-	/* If the zone has no brand, it is native. */
-	if (ret == Z_OK && brand[0] == '\0') {
-		sz = strlcpy(brand, NATIVE_BRAND_NAME, brandsize);
-		if (sz >= brandsize)
-			ret = Z_TOO_BIG;
-		else
-			ret = Z_OK;
-	}
-
-	return (ret);
+	/*
+	 * If the lookup failed, or succeeded in finding a non-null brand
+	 * string then return.
+	 */
+	if (ret != Z_OK || brand[0] != '\0')
+		return (ret);
+
+	if (!default_query) {
+		/* If the zone has no brand, it is the default brand. */
+		return (zonecfg_default_brand(brand, sizeof (brandsize)));
+	}
+
+	/* if SUNWdefault didn't specify a brand, fallback to "native" */
+	sz = strlcpy(brand, NATIVE_BRAND_NAME, brandsize);
+	if (sz >= brandsize)
+		return (Z_TOO_BIG);
+	return (Z_OK);
+}
+
+int
+zonecfg_get_brand(zone_dochandle_t handle, char *brand, size_t brandsize)
+{
+	return (i_zonecfg_get_brand(handle, brand, brandsize, B_FALSE));
 }
 
 int
@@ -4905,18 +4919,21 @@
 }
 
 static int
-priv_lists_create(zone_dochandle_t handle, priv_lists_t **plpp,
+priv_lists_create(zone_dochandle_t handle, char *brand, priv_lists_t **plpp,
     const char *curr_iptype)
 {
 	priv_lists_t *plp;
 	brand_handle_t bh;
-	char brand[MAXNAMELEN];
+	char brand_str[MAXNAMELEN];
+
+	/* handle or brand must be set, but never both */
+	assert((handle != NULL) || (brand != NULL));
+	assert((handle == NULL) || (brand == NULL));
 
 	if (handle != NULL) {
-		if (zonecfg_get_brand(handle, brand, sizeof (brand)) != 0)
+		brand = brand_str;
+		if (zonecfg_get_brand(handle, brand, sizeof (brand_str)) != 0)
 			return (Z_BRAND_ERROR);
-	} else {
-		(void) strlcpy(brand, NATIVE_BRAND_NAME, MAXNAMELEN);
 	}
 
 	if ((bh = brand_open(brand)) == NULL)
@@ -4963,12 +4980,31 @@
 }
 
 int
+zonecfg_default_brand(char *brand, size_t brandsize)
+{
+	zone_dochandle_t handle;
+	int ret;
+
+	if ((handle = zonecfg_init_handle()) == NULL)
+		return (Z_NOMEM);
+	if ((ret = zonecfg_get_handle("SUNWdefault", handle)) == Z_OK) {
+		ret = i_zonecfg_get_brand(handle, brand, brandsize, B_TRUE);
+		zonecfg_fini_handle(handle);
+		return (ret);
+	}
+	return (ret);
+}
+
+int
 zonecfg_default_privset(priv_set_t *privs, const char *curr_iptype)
 {
 	priv_lists_t *plp;
+	char buf[MAXNAMELEN];
 	int ret;
 
-	if ((ret = priv_lists_create(NULL, &plp, curr_iptype)) != Z_OK)
+	if ((ret = zonecfg_default_brand(buf, sizeof (buf))) != Z_OK)
+		return (ret);
+	if ((ret = priv_lists_create(NULL, buf, &plp, curr_iptype)) != Z_OK)
 		return (ret);
 	ret = get_default_privset(privs, plp);
 	priv_lists_destroy(plp);
@@ -5140,7 +5176,7 @@
 		break;
 	}
 
-	if ((err = priv_lists_create(handle, &plp, curr_iptype)) != Z_OK)
+	if ((err = priv_lists_create(handle, NULL, &plp, curr_iptype)) != Z_OK)
 		return (err);
 
 	limitlen = strlen(limitpriv);
@@ -5278,10 +5314,9 @@
 		return (Z_OK);
 	}
 
-	if (strcmp(zone_name, "global") == 0) {
-		(void) strlcpy(brandname, NATIVE_BRAND_NAME, rp_sz);
-		return (Z_OK);
-	}
+	if (strcmp(zone_name, "global") == 0)
+		return (zonecfg_default_brand(brandname, rp_sz));
+
 	if ((handle = zonecfg_init_handle()) == NULL)
 		return (Z_NOMEM);
 
--- a/usr/src/lib/libzonecfg/common/mapfile-vers	Tue Nov 03 21:14:05 2009 -0500
+++ b/usr/src/lib/libzonecfg/common/mapfile-vers	Tue Nov 03 19:20:02 2009 -0800
@@ -69,6 +69,7 @@
 	zonecfg_close_scratch;
 	zonecfg_construct_rctlblk;
 	zonecfg_create_snapshot;
+	zonecfg_default_brand;
 	zonecfg_default_privset;
 	zonecfg_delete_attr;
 	zonecfg_delete_dev;