Mercurial > illumos > illumos-gate
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;