Mercurial > illumos > illumos-gate
changeset 8662:18153249ee93
PSARC/2008/647 Configurable Hostids for Non-Global Zones
6580939 RFE: provide unique hostid for each non-global zone
line wrap: on
line diff
--- a/usr/src/cmd/hostid/hostid.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/cmd/hostid/hostid.c Fri Jan 30 12:25:48 2009 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,22 +19,21 @@ * CDDL HEADER END */ /* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <stdio.h> #include <unistd.h> #include <stdlib.h> +#include <sys/systeminfo.h> int main(void) { long hostval; - if ((hostval = gethostid()) == -1) { + if ((unsigned int)(hostval = gethostid()) == HW_INVALID_HOSTID) { (void) fprintf(stderr, "bad hostid format\n"); exit(1); }
--- a/usr/src/cmd/zoneadmd/vplat.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/cmd/zoneadmd/vplat.c Fri Jan 30 12:25:48 2009 -0800 @@ -71,6 +71,7 @@ #include <sys/sockio.h> #include <sys/stropts.h> #include <sys/conf.h> +#include <sys/systeminfo.h> #include <libdlpi.h> #include <libdllink.h> @@ -3966,6 +3967,69 @@ return (Z_OK); } +/* + * Sets the hostid of the new zone based on its configured value. The zone's + * zone_t structure must already exist in kernel memory. 'zlogp' refers to the + * log used to report errors and warnings and must be non-NULL. 'zone_namep' + * is the name of the new zone and must be non-NULL. 'zoneid' is the numeric + * ID of the new zone. + * + * This function returns zero on success and a nonzero error code on failure. + */ +static int +setup_zone_hostid(zlog_t *zlogp, char *zone_namep, zoneid_t zoneid) +{ + int res; + zone_dochandle_t handle; + char hostidp[HW_HOSTID_LEN]; + unsigned int hostid; + + if ((handle = zonecfg_init_handle()) == NULL) { + zerror(zlogp, B_TRUE, "getting zone configuration handle"); + return (Z_BAD_HANDLE); + } + if ((res = zonecfg_get_snapshot_handle(zone_namep, handle)) != Z_OK) { + zerror(zlogp, B_FALSE, "invalid configuration"); + zonecfg_fini_handle(handle); + return (res); + } + + if ((res = zonecfg_get_hostid(handle, hostidp, sizeof (hostidp))) == + Z_OK) { + if (zonecfg_valid_hostid(hostidp) != Z_OK) { + zerror(zlogp, B_FALSE, + "zone hostid is not valid: %s", hostidp); + zonecfg_fini_handle(handle); + return (Z_HOSTID_FUBAR); + } + hostid = (unsigned int)strtoul(hostidp, NULL, 16); + if (zone_setattr(zoneid, ZONE_ATTR_HOSTID, &hostid, + sizeof (hostid)) != 0) { + zerror(zlogp, B_TRUE, + "zone hostid is not valid: %s", hostidp); + zonecfg_fini_handle(handle); + return (Z_SYSTEM); + } + } else if (res != Z_BAD_PROPERTY) { + /* + * Z_BAD_PROPERTY is an acceptable error value (from + * zonecfg_get_hostid()) because it indicates that the zone + * doesn't have a hostid. + */ + if (res == Z_TOO_BIG) + zerror(zlogp, B_FALSE, "hostid string in zone " + "configuration is too large."); + else + zerror(zlogp, B_TRUE, "fetching zone hostid from " + "configuration"); + zonecfg_fini_handle(handle); + return (res); + } + + zonecfg_fini_handle(handle); + return (Z_OK); +} + zoneid_t vplat_create(zlog_t *zlogp, zone_mnt_t mount_cmd) { @@ -4152,12 +4216,15 @@ struct brand_attr attr; char modname[MAXPATHLEN]; + if (setup_zone_hostid(zlogp, zone_name, zoneid) != Z_OK) + goto error; + if ((zone_get_brand(zone_name, attr.ba_brandname, MAXNAMELEN) != Z_OK) || (bh = brand_open(attr.ba_brandname)) == NULL) { zerror(zlogp, B_FALSE, "unable to determine brand name"); - return (-1); + goto error; } /* @@ -4168,7 +4235,7 @@ brand_close(bh); zerror(zlogp, B_FALSE, "unable to determine brand kernel module"); - return (-1); + goto error; } brand_close(bh); @@ -4182,10 +4249,8 @@ } } - if (setup_zone_rm(zlogp, zone_name, zoneid) != Z_OK) { - (void) zone_shutdown(zoneid); + if (setup_zone_rm(zlogp, zone_name, zoneid) != Z_OK) goto error; - } set_mlps(zlogp, zoneid, zcent); } @@ -4194,8 +4259,10 @@ zoneid = -1; error: - if (zoneid != -1) + if (zoneid != -1) { + (void) zone_shutdown(zoneid); (void) zone_destroy(zoneid); + } if (rctlbuf != NULL) free(rctlbuf); priv_freeset(privs);
--- a/usr/src/cmd/zonecfg/zonecfg.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/cmd/zonecfg/zonecfg.c Fri Jan 30 12:25:48 2009 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -73,6 +73,7 @@ #include <libzfs.h> #include <sys/brand.h> #include <libbrand.h> +#include <sys/systeminfo.h> #include <libdladm.h> #include <libinetutil.h> @@ -180,6 +181,7 @@ "scheduling-class", "ip-type", "capped-cpu", + "hostid", NULL }; @@ -221,6 +223,7 @@ "scheduling-class", "ip-type", "defrouter", + "hostid", NULL }; @@ -332,6 +335,7 @@ "set " ALIAS_MAXMSGIDS "=", "set " ALIAS_MAXSEMIDS "=", "set " ALIAS_SHARES "=", + "set hostid=", NULL }; @@ -361,6 +365,7 @@ "info max-msg-ids", "info max-sem-ids", "info cpu-shares", + "info hostid", NULL }; @@ -1143,6 +1148,8 @@ (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"), pt_to_str(PT_IPTYPE)); (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"), + pt_to_str(PT_HOSTID)); + (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"), pt_to_str(PT_MAXLWPS)); (void) fprintf(fp, "\t%s\t%s\n", gettext("(global)"), pt_to_str(PT_MAXSHMMEM)); @@ -1625,6 +1632,7 @@ char bootargs[BOOTARGS_MAX]; char sched[MAXNAMELEN]; char brand[MAXNAMELEN]; + char hostidp[HW_HOSTID_LEN]; char *limitpriv; FILE *of; boolean_t autoboot; @@ -1728,6 +1736,11 @@ } } + if (zonecfg_get_hostid(handle, hostidp, sizeof (hostidp)) == Z_OK) { + (void) fprintf(of, "%s %s=%s\n", cmd_to_str(CMD_SET), + pt_to_str(PT_HOSTID), hostidp); + } + if ((err = zonecfg_setipdent(handle)) != Z_OK) { zone_perror(zone, err, B_FALSE); goto done; @@ -2281,7 +2294,7 @@ return (global_zone && (type == RT_ZONENAME || type == RT_ZONEPATH || type == RT_AUTOBOOT || type == RT_LIMITPRIV || type == RT_BOOTARGS || type == RT_BRAND || type == RT_SCHED || - type == RT_IPTYPE)); + type == RT_IPTYPE || type == RT_HOSTID)); } static boolean_t @@ -2290,7 +2303,7 @@ return (global_zone && (type == PT_ZONENAME || type == PT_ZONEPATH || type == PT_AUTOBOOT || type == PT_LIMITPRIV || type == PT_BOOTARGS || type == PT_BRAND || type == PT_SCHED || - type == PT_IPTYPE)); + type == PT_IPTYPE || type == PT_HOSTID)); } void @@ -3482,6 +3495,12 @@ case PT_SHARES: remove_aliased_rctl(PT_SHARES, ALIAS_SHARES); return; + case PT_HOSTID: + if ((err = zonecfg_set_hostid(handle, NULL)) != Z_OK) + z_cmd_rt_perror(CMD_CLEAR, RT_HOSTID, err, B_TRUE); + else + need_to_commit = B_TRUE; + return; default: zone_perror(pt_to_str(type), Z_NO_PROPERTY_TYPE, B_TRUE); long_usage(CMD_CLEAR, B_TRUE); @@ -3937,6 +3956,8 @@ res_type = RT_MAXSEMIDS; } else if (prop_type == PT_SHARES) { res_type = RT_SHARES; + } else if (prop_type == PT_HOSTID) { + res_type = RT_HOSTID; } else { zerr(gettext("Cannot set a resource-specific property " "from the global scope.")); @@ -4139,6 +4160,19 @@ case RT_SHARES: set_aliased_rctl(ALIAS_SHARES, prop_type, prop_id); return; + case RT_HOSTID: + if ((err = zonecfg_set_hostid(handle, prop_id)) != Z_OK) { + if (err == Z_TOO_BIG) { + zerr(gettext("hostid string is too large: %s"), + prop_id); + saw_error = B_TRUE; + } else { + zone_perror(pt_to_str(prop_type), err, B_TRUE); + } + return; + } + need_to_commit = B_TRUE; + return; case RT_FS: switch (prop_type) { case PT_DIR: @@ -4653,6 +4687,21 @@ } static void +info_hostid(zone_dochandle_t handle, FILE *fp) +{ + char hostidp[HW_HOSTID_LEN]; + + /* + * This will display "hostid: " if there isn't a hostid or an + * error occurs while retrieving the hostid from the configuration + * file. + */ + if (zonecfg_get_hostid(handle, hostidp, sizeof (hostidp)) != Z_OK) + hostidp[0] = '\0'; + (void) fprintf(fp, "%s: %s\n", pt_to_str(PT_HOSTID), hostidp); +} + +static void output_fs(FILE *fp, struct zone_fstab *fstab) { zone_fsopt_t *this; @@ -5197,6 +5246,7 @@ info_limitpriv(handle, fp); info_sched(handle, fp); info_iptype(handle, fp); + info_hostid(handle, fp); } info_aliased_rctl(handle, fp, ALIAS_MAXLWPS); info_aliased_rctl(handle, fp, ALIAS_MAXSHMMEM); @@ -5294,6 +5344,9 @@ case RT_MCAP: info_mcap(handle, fp); break; + case RT_HOSTID: + info_hostid(handle, fp); + break; default: zone_perror(rt_to_str(cmd->cmd_res_type), Z_NO_RESOURCE_TYPE, B_TRUE); @@ -5431,6 +5484,7 @@ char zonepath[MAXPATHLEN]; char sched[MAXNAMELEN]; char brand[MAXNAMELEN]; + char hostidp[HW_HOSTID_LEN]; int err, ret_val = Z_OK, arg; int pset_res; boolean_t save = B_FALSE; @@ -5507,6 +5561,12 @@ } (void) zonecfg_endipdent(handle); + if (zonecfg_get_hostid(handle, hostidp, sizeof (hostidp)) == Z_OK && + (err = zonecfg_valid_hostid(hostidp)) != Z_OK) { + zone_perror(zone, err, B_TRUE); + return; + } + if ((err = zonecfg_setfsent(handle)) != Z_OK) { zone_perror(zone, err, B_TRUE); return;
--- a/usr/src/cmd/zonecfg/zonecfg.h Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/cmd/zonecfg/zonecfg.h Fri Jan 30 12:25:48 2009 -0800 @@ -20,15 +20,13 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _ZONECFG_H #define _ZONECFG_H -#pragma ident "%Z%%M% %I% %E% SMI" - /* * header file for zonecfg command */ @@ -90,9 +88,10 @@ #define RT_SCHED 23 /* really a property, but for info ... */ #define RT_IPTYPE 24 /* really a property, but for info ... */ #define RT_PCAP 25 +#define RT_HOSTID 26 /* really a property, but for info ... */ #define RT_MIN RT_UNKNOWN -#define RT_MAX RT_PCAP +#define RT_MAX RT_HOSTID /* property types: increment PT_MAX when expanding this list */ #define PT_UNKNOWN 0 @@ -131,9 +130,10 @@ #define PT_SCHED 33 #define PT_IPTYPE 34 #define PT_DEFROUTER 35 +#define PT_HOSTID 36 #define PT_MIN PT_UNKNOWN -#define PT_MAX PT_DEFROUTER +#define PT_MAX PT_HOSTID #define MAX_EQ_PROP_PAIRS 3
--- a/usr/src/cmd/zonecfg/zonecfg_grammar.y Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/cmd/zonecfg/zonecfg_grammar.y Fri Jan 30 12:25:48 2009 -0800 @@ -21,12 +21,10 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <stdio.h> #include "zonecfg.h" @@ -59,7 +57,7 @@ %token HELP CREATE EXPORT ADD DELETE REMOVE SELECT SET INFO CANCEL END VERIFY %token COMMIT REVERT EXIT SEMICOLON TOKEN ZONENAME ZONEPATH AUTOBOOT POOL NET %token FS IPD ATTR DEVICE RCTL SPECIAL RAW DIR OPTIONS TYPE ADDRESS PHYSICAL -%token IPTYPE +%token IPTYPE HOSTID %token NAME MATCH PRIV LIMIT ACTION VALUE EQUAL OPEN_SQ_BRACKET CLOSE_SQ_BRACKET %token OPEN_PAREN CLOSE_PAREN COMMA DATASET LIMITPRIV BOOTARGS BRAND PSET PCAP %token MCAP NCPUS IMPORTANCE SHARES MAXLWPS MAXSHMMEM MAXSHMIDS MAXMSGIDS @@ -71,7 +69,7 @@ %type <ival> resource_type NET FS IPD DEVICE RCTL ATTR DATASET PSET PCAP MCAP %type <ival> property_name SPECIAL RAW DIR OPTIONS TYPE ADDRESS PHYSICAL NAME MATCH ZONENAME ZONEPATH AUTOBOOT POOL LIMITPRIV BOOTARGS VALUE PRIV LIMIT - ACTION BRAND SCHED IPTYPE DEFROUTER + ACTION BRAND SCHED IPTYPE DEFROUTER HOSTID %type <cmd> command %type <cmd> add_command ADD %type <cmd> cancel_command CANCEL @@ -542,6 +540,15 @@ $$->cmd_res_type = RT_MAXSEMIDS; $$->cmd_prop_nv_pairs = 0; } + | INFO HOSTID + { + if (($$ = alloc_cmd()) == NULL) + YYERROR; + cmd = $$; + $$->cmd_handler = &info_func; + $$->cmd_res_type = RT_HOSTID; + $$->cmd_prop_nv_pairs = 0; + } | INFO resource_type property_name EQUAL property_value { if (($$ = alloc_cmd()) == NULL) @@ -884,6 +891,7 @@ | MAXMSGIDS { $$ = PT_MAXMSGIDS; } | MAXSEMIDS { $$ = PT_MAXSEMIDS; } | SCHED { $$ = PT_SCHED; } + | HOSTID { $$ = PT_HOSTID; } /* * The grammar builds data structures from the bottom up. Thus various
--- a/usr/src/cmd/zonecfg/zonecfg_lex.l Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/cmd/zonecfg/zonecfg_lex.l Fri Jan 30 12:25:48 2009 -0800 @@ -21,12 +21,10 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <string.h> #include <libintl.h> #include "zonecfg.h" @@ -273,6 +271,9 @@ <TSTATE>scheduling-class { return SCHED; } <CSTATE>scheduling-class { return SCHED; } +<TSTATE>hostid { return HOSTID; } +<CSTATE>hostid { return HOSTID; } + <TSTATE>= { return EQUAL; } <LSTATE>= { return EQUAL; } <CSTATE>= { return EQUAL; }
--- a/usr/src/head/libzonecfg.h Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/head/libzonecfg.h Fri Jan 30 12:25:48 2009 -0800 @@ -20,15 +20,13 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _LIBZONECFG_H #define _LIBZONECFG_H -#pragma ident "%Z%%M% %I% %E% SMI" - /* * Zone configuration header file. */ @@ -100,6 +98,7 @@ #define Z_NO_POOL 47 /* no such pool configured */ #define Z_POOL_CREATE 48 /* pool create failed */ #define Z_POOL_BIND 49 /* pool bind failed */ +#define Z_HOSTID_FUBAR 50 /* invalid hostid provided */ /* * Warning: these are shared with the admin/install consolidation. @@ -342,6 +341,13 @@ extern int zonecfg_lookup_nwif(zone_dochandle_t, struct zone_nwiftab *); /* + * Hostid emulation configuration. + */ +extern int zonecfg_get_hostid(zone_dochandle_t, char *, size_t); +extern int zonecfg_set_hostid(zone_dochandle_t, const char *); +extern int zonecfg_valid_hostid(const char *); + +/* * Device configuration and rule matching. */ extern int zonecfg_add_dev(zone_dochandle_t, struct zone_devtab *);
--- a/usr/src/lib/brand/lx/lx_support/lx_support.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/lib/brand/lx/lx_support/lx_support.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -29,7 +29,6 @@ * intended to be called by users - it is intended to be invoked by the * zones utilities. */ -#pragma ident "%Z%%M% %I% %E% SMI" #include <ctype.h> #include <errno.h> @@ -44,6 +43,7 @@ #include <stropts.h> #include <sys/ioccom.h> #include <sys/stat.h> +#include <sys/systeminfo.h> #include <sys/types.h> #include <sys/varargs.h> #include <unistd.h> @@ -444,6 +444,7 @@ boolean_t audio, restart; char *idev, *odev, *kvers; zone_iptype_t iptype; + char hostidp[HW_HOSTID_LEN]; if ((handle = zonecfg_init_handle()) == NULL) lxs_err(gettext("internal libzonecfg.so.1 error"), 0); @@ -507,6 +508,14 @@ "ip-type")); } + /* + * Check to see whether the zone has hostid emulation enabled. + */ + if (zonecfg_get_hostid(handle, hostidp, sizeof (hostidp)) == Z_OK) { + zonecfg_fini_handle(handle); + lxs_err(gettext("lx zones do not support hostid emulation")); + } + /* Extract any relevant attributes from the config file. */ lxs_getattrs(handle, &restart, &audio, &idev, &odev, &kvers); zonecfg_fini_handle(handle);
--- a/usr/src/lib/libc/port/gen/gethostid.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/lib/libc/port/gen/gethostid.c Fri Jan 30 12:25:48 2009 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -32,25 +32,25 @@ * under license from the Regents of the University of California. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include "lint.h" #include <sys/types.h> #include <sys/systeminfo.h> #include <stdlib.h> -#define HOSTIDLEN 40 - long gethostid(void) { - char name[HOSTIDLEN+1], *end; - unsigned long hostid; + char name[HW_HOSTID_LEN], *end; + unsigned long hostid; - if (sysinfo(SI_HW_SERIAL, name, HOSTIDLEN) == -1) - return (-1); + /* + * HW_INVALID_HOSTID must be cast to an int to ensure that it's sign + * extended to 64 bits in 64-bit builds. + */ + if (sysinfo(SI_HW_SERIAL, name, sizeof (name)) == -1) + return ((int)HW_INVALID_HOSTID); hostid = strtoul(name, &end, 10); if (end == name) - return (-1); + return ((int)HW_INVALID_HOSTID); return ((long)hostid); }
--- a/usr/src/lib/libzonecfg/common/libzonecfg.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/lib/libzonecfg/common/libzonecfg.c Fri Jan 30 12:25:48 2009 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -44,6 +44,7 @@ #include <sys/nvpair.h> #include <sys/types.h> #include <sys/sockio.h> +#include <sys/systeminfo.h> #include <ftw.h> #include <pool.h> #include <libscf.h> @@ -123,6 +124,7 @@ #define DTD_ATTR_MODE (const xmlChar *) "mode" #define DTD_ATTR_ACL (const xmlChar *) "acl" #define DTD_ATTR_BRAND (const xmlChar *) "brand" +#define DTD_ATTR_HOSTID (const xmlChar *) "hostid" #define DTD_ENTITY_BOOLEAN "boolean" #define DTD_ENTITY_DEVPATH "devpath" @@ -2340,6 +2342,90 @@ return (Z_OK); } +/* + * Gets the zone hostid string stored in the specified zone configuration + * document. This function returns Z_OK on success. Z_BAD_PROPERTY is returned + * if the config file doesn't specify a hostid or if the hostid is blank. + * + * Note that buflen should be at least HW_HOSTID_LEN. + */ +int +zonecfg_get_hostid(zone_dochandle_t handle, char *bufp, size_t buflen) +{ + int err; + + if ((err = getrootattr(handle, DTD_ATTR_HOSTID, bufp, buflen)) != Z_OK) + return (err); + if (bufp[0] == '\0') + return (Z_BAD_PROPERTY); + return (Z_OK); +} + +/* + * Sets the hostid string in the specified zone config document to the given + * string value. If 'hostidp' is NULL, then the config document's hostid + * attribute is cleared. Non-NULL hostids are validated. This function returns + * Z_OK on success. Any other return value indicates failure. + */ +int +zonecfg_set_hostid(zone_dochandle_t handle, const char *hostidp) +{ + int err; + + /* + * A NULL hostid string is interpreted as a request to clear the + * hostid. + */ + if (hostidp == NULL || (err = zonecfg_valid_hostid(hostidp)) == Z_OK) + return (setrootattr(handle, DTD_ATTR_HOSTID, hostidp)); + return (err); +} + +/* + * Determines if the specified string is a valid hostid string. This function + * returns Z_OK if the string is a valid hostid string. It returns Z_INVAL if + * 'hostidp' is NULL, Z_TOO_BIG if 'hostidp' refers to a string buffer + * containing a hex string with more than 8 digits, and Z_HOSTID_FUBAR if the + * string has an invalid format. + */ +int +zonecfg_valid_hostid(const char *hostidp) +{ + char *currentp; + u_longlong_t hostidval; + size_t len; + + if (hostidp == NULL) + return (Z_INVAL); + + /* Empty strings and strings with whitespace are invalid. */ + if (*hostidp == '\0') + return (Z_HOSTID_FUBAR); + for (currentp = (char *)hostidp; *currentp != '\0'; ++currentp) { + if (isspace(*currentp)) + return (Z_HOSTID_FUBAR); + } + len = (size_t)(currentp - hostidp); + + /* + * The caller might pass a hostid that is larger than the maximum + * unsigned 32-bit integral value. Check for this! Also, make sure + * that the whole string is converted (this helps us find illegal + * characters) and that the whole string fits within a buffer of size + * HW_HOSTID_LEN. + */ + currentp = (char *)hostidp; + if (strncmp(hostidp, "0x", 2) == 0 || strncmp(hostidp, "0X", 2) == 0) + currentp += 2; + hostidval = strtoull(currentp, ¤tp, 16); + if ((size_t)(currentp - hostidp) >= HW_HOSTID_LEN) + return (Z_TOO_BIG); + if (hostidval > UINT_MAX || hostidval == HW_INVALID_HOSTID || + currentp != hostidp + len) + return (Z_HOSTID_FUBAR); + return (Z_OK); +} + int zonecfg_lookup_dev(zone_dochandle_t handle, struct zone_devtab *tabptr) { @@ -3373,6 +3459,8 @@ "Could not create a temporary pool")); case Z_POOL_BIND: return (dgettext(TEXT_DOMAIN, "Could not bind zone to pool")); + case Z_HOSTID_FUBAR: + return (dgettext(TEXT_DOMAIN, "Specified hostid is invalid")); case Z_SYSTEM: return (strerror(errno)); default:
--- a/usr/src/lib/libzonecfg/common/mapfile-vers Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/lib/libzonecfg/common/mapfile-vers Fri Jan 30 12:25:48 2009 -0800 @@ -19,11 +19,9 @@ # CDDL HEADER END # # -# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -# ident "%Z%%M% %I% %E% SMI" -# SUNWprivate_1.1 { global: @@ -106,6 +104,7 @@ zonecfg_getdsent; zonecfg_getfsent; zonecfg_get_handle; + zonecfg_get_hostid; zonecfg_getipdent; zonecfg_get_iptype; zonecfg_get_limitpriv; @@ -177,6 +176,7 @@ zonecfg_setdevperment; zonecfg_setdsent; zonecfg_setfsent; + zonecfg_set_hostid; zonecfg_setipdent; zonecfg_set_iptype; zonecfg_set_limitpriv; @@ -193,6 +193,7 @@ zonecfg_validate_zonename; zonecfg_valid_alias_limit; zonecfg_valid_fs_type; + zonecfg_valid_hostid; zonecfg_valid_importance; zonecfg_valid_memlimit; zonecfg_valid_ncpus;
--- a/usr/src/lib/libzonecfg/dtd/zonecfg.dtd.1 Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/lib/libzonecfg/dtd/zonecfg.dtd.1 Fri Jan 30 12:25:48 2009 -0800 @@ -20,10 +20,9 @@ CDDL HEADER END - Copyright 2008 Sun Microsystems, Inc. All rights reserved. + Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. - ident "%Z%%M% %I% %E% SMI" --> <!--Element Definitions--> @@ -132,12 +131,15 @@ <!ATTLIST mcap physcap CDATA #REQUIRED> -<!ELEMENT zone (filesystem | inherited-pkg-dir | network | device | deleted-device | rctl | attr | dataset | package | patch | dev-perm | tmp_pool | pset | mcap)*> +<!ELEMENT zone (filesystem | inherited-pkg-dir | network | device | + deleted-device | rctl | attr | dataset | package | + patch | dev-perm | tmp_pool | pset | mcap)*> <!ATTLIST zone name CDATA #REQUIRED zonepath CDATA #REQUIRED autoboot (true | false) #REQUIRED ip-type CDATA "" + hostid CDATA "" pool CDATA "" limitpriv CDATA "" bootargs CDATA ""
--- a/usr/src/lib/libzpool/common/kernel.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/lib/libzpool/common/kernel.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -36,6 +36,7 @@ #include <sys/zfs_context.h> #include <sys/zmod.h> #include <sys/utsname.h> +#include <sys/systeminfo.h> /* * Emulation of kernel services in userland. @@ -43,7 +44,7 @@ uint64_t physmem; vnode_t *rootdir = (vnode_t *)0xabcd1234; -char hw_serial[11]; +char hw_serial[HW_HOSTID_LEN]; struct utsname utsname = { "userland", "libzpool", "1", "1", "na" @@ -778,7 +779,7 @@ dprintf("physmem = %llu pages (%.2f GB)\n", physmem, (double)physmem * sysconf(_SC_PAGE_SIZE) / (1ULL << 30)); - snprintf(hw_serial, sizeof (hw_serial), "%ld", gethostid()); + (void) snprintf(hw_serial, sizeof (hw_serial), "%ld", gethostid()); VERIFY((random_fd = open("/dev/random", O_RDONLY)) != -1); VERIFY((urandom_fd = open("/dev/urandom", O_RDONLY)) != -1);
--- a/usr/src/lib/libzpool/common/sys/zfs_context.h Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/lib/libzpool/common/sys/zfs_context.h Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -490,7 +490,7 @@ /* * Hostname information */ -extern char hw_serial[]; +extern char hw_serial[]; /* for userland-emulated hostid access */ extern int ddi_strtoul(const char *str, char **nptr, int base, unsigned long *result);
--- a/usr/src/uts/common/conf/param.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/conf/param.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -63,6 +63,7 @@ #include <sys/cyclic_impl.h> #include <sys/disp.h> #include <sys/tuneable.h> +#include <sys/systeminfo.h> #include <sys/vmem.h> #include <sys/clock.h> @@ -494,6 +495,14 @@ * System Configuration Information */ +/* + * The physical system's host identifier, expressed as a decimal string. + * Code should only directly access this value when writing to it (setting the + * physical system's host identifier). Code that reads the physical system's + * host identifier should use zone_get_hostid(NULL) instead. + */ +char hw_serial[HW_HOSTID_LEN] = "0"; + #if defined(__sparc) /* @@ -502,7 +511,6 @@ */ char architecture[] = "sparcv9"; char architecture_32[] = "sparc"; -char hw_serial[11]; char hw_provider[] = "Sun_Microsystems"; #elif defined(__i386) @@ -513,7 +521,6 @@ */ char architecture[] = "i386"; char architecture_32[] = "i386"; -char hw_serial[11] = "0"; char hw_provider[SYS_NMLN] = ""; #elif defined(__amd64) @@ -524,7 +531,6 @@ */ char architecture[] = "amd64"; char architecture_32[] = "i386"; -char hw_serial[11] = "0"; char hw_provider[SYS_NMLN] = ""; #else
--- a/usr/src/uts/common/fs/nfs/nfs3_srv.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/fs/nfs/nfs3_srv.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -61,6 +61,8 @@ #include <sys/tsol/label.h> #include <sys/tsol/tndb.h> +#include <sys/zone.h> + #include <inet/ip.h> #include <inet/ip6.h> @@ -4574,7 +4576,7 @@ gethrestime(&now); verfp = (struct rfs3_verf_overlay *)&write3verf; verfp->ts = (int)now.tv_sec; - verfp->id = (uint_t)nfs_atoi(hw_serial); + verfp->id = zone_get_hostid(NULL); if (verfp->id == 0) verfp->id = (uint_t)now.tv_nsec;
--- a/usr/src/uts/common/fs/nfs/nfs3_vnops.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/fs/nfs/nfs3_vnops.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -61,6 +61,7 @@ #include <sys/atomic.h> #include <sys/policy.h> #include <sys/sdt.h> +#include <sys/zone.h> #include <rpc/types.h> #include <rpc/auth.h> @@ -2393,7 +2394,7 @@ * reasonable. */ verfp = (nfstime3 *)&args.how.createhow3_u.verf; - verfp->seconds = nfs_atoi(hw_serial); + verfp->seconds = zone_get_hostid(NULL); if (verfp->seconds != 0) verfp->nseconds = newnum(); else {
--- a/usr/src/uts/common/fs/nfs/nfs4_srv.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/fs/nfs/nfs4_srv.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -54,6 +54,7 @@ #include <sys/fem.h> #include <sys/sdt.h> #include <sys/ddi.h> +#include <sys/zone.h> #include <rpc/types.h> #include <rpc/auth.h> @@ -521,7 +522,7 @@ * different servers will have the same verifier. * XXX - this is broken on LP64 kernels. */ - verf.tv_sec = (time_t)nfs_atoi(hw_serial); + verf.tv_sec = (time_t)zone_get_hostid(NULL); if (verf.tv_sec != 0) { verf.tv_nsec = gethrestime_sec(); } else {
--- a/usr/src/uts/common/fs/nfs/nfs4_vnops.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/fs/nfs/nfs4_vnops.c Fri Jan 30 12:25:48 2009 -0800 @@ -62,6 +62,7 @@ #include <sys/sdt.h> #include <sys/list.h> #include <sys/stat.h> +#include <sys/zone.h> #include <rpc/types.h> #include <rpc/auth.h> @@ -929,7 +930,7 @@ open_args->mode = createmode; if (createmode == EXCLUSIVE4) { if (did_excl_setup == FALSE) { - verf.seconds = nfs_atoi(hw_serial); + verf.seconds = zone_get_hostid(NULL); if (verf.seconds != 0) verf.nseconds = newnum(); else {
--- a/usr/src/uts/common/fs/nfs/nfs_subr.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/fs/nfs/nfs_subr.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/param.h> #include <sys/types.h> #include <sys/systm.h> @@ -3302,20 +3300,6 @@ return (news); } -int -nfs_atoi(char *cp) -{ - int n; - - n = 0; - while (*cp != '\0') { - n = n * 10 + (*cp - '0'); - cp++; - } - - return (n); -} - /* * Snapshot callback for nfs:0:nfs_client as registered with the kstat * framework.
--- a/usr/src/uts/common/fs/zfs/spa.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/fs/zfs/spa.c Fri Jan 30 12:25:48 2009 -0800 @@ -60,6 +60,10 @@ #include <sys/sunddi.h> #include <sys/spa_boot.h> +#ifdef _KERNEL +#include <sys/zone.h> +#endif /* _KERNEL */ + #include "zfs_prop.h" #include "zfs_comutil.h" @@ -1222,9 +1226,17 @@ VERIFY(nvlist_lookup_string(newconfig, ZPOOL_CONFIG_HOSTNAME, &hostname) == 0); +#ifdef _KERNEL + myhostid = zone_get_hostid(NULL); +#else /* _KERNEL */ + /* + * We're emulating the system's hostid in userland, so + * we can't use zone_get_hostid(). + */ (void) ddi_strtoul(hw_serial, NULL, 10, &myhostid); +#endif /* _KERNEL */ if (hostid != 0 && myhostid != 0 && - (unsigned long)hostid != myhostid) { + hostid != myhostid) { cmn_err(CE_WARN, "pool '%s' could not be " "loaded as it was last accessed by " "another system (host: %s hostid: 0x%lx). "
--- a/usr/src/uts/common/fs/zfs/spa_config.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/fs/zfs/spa_config.c Fri Jan 30 12:25:48 2009 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -36,6 +36,7 @@ #include <sys/sunddi.h> #ifdef _KERNEL #include <sys/kobj.h> +#include <sys/zone.h> #endif /* @@ -352,7 +353,15 @@ txg) == 0); VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_GUID, spa_guid(spa)) == 0); +#ifdef _KERNEL + hostid = zone_get_hostid(NULL); +#else /* _KERNEL */ + /* + * We're emulating the system's hostid in userland, so we can't use + * zone_get_hostid(). + */ (void) ddi_strtoul(hw_serial, NULL, 10, &hostid); +#endif /* _KERNEL */ if (hostid != 0) { VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_HOSTID, hostid) == 0);
--- a/usr/src/uts/common/io/comstar/stmf/stmf.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/io/comstar/stmf/stmf.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -36,6 +36,7 @@ #include <sys/ethernet.h> #include <sys/sdt.h> #include <sys/nvpair.h> +#include <sys/zone.h> #include <stmf.h> #include <lpif.h> @@ -463,7 +464,7 @@ mutex_enter(&stmf_state.stmf_lock); iocd->stmf_obuf_max_nentries = stmf_state.stmf_nlus; n = min(stmf_state.stmf_nlus, - (iocd->stmf_obuf_size)/sizeof (slist_lu_t)); + (iocd->stmf_obuf_size)/sizeof (slist_lu_t)); iocd->stmf_obuf_nentries = n; ilu = stmf_state.stmf_ilulist; luid_list = (slist_lu_t *)obuf; @@ -480,7 +481,7 @@ mutex_enter(&stmf_state.stmf_lock); iocd->stmf_obuf_max_nentries = stmf_state.stmf_nlports; n = min(stmf_state.stmf_nlports, - (iocd->stmf_obuf_size)/sizeof (slist_target_port_t)); + (iocd->stmf_obuf_size)/sizeof (slist_target_port_t)); iocd->stmf_obuf_nentries = n; ilport = stmf_state.stmf_ilportlist; lportid_list = (slist_target_port_t *)obuf; @@ -502,7 +503,7 @@ } mutex_enter(&stmf_state.stmf_lock); for (ilport = stmf_state.stmf_ilportlist; ilport; ilport = - ilport->ilport_next) { + ilport->ilport_next) { uint8_t *id; id = (uint8_t *)ilport->ilport_lport->lport_id; if ((p_id[3] == id[3]) && @@ -1224,7 +1225,7 @@ if (ilport->ilport_prev_state != STMF_STATE_ONLINE) continue; (void) stmf_ctl(STMF_CMD_LPORT_ONLINE, - ilport->ilport_lport, &ssi); + ilport->ilport_lport, &ssi); } for (ilu = stmf_state.stmf_ilulist; ilu != NULL; @@ -1333,7 +1334,7 @@ additional_size = (additional_size + 7) & (~7); stmf_size = stmf_sizes[struct_id].shared + - stmf_sizes[struct_id].fw_private + additional_size; + stmf_sizes[struct_id].fw_private + additional_size; sh = (__stmf_t *)kmem_zalloc(stmf_size, kmem_flag); @@ -1681,7 +1682,7 @@ } for (pppd = &stmf_state.stmf_ppdlist; *pppd != NULL; - pppd = &((*pppd)->ppd_next)) { + pppd = &((*pppd)->ppd_next)) { if (*pppd == ppd) break; } @@ -1898,7 +1899,7 @@ } ilport->ilport_tg = stmf_lookup_group_for_target(lport->lport_id->ident, - lport->lport_id->ident_length); + lport->lport_id->ident_length); ilport->ilport_rtpid = atomic_add_16_nv(&stmf_rtpid_counter, 1); STMF_EVENT_ALLOC_HANDLE(ilport->ilport_event_hdl); if (stmf_workers_state == STMF_WORKERS_DISABLED) { @@ -2007,7 +2008,7 @@ stmf_deregister_scsi_session(stmf_local_port_t *lport, stmf_scsi_session_t *ss) { stmf_i_local_port_t *ilport = (stmf_i_local_port_t *) - lport->lport_stmf_private; + lport->lport_stmf_private; stmf_i_scsi_session_t *iss, **ppss; int found = 0; @@ -2019,7 +2020,7 @@ try_dereg_ss_again: mutex_enter(&stmf_state.stmf_lock); atomic_and_32(&iss->iss_flags, - ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); + ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); if (iss->iss_flags & ISS_EVENT_ACTIVE) { mutex_exit(&stmf_state.stmf_lock); delay(1); @@ -2053,10 +2054,10 @@ mutex_enter(&stmf_state.stmf_lock); for (ilport = stmf_state.stmf_ilportlist; ilport != NULL; - ilport = ilport->ilport_next) { + ilport = ilport->ilport_next) { rw_enter(&ilport->ilport_lock, RW_WRITER); for (iss = ilport->ilport_ss_list; iss != NULL; - iss = iss->iss_next) { + iss = iss->iss_next) { if (iss->iss_ss->ss_session_id == session_id) { if (!stay_locked) rw_exit(&ilport->ilport_lock); @@ -2081,7 +2082,7 @@ ilu = (stmf_i_lu_t *)lu->lu_stmf_private; mutex_enter(&ilu->ilu_task_lock); for (itlpp = &ilu->ilu_itl_list; (*itlpp) != NULL; - itlpp = &(*itlpp)->itl_next) { + itlpp = &(*itlpp)->itl_next) { if ((*itlpp) == itl) break; } @@ -2089,7 +2090,7 @@ *itlpp = itl->itl_next; mutex_exit(&ilu->ilu_task_lock); lu->lu_abort(lu, STMF_LU_ITL_HANDLE_REMOVED, itl->itl_handle, - (uint32_t)itl->itl_hdlrm_reason); + (uint32_t)itl->itl_hdlrm_reason); kmem_free(itl, sizeof (*itl)); } @@ -2115,7 +2116,7 @@ n = ((uint16_t)lun[1] | (((uint16_t)(lun[0] & 0x3F)) << 8)); lun_map_ent = (stmf_lun_map_ent_t *) - stmf_get_ent_from_map(iss->iss_sm, n); + stmf_get_ent_from_map(iss->iss_sm, n); if ((lun_map_ent == NULL) || (lun_map_ent->ent_lu != lu)) { rw_exit(iss->iss_lockp); return (STMF_NOT_FOUND); @@ -2189,7 +2190,7 @@ if (nmaps == 0) return (STMF_NOT_FOUND); itl_list = (stmf_itl_data_t **)kmem_zalloc( - nmaps * sizeof (stmf_itl_data_t *), KM_SLEEP); + nmaps * sizeof (stmf_itl_data_t *), KM_SLEEP); mutex_enter(&stmf_state.stmf_lock); if (nmaps != ilu->ilu_ref_cnt) { /* Something changed, start all over */ @@ -2199,10 +2200,10 @@ } nu = 0; for (ilport = stmf_state.stmf_ilportlist; ilport != NULL; - ilport = ilport->ilport_next) { + ilport = ilport->ilport_next) { rw_enter(&ilport->ilport_lock, RW_WRITER); for (iss = ilport->ilport_ss_list; iss != NULL; - iss = iss->iss_next) { + iss = iss->iss_next) { lm = iss->iss_sm; if (!lm) continue; @@ -2211,7 +2212,7 @@ continue; ent = (stmf_lun_map_ent_t *)lm->lm_plus[i]; if ((ent->ent_lu == lu) && - (ent->ent_itl_datap)) { + (ent->ent_itl_datap)) { itl_list[nu++] = ent->ent_itl_datap; ent->ent_itl_datap = NULL; if (nu == nmaps) { @@ -2229,7 +2230,7 @@ for (i = 0; i < nu; i++) { stmf_do_itl_dereg(lu, itl_list[i], - STMF_ITL_REASON_DEREG_REQUEST); + STMF_ITL_REASON_DEREG_REQUEST); } kmem_free(itl_list, nmaps * sizeof (stmf_itl_data_t *)); @@ -2266,7 +2267,7 @@ if (lun) { n = ((uint16_t)lun[1] | (((uint16_t)(lun[0] & 0x3F)) << 8)); ent = (stmf_lun_map_ent_t *) - stmf_get_ent_from_map(iss->iss_sm, n); + stmf_get_ent_from_map(iss->iss_sm, n); } else { if (itl_handle == NULL) { rw_exit(iss->iss_lockp); @@ -2284,7 +2285,7 @@ } } if ((ent == NULL) || (ent->ent_lu != lu) || - (ent->ent_itl_datap == NULL)) { + (ent->ent_itl_datap == NULL)) { rw_exit(iss->iss_lockp); return (STMF_NOT_FOUND); } @@ -2329,7 +2330,7 @@ } else { n = ((uint16_t)lun[1] | (((uint16_t)(lun[0] & 0x3F)) << 8)); ent = (stmf_lun_map_ent_t *) - stmf_get_ent_from_map(iss->iss_sm, n); + stmf_get_ent_from_map(iss->iss_sm, n); if (lu && (ent->ent_lu != lu)) ent = NULL; } @@ -2442,7 +2443,8 @@ mutex_enter(&ilu->ilu_task_lock); for (ppitask = &ilu->ilu_free_tasks; (*ppitask != NULL) && ((*ppitask)->itask_cdb_buf_size < cdb_length); - ppitask = &((*ppitask)->itask_lu_free_next)); + ppitask = &((*ppitask)->itask_lu_free_next)) + ; if (*ppitask) { itask = *ppitask; *ppitask = (*ppitask)->itask_lu_free_next; @@ -2743,14 +2745,14 @@ { stmf_local_port_t *lport = task->task_lport; stmf_i_scsi_task_t *itask = (stmf_i_scsi_task_t *) - task->task_stmf_private; + task->task_stmf_private; stmf_free_task_bufs(itask, lport); if (itask->itask_itl_datap) { if (atomic_add_32_nv(&itask->itask_itl_datap->itl_counter, -1) == 0) { stmf_release_itl_handle(task->task_lu, - itask->itask_itl_datap); + itask->itask_itl_datap); } } lport->lport_task_free(task); @@ -2915,8 +2917,8 @@ return (STMF_ABORTED); #ifdef DEBUG if (stmf_drop_buf_counter > 0) { - if (atomic_add_32_nv((uint32_t *)&stmf_drop_buf_counter, - -1) == 1) + if (atomic_add_32_nv((uint32_t *)&stmf_drop_buf_counter, -1) == + 1) return (STMF_SUCCESS); } #endif @@ -3004,7 +3006,7 @@ stmf_send_scsi_status(scsi_task_t *task, uint32_t ioflags) { stmf_i_scsi_task_t *itask = - (stmf_i_scsi_task_t *)task->task_stmf_private; + (stmf_i_scsi_task_t *)task->task_stmf_private; if (ioflags & STMF_IOF_LU_DONE) { uint32_t new, old; do { @@ -3029,12 +3031,12 @@ task->task_expected_xfer_length) { task->task_status_ctrl = TASK_SCTRL_OVER; task->task_resid = task->task_cmd_xfer_length - - task->task_expected_xfer_length; + task->task_expected_xfer_length; } else if (task->task_nbytes_transferred < - task->task_expected_xfer_length) { + task->task_expected_xfer_length) { task->task_status_ctrl = TASK_SCTRL_UNDER; task->task_resid = task->task_expected_xfer_length - - task->task_nbytes_transferred; + task->task_nbytes_transferred; } else { task->task_status_ctrl = 0; task->task_resid = 0; @@ -3121,7 +3123,7 @@ stmf_task_lu_done(scsi_task_t *task) { stmf_i_scsi_task_t *itask = - (stmf_i_scsi_task_t *)task->task_stmf_private; + (stmf_i_scsi_task_t *)task->task_stmf_private; stmf_worker_t *w = itask->itask_worker; uint32_t new, old; @@ -3447,8 +3449,7 @@ } } while (atomic_cas_32(&itask->itask_flags, old, new) != old); if (call_port_abort) { - ret = lport->lport_abort(lport, STMF_LPORT_ABORT_TASK, - task, 0); + ret = lport->lport_abort(lport, STMF_LPORT_ABORT_TASK, task, 0); if ((ret == STMF_ABORT_SUCCESS) || (ret == STMF_NOT_FOUND)) { stmf_task_lport_aborted(task, ret, STMF_IOF_LPORT_DONE); } else if (ret == STMF_BUSY) { @@ -3715,11 +3716,11 @@ return (stmf_info_impl(cmd, arg1, arg2, buf, bufsizep)); } if (cl == SI_LPORT) { - return (((stmf_local_port_t *)arg1)->lport_info(cmd, - arg1, arg2, buf, bufsizep)); + return (((stmf_local_port_t *)arg1)->lport_info(cmd, arg1, + arg2, buf, bufsizep)); } else if (cl == SI_LU) { - return (((stmf_lu_t *)arg1)->lu_info(cmd, arg1, arg2, - buf, bufsizep)); + return (((stmf_lu_t *)arg1)->lu_info(cmd, arg1, arg2, buf, + bufsizep)); } return (STMF_NOT_SUPPORTED); @@ -3784,7 +3785,6 @@ static uint16_t stmf_lu_id_gen_number = 0; -extern char hw_serial[]; stmf_status_t stmf_scsilib_uniq_lu_id(uint32_t company_id, scsi_devid_desc_t *lu_id) @@ -3811,8 +3811,7 @@ p[6] = (company_id >> 4) & 0xff; p[7] = (company_id << 4) & 0xf0; if (!localetheraddr((struct ether_addr *)NULL, &mac)) { - char *hp = &hw_serial[0]; - int hid = BE_32(stoi(&hp)); + int hid = BE_32((int)zone_get_hostid(NULL)); e[0] = (hid >> 24) & 0xff; e[1] = (hid >> 16) & 0xff; @@ -3916,7 +3915,7 @@ p[1] = 0x14; p[3] = 4; ilport = (stmf_i_local_port_t *) - task->task_lport->lport_stmf_private; + task->task_lport->lport_stmf_private; p[6] = (ilport->ilport_rtpid >> 8) & 0xff; p[7] = ilport->ilport_rtpid & 0xff; sz = 8; @@ -3937,7 +3936,7 @@ stmf_scsilib_handle_report_tpgs(scsi_task_t *task, stmf_data_buf_t *dbuf) { stmf_i_scsi_task_t *itask = - (stmf_i_scsi_task_t *)task->task_stmf_private; + (stmf_i_scsi_task_t *)task->task_stmf_private; stmf_xfer_data_t *xd; uint32_t sz, minsz; @@ -3956,7 +3955,7 @@ if (task->task_cmd_xfer_length < 16) { stmf_scsilib_send_status(task, STATUS_CHECK, - STMF_SAA_INVALID_FIELD_IN_CDB); + STMF_SAA_INVALID_FIELD_IN_CDB); return; } @@ -4038,7 +4037,7 @@ if (ilu->ilu_flags & ILU_RESET_ACTIVE) { mutex_exit(&stmf_state.stmf_lock); stmf_scsilib_send_status(task, STATUS_CHECK, - STMF_SAA_OPERATION_IN_PROGRESS); + STMF_SAA_OPERATION_IN_PROGRESS); return; } atomic_or_32(&ilu->ilu_flags, ILU_RESET_ACTIVE); @@ -4058,7 +4057,7 @@ if (stmf_task_poll_lu(task, ITASK_DEFAULT_POLL_TIMEOUT) != STMF_SUCCESS) { stmf_abort(STMF_QUEUE_TASK_ABORT, task, STMF_ALLOC_FAILURE, - NULL); + NULL); return; } } @@ -4090,7 +4089,7 @@ rw_exit(iss->iss_lockp); mutex_exit(&stmf_state.stmf_lock); stmf_scsilib_send_status(task, STATUS_CHECK, - STMF_SAA_OPERATION_IN_PROGRESS); + STMF_SAA_OPERATION_IN_PROGRESS); return; } atomic_or_32(&iss->iss_flags, ISS_RESET_ACTIVE); @@ -4111,7 +4110,7 @@ rw_exit(iss->iss_lockp); mutex_exit(&stmf_state.stmf_lock); stmf_scsilib_send_status(task, STATUS_CHECK, - STMF_SAA_OPERATION_IN_PROGRESS); + STMF_SAA_OPERATION_IN_PROGRESS); return; } } @@ -4126,7 +4125,7 @@ /* ok, start the damage */ itask->itask_flags |= ITASK_DEFAULT_HANDLING | - ITASK_CAUSING_TARGET_RESET; + ITASK_CAUSING_TARGET_RESET; for (i = 0; i < lm->lm_nentries; i++) { if (lm->lm_plus[i] == NULL) continue; @@ -4142,14 +4141,14 @@ continue; lm_ent = (stmf_lun_map_ent_t *)lm->lm_plus[i]; stmf_abort(STMF_QUEUE_ABORT_LU, task, STMF_ABORTED, - lm_ent->ent_lu); + lm_ent->ent_lu); } /* Start polling on this task */ if (stmf_task_poll_lu(task, ITASK_DEFAULT_POLL_TIMEOUT) != STMF_SUCCESS) { stmf_abort(STMF_QUEUE_TASK_ABORT, task, STMF_ALLOC_FAILURE, - NULL); + NULL); return; } } @@ -4168,7 +4167,7 @@ return (0); } atomic_and_32(&iss->iss_flags, - ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); + ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); rw_exit(iss->iss_lockp); if (task->task_cdb[0] == SCMD_REPORT_LUNS) { @@ -4289,7 +4288,7 @@ w->worker_wait_head; else w->worker_task_tail->itask_worker_next = - w->worker_wait_head; + w->worker_wait_head; w->worker_task_tail = w->worker_wait_tail; w->worker_wait_head = w->worker_wait_tail = NULL; @@ -4732,7 +4731,7 @@ if (sz < 16) { stmf_scsilib_send_status(task, STATUS_CHECK, - STMF_SAA_INVALID_FIELD_IN_CDB); + STMF_SAA_INVALID_FIELD_IN_CDB); return; } @@ -4764,7 +4763,7 @@ stmf_xd_to_dbuf(dbuf); atomic_and_32(&iss->iss_flags, - ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); + ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); dbuf->db_flags = DB_DIRECTION_TO_RPORT; (void) stmf_xfer_data(task, dbuf, 0); return; @@ -4809,7 +4808,7 @@ { scsi_task_t *task = (scsi_task_t *)arg; stmf_i_scsi_task_t *itask = - (stmf_i_scsi_task_t *)task->task_stmf_private; + (stmf_i_scsi_task_t *)task->task_stmf_private; stmf_i_lu_t *ilu = (stmf_i_lu_t *)task->task_lu->lu_stmf_private; int i; uint8_t map; @@ -4931,7 +4930,7 @@ stmf_abort_target_reset(scsi_task_t *task) { stmf_i_scsi_session_t *iss = (stmf_i_scsi_session_t *) - task->task_session->ss_stmf_private; + task->task_session->ss_stmf_private; stmf_lun_map_t *lm; stmf_lun_map_ent_t *lm_ent; stmf_i_lu_t *ilu; @@ -5018,7 +5017,7 @@ stmf_target_reset_poll(struct scsi_task *task) { stmf_i_scsi_session_t *iss = (stmf_i_scsi_session_t *) - task->task_session->ss_stmf_private; + task->task_session->ss_stmf_private; stmf_lun_map_t *lm; stmf_lun_map_ent_t *lm_ent; stmf_i_lu_t *ilu; @@ -5102,7 +5101,7 @@ stmf_lport_add_event(stmf_local_port_t *lport, int eventid) { stmf_i_local_port_t *ilport = - (stmf_i_local_port_t *)lport->lport_stmf_private; + (stmf_i_local_port_t *)lport->lport_stmf_private; if ((eventid < 0) || (eventid >= STMF_MAX_NUM_EVENTS)) { return (STMF_INVALID_ARG); @@ -5116,7 +5115,7 @@ stmf_lport_remove_event(stmf_local_port_t *lport, int eventid) { stmf_i_local_port_t *ilport = - (stmf_i_local_port_t *)lport->lport_stmf_private; + (stmf_i_local_port_t *)lport->lport_stmf_private; if (eventid == STMF_EVENT_ALL) { STMF_EVENT_CLEAR_ALL(ilport->ilport_event_hdl); @@ -5239,7 +5238,7 @@ /* Kill all the pending I/Os for this LU */ mutex_exit(&stmf_state.stmf_lock); stmf_task_lu_killall((stmf_lu_t *)req->svc_obj, NULL, - STMF_ABORTED); + STMF_ABORTED); mutex_enter(&stmf_state.stmf_lock); waitq_add = 1; break; @@ -5369,28 +5368,28 @@ port_level++; stmf_level++; atomic_and_32(&iss->iss_flags, - ~ISS_GOT_INITIAL_LUNS); + ~ISS_GOT_INITIAL_LUNS); atomic_or_32(&iss->iss_flags, - ISS_EVENT_ACTIVE); + ISS_EVENT_ACTIVE); rw_exit(&ilport->ilport_lock); mutex_exit(&stmf_state.stmf_lock); stmf_generate_lport_event(ilport, LPORT_EVENT_INITIAL_LUN_MAPPED, iss->iss_ss, 0); atomic_and_32(&iss->iss_flags, - ~ISS_EVENT_ACTIVE); + ~ISS_EVENT_ACTIVE); mutex_enter(&stmf_state.stmf_lock); /* * scan all the ilports again as the * ilport list might have changed. */ next_ilport = - stmf_state.stmf_ilportlist; + stmf_state.stmf_ilportlist; break; } if (port_level == 0) { atomic_and_32(&ilport->ilport_flags, - ~ILPORT_SS_GOT_INITIAL_LUNS); + ~ILPORT_SS_GOT_INITIAL_LUNS); } /* drop the lock if we are holding it. */ if (rw_lock_held(&ilport->ilport_lock))
--- a/usr/src/uts/common/io/lvm/md/md_mddb.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/io/lvm/md/md_mddb.c Fri Jan 30 12:25:48 2009 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -3413,7 +3413,7 @@ bzero((caddr_t)&tag, sizeof (mddb_dtag_t)); /* Get the HW serial number for this host */ - (void) strncpy(tag.dt_sn, hw_serial, MDDB_SN_LEN); + (void) snprintf(tag.dt_sn, MDDB_SN_LEN, "%u", zone_get_hostid(NULL)); tag.dt_sn[MDDB_SN_LEN - 1] = '\0'; /* Get the nodename that this host goes by */ @@ -6005,106 +6005,133 @@ * Don't do this during upgrade. */ if (!(MD_UPGRADE)) { - for (li = 0; li < lbp->lb_loccnt; li++) { - lp = &lbp->lb_locators[li]; - if (lp->l_flags & MDDB_F_DELETED) - continue; - did_info = &(did_icp->did_ic_blkp->blk_info[li]); - if ((did_info->info_flags & MDDB_DID_VALID) && - !(did_info->info_flags & MDDB_DID_UPDATED)) { - if (lbp->lb_flags & MDDB_MNSET) { - int j; - int index = -1; - mnlbp = (mddb_mnlb_t *)lbp; - for (j = 0; j < MD_MNMAXSIDES; j++) { - mnslp = &mnlbp-> - lb_mnsidelocators[j][li]; - if (mnslp->mnl_sideno == - s->s_sideno) - break; - if (mnslp->mnl_sideno == 0) - index = j; + for (li = 0; li < lbp->lb_loccnt; li++) { + lp = &lbp->lb_locators[li]; + if (lp->l_flags & MDDB_F_DELETED) + continue; + did_info = &(did_icp->did_ic_blkp->blk_info + [li]); + if ((did_info->info_flags & MDDB_DID_VALID) && + !(did_info->info_flags & + MDDB_DID_UPDATED)) { + if (lbp->lb_flags & MDDB_MNSET) { + int j; + int index = -1; + mnlbp = (mddb_mnlb_t *)lbp; + for (j = 0; j < MD_MNMAXSIDES; + j++) { + mnslp = &mnlbp-> + lb_mnsidelocators[j] + [li]; + if (mnslp->mnl_sideno == + s->s_sideno) + break; + if (mnslp->mnl_sideno == + 0) + index = j; + } + if (j == MD_MNMAXSIDES) { + /* + * No match found; take + * empty + */ + mnslp = &mnlbp-> + lb_mnsidelocators + [index][li]; + write_lb = 1; + mnslp->mnl_mnum = + md_getminor(newdev + [li]); + } else if (mnslp->mnl_mnum != + md_getminor(newdev[li])) { + write_lb = 1; + mnslp->mnl_mnum = + md_getminor(newdev + [li]); + } + } else { + slp = &lbp-> + lb_sidelocators[s->s_sideno] + [li]; + if (slp->l_mnum != + md_getminor(newdev[li])) { + write_lb = 1; + slp->l_mnum = + md_getminor(newdev + [li]); + } } - if (j == MD_MNMAXSIDES) { - /* No match found; take empty */ - mnslp = &mnlbp-> - lb_mnsidelocators[index][li]; - write_lb = 1; - mnslp->mnl_mnum = - md_getminor(newdev[li]); - } else if (mnslp->mnl_mnum != - md_getminor(newdev[li])) { + name = ddi_major_to_name(md_getmajor( + newdev[li])); + if (lbp->lb_flags & MDDB_MNSET) + i = mnslp->mnl_drvnm_index; + else + i = slp->l_drvnm_index; + if (strncmp(lbp->lb_drvnm[i].dn_data, + name, lbp->lb_drvnm[i].dn_len) != + 0) { + /* Driver name has changed */ + len = strlen(name); + /* Look for the driver name */ + for (i = 0; i < MDDB_DRVNMCNT; + i++) { + if (lbp->lb_drvnm[i]. + dn_len != len) + continue; + if (strncmp(lbp-> + lb_drvnm[i].dn_data, + name, len) == 0) + break; + } + /* Didn't find one, add it */ + if (i == MDDB_DRVNMCNT) { + for (i = 0; i < + MDDB_DRVNMCNT; + i++) { + if (lbp-> + lb_drvnm[i]. + dn_len == 0) + break; + } + if (i == + MDDB_DRVNMCNT) { + cmn_err(CE_WARN, + "Unable to " + " update " + "driver " + " name for " + "dev: " + "major = %d" + ", minor = " + "%d\n", + md_getmajor( + newdev[li]), + md_getminor( + newdev + [li])); + continue; + } + (void) strncpy(lbp-> + lb_drvnm[i].dn_data, + name, MD_MAXDRVNM); + lbp->lb_drvnm[i]. + dn_len = (uchar_t) + strlen(name); + } + /* Fill in the drvnm index */ + if (lbp->lb_flags & + MDDB_MNSET) + mnslp->mnl_drvnm_index = + i; + else + slp->l_drvnm_index = i; write_lb = 1; - mnslp->mnl_mnum = - md_getminor(newdev[li]); } - } else { - slp = &lbp-> - lb_sidelocators[s->s_sideno][li]; - if (slp->l_mnum != - md_getminor(newdev[li])) { - write_lb = 1; - slp->l_mnum = - md_getminor(newdev[li]); - } - } - name = ddi_major_to_name( - md_getmajor(newdev[li])); - if (lbp->lb_flags & MDDB_MNSET) { - i = mnslp->mnl_drvnm_index; - } else { - i = slp->l_drvnm_index; + did_info->info_flags |= + MDDB_DID_UPDATED; } - if (strncmp(lbp->lb_drvnm[i].dn_data, name, - lbp->lb_drvnm[i].dn_len) != 0) { - /* Driver name has changed */ - len = strlen(name); - /* Look for the driver name */ - for (i = 0; i < MDDB_DRVNMCNT; i++) { - if (lbp->lb_drvnm[i].dn_len - != len) - continue; - if (strncmp( - lbp->lb_drvnm[i].dn_data, - name, len) == 0) - break; - } - /* Didn't find one, add it */ - if (i == MDDB_DRVNMCNT) { - for (i = 0; i < MDDB_DRVNMCNT; - i++) { - if (lbp->lb_drvnm[i].dn_len - == 0) - break; - } - if (i == MDDB_DRVNMCNT) { - cmn_err(CE_WARN, - "Unable to update driver" - " name for dev: " - "major = %d, " - "minor = %d\n", - md_getmajor(newdev[li]), - md_getminor(newdev[li])); - continue; - } - (void) strncpy( - lbp->lb_drvnm[i].dn_data, - name, MD_MAXDRVNM); - lbp->lb_drvnm[i].dn_len = - (uchar_t)strlen(name); - } - /* Fill in the drvnm index */ - if (lbp->lb_flags & MDDB_MNSET) { - mnslp->mnl_drvnm_index = i; - } else { - slp->l_drvnm_index = i; - } - write_lb = 1; - } - did_info->info_flags |= MDDB_DID_UPDATED; - } - } - } + } + } } kmem_free(newdev, sizeof (md_dev64_t) * MDDB_NLB); @@ -7092,7 +7119,8 @@ s->s_setno = setno; s->s_sideno = sideno; if (setno == MD_LOCAL_SET) { - (void) strcpy(s->s_ident.serial, hw_serial); + (void) snprintf(s->s_ident.serial, sizeof (s->s_ident.serial), + "%u", zone_get_hostid(NULL)); } else { s->s_ident.createtime = *created; s->s_setname = (char *)kmem_alloc(strlen(setname) + 1, @@ -11356,34 +11384,38 @@ for (tdep = first_dep; tdep; tdep = tdep->de_next) { if (dep->de_recid == tdep->de_recid) { - writeout = 0; - /* Check first mddb location */ - if ((dep->de_optinfo[0].o_li != - tdep->de_optinfo[0].o_li) || - (dep->de_optinfo[0].o_flags != - tdep->de_optinfo[0].o_flags)) { - dep->de_optinfo[0] = - tdep->de_optinfo[0]; - writeout = 1; - } - /* Check second mddb location */ - if ((dep->de_optinfo[1].o_li != - tdep->de_optinfo[1].o_li) || - (dep->de_optinfo[1].o_flags != - tdep->de_optinfo[1].o_flags)) { - dep->de_optinfo[1] = - tdep->de_optinfo[1]; - writeout = 1; - } - /* Record owner should rewrite it */ - if ((writeout) && - (dep->de_owner_nodeid == - md_set[mpp->c_setno]. - s_nodeid)) { - (void) writeoptrecord(s, - dep); - } - break; + writeout = 0; + /* Check first mddb location */ + if ((dep->de_optinfo[0].o_li != + tdep->de_optinfo[0].o_li) || + (dep->de_optinfo[0]. + o_flags != tdep->de_optinfo + [0].o_flags)) { + dep->de_optinfo[0] = + tdep->de_optinfo[0]; + writeout = 1; + } + /* Check second mddb location */ + if ((dep->de_optinfo[1].o_li != + tdep->de_optinfo[1].o_li) || + (dep->de_optinfo[1]. + o_flags != tdep->de_optinfo + [1].o_flags)) { + dep->de_optinfo[1] = + tdep->de_optinfo[1]; + writeout = 1; + } + /* + * Record owner should rewrite + * it + */ + if ((writeout) && + (dep->de_owner_nodeid == + md_set[mpp->c_setno]. + s_nodeid)) + (void) writeoptrecord(s, + dep); + break; } } }
--- a/usr/src/uts/common/io/mms/dda/dda.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/io/mms/dda/dda.c Fri Jan 30 12:25:48 2009 -0800 @@ -18,7 +18,7 @@ * * CDDL HEADER END * - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -82,6 +82,7 @@ #include <sys/scsi/impl/uscsi.h> /* uscsi commands */ #include <sys/ioctl.h> #include <sys/mtio.h> /* tape io */ +#include <sys/systeminfo.h> /* for hostid access */ #include <sys/scsi/targets/stdef.h> #include <sys/fs/ufs_inode.h> #include <sys/vfs.h> @@ -314,7 +315,6 @@ /* dev_info structure, one instance per dda device */ static void *dda_state; -extern char hw_serial[]; /* Loadable module configuration entry points */ @@ -1629,9 +1629,6 @@ * Parameters: * - dda: DDA tape drive. * - * Globals: - * - hw_serial: Hostid. - * * Generate DDA unit serial number from the computer hostid and drive * instance number. * @@ -1645,16 +1642,13 @@ char sn[100]; int len; int off; - char *hostid_p = &hw_serial[0]; - int hostid_i; /* * Generate unit serial number: * zeros, hostid, instance number */ - hostid_i = stoi(&hostid_p); - len = snprintf(sn, sizeof (sn), - "%016x%x%x", 0, hostid_i, dda->dda_inst); + len = snprintf(sn, sizeof (sn), "%016x%x%x", 0, zone_get_hostid(NULL), + dda->dda_inst); /* * Use least significant part of generated serial number
--- a/usr/src/uts/common/nfs/nfs.h Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/nfs/nfs.h Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -914,7 +914,6 @@ extern int setdirmode(vnode_t *, mode_t *, cred_t *); extern int newnum(void); extern char *newname(void); -extern int nfs_atoi(char *); extern int nfs_subrinit(void); extern void nfs_subrfini(void); extern enum nfsstat puterrno(int);
--- a/usr/src/uts/common/os/sunddi.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/os/sunddi.c Fri Jan 30 12:25:48 2009 -0800 @@ -82,6 +82,7 @@ #include <sys/ctype.h> #include <net/if.h> #include <sys/rctl.h> +#include <sys/zone.h> extern pri_t minclsyspri; @@ -7614,7 +7615,6 @@ return (DDI_FAILURE); } -extern char hw_serial[]; static kmutex_t devid_gen_mutex; static short devid_gen_number; @@ -7858,8 +7858,7 @@ /* Fill in id field */ if (devid_type == DEVID_FAB) { char *cp; - int hostid; - char *hostid_cp = &hw_serial[0]; + uint32_t hostid; struct timeval32 timestamp32; int i; int *ip; @@ -7873,7 +7872,7 @@ cp = i_devid->did_id; /* Fill in host id (big-endian byte ordering) */ - hostid = stoi(&hostid_cp); + hostid = zone_get_hostid(NULL); *cp++ = hibyte(hiword(hostid)); *cp++ = lobyte(hiword(hostid)); *cp++ = hibyte(loword(hostid));
--- a/usr/src/uts/common/os/zone.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/os/zone.c Fri Jan 30 12:25:48 2009 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -1725,6 +1725,7 @@ zone0.zone_name = GLOBAL_ZONENAME; zone0.zone_nodename = utsname.nodename; zone0.zone_domain = srpc_domain; + zone0.zone_hostid = HW_INVALID_HOSTID; zone0.zone_ref = 1; zone0.zone_id = GLOBAL_ZONEID; zone0.zone_status = ZONE_IS_RUNNING; @@ -2906,6 +2907,27 @@ } /* + * Gets the 32-bit hostid of the specified zone as an unsigned int. If 'zonep' + * is NULL or it points to a zone with no hostid emulation, then the machine's + * hostid (i.e., the global zone's hostid) is returned. This function returns + * zero if neither the zone nor the host machine (global zone) have hostids. It + * returns HW_INVALID_HOSTID if the function attempts to return the machine's + * hostid and the machine's hostid is invalid. + */ +uint32_t +zone_get_hostid(zone_t *zonep) +{ + unsigned long machine_hostid; + + if (zonep == NULL || zonep->zone_hostid == HW_INVALID_HOSTID) { + if (ddi_strtoul(hw_serial, NULL, 10, &machine_hostid) != 0) + return (HW_INVALID_HOSTID); + return ((uint32_t)machine_hostid); + } + return (zonep->zone_hostid); +} + +/* * Similar to thread_create(), but makes sure the thread is in the appropriate * zone's zsched process (curproc->p_zone->zone_zsched) before returning. */ @@ -3800,6 +3822,7 @@ zone->zone_domain = kmem_alloc(_SYS_NMLN, KM_SLEEP); zone->zone_domain[0] = '\0'; + zone->zone_hostid = HW_INVALID_HOSTID; zone->zone_shares = 1; zone->zone_shmmax = 0; zone->zone_ipc.ipcq_shmmni = 0; @@ -4722,6 +4745,17 @@ mutex_exit(&class_lock); break; + case ZONE_ATTR_HOSTID: + if (zone->zone_hostid != HW_INVALID_HOSTID && + bufsize == sizeof (zone->zone_hostid)) { + size = sizeof (zone->zone_hostid); + if (buf != NULL && copyout(&zone->zone_hostid, buf, + bufsize) != 0) + error = EFAULT; + } else { + error = EINVAL; + } + break; default: if ((attr >= ZONE_ATTR_BRAND_ATTRS) && ZONE_IS_BRANDED(zone)) { size = bufsize; @@ -4791,6 +4825,16 @@ case ZONE_ATTR_SCHED_CLASS: err = zone_set_sched_class(zone, (const char *)buf); break; + case ZONE_ATTR_HOSTID: + if (bufsize == sizeof (zone->zone_hostid)) { + if (copyin(buf, &zone->zone_hostid, bufsize) == 0) + err = 0; + else + err = EFAULT; + } else { + err = EINVAL; + } + break; default: if ((attr >= ZONE_ATTR_BRAND_ATTRS) && ZONE_IS_BRANDED(zone)) err = ZBROP(zone)->b_setattr(zone, attr, buf, bufsize);
--- a/usr/src/uts/common/sys/systeminfo.h Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/sys/systeminfo.h Fri Jan 30 12:25:48 2009 -0800 @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -31,8 +30,6 @@ #ifndef _SYS_SYSTEMINFO_H #define _SYS_SYSTEMINFO_H -#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.4 */ - #ifdef __cplusplus extern "C" { #endif @@ -40,7 +37,7 @@ #ifdef _KERNEL extern char architecture[]; extern char architecture_32[]; -extern char hw_serial[]; +extern char hw_serial[]; /* machine's 32-bit hostid; a decimal string */ extern char hw_provider[]; extern char srpc_domain[]; extern char platform[]; @@ -93,7 +90,12 @@ /* Solaris defined `set' commands (769-1024) (none currently assigned) */ -#define DOM_NM_LN 64 /* maximum length of domain name */ +#define HW_INVALID_HOSTID 0xFFFFFFFF /* an invalid hostid */ +#define HW_HOSTID_LEN 11 /* minimum buffer size needed */ + /* to hold a decimal or hex */ + /* hostid string */ +#define DOM_NM_LN 64 /* maximum length of domain */ + /* name */ #if !defined(_KERNEL) #if defined(__STDC__)
--- a/usr/src/uts/common/sys/zone.h Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/sys/zone.h Fri Jan 30 12:25:48 2009 -0800 @@ -19,15 +19,13 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _SYS_ZONE_H #define _SYS_ZONE_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/types.h> #include <sys/mutex.h> #include <sys/param.h> @@ -97,6 +95,7 @@ #define ZONE_ATTR_PHYS_MCAP 12 #define ZONE_ATTR_SCHED_CLASS 13 #define ZONE_ATTR_FLAGS 14 +#define ZONE_ATTR_HOSTID 15 /* Start of the brand-specific attribute namespace */ #define ZONE_ATTR_BRAND_ATTRS 32768 @@ -320,6 +319,17 @@ char *zone_nodename; /* utsname.nodename equivalent */ char *zone_domain; /* srpc_domain equivalent */ /* + * zone_hostid is used for per-zone hostid emulation. + * Currently it isn't modified after it's set (so no locks protect + * accesses), but that might have to change when we allow + * administrators to change running zones' properties. + * + * The global zone's zone_hostid must always be HW_INVALID_HOSTID so + * that zone_get_hostid() will function correctly. + */ + uint32_t zone_hostid; /* zone's hostid, HW_INVALID_HOSTID */ + /* if not emulated */ + /* * zone_lock protects the following fields of a zone_t: * zone_ref * zone_cred_ref @@ -599,6 +609,13 @@ extern zone_status_t zone_status_get(zone_t *); /* + * Safely get the hostid of the specified zone (defaults to machine's hostid + * if the specified zone doesn't emulate a hostid). Passing NULL retrieves + * the global zone's (i.e., physical system's) hostid. + */ +extern uint32_t zone_get_hostid(zone_t *); + +/* * Get the "kcred" credentials corresponding to the given zone. */ extern struct cred *zone_get_kcred(zoneid_t);
--- a/usr/src/uts/common/syscall/systeminfo.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/common/syscall/systeminfo.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,15 +19,13 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ /* All rights reserved. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/param.h> #include <sys/types.h> #include <sys/sysmacros.h> @@ -57,6 +55,7 @@ int error = 0; long strcnt, getcnt; char *kstr; + char hostidp[HW_HOSTID_LEN]; if (count < 0 && command != SI_SET_HOSTNAME && command != SI_SET_SRPC_DOMAIN) @@ -103,7 +102,9 @@ break; #endif case SI_HW_SERIAL: - kstr = hw_serial; + (void) snprintf(hostidp, sizeof (hostidp), "%u", + zone_get_hostid(curzone)); + kstr = hostidp; break; case SI_HW_PROVIDER: kstr = hw_provider;
--- a/usr/src/uts/i86pc/os/startup.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/i86pc/os/startup.c Fri Jan 30 12:25:48 2009 -0800 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -114,6 +114,7 @@ #include <sys/debug_info.h> #include <sys/bootinfo.h> #include <sys/ddi_timer.h> +#include <sys/systeminfo.h> #include <sys/multiboot.h> #ifdef __xpv @@ -144,7 +145,6 @@ #include <sys/rtc.h> static int32_t set_soft_hostid(void); -extern char hw_serial[]; static char hostid_file[] = "/etc/hostid"; #endif @@ -1484,11 +1484,11 @@ /* * This is needed here to initialize hw_serial[] for cluster booting. */ - if ((h = set_soft_hostid()) == -1) + if ((h = set_soft_hostid()) == HW_INVALID_HOSTID) { cmn_err(CE_WARN, "Unable to set hostid"); - else { + } else { for (v = h, cnt = 0; cnt < 10; cnt++) { - d[cnt] = v % 10; + d[cnt] = (char)(v % 10); v /= 10; if (v == 0) break; @@ -2118,7 +2118,6 @@ PRM_POINT("startup_end() done"); } -extern char hw_serial[]; /* * Don't remove the following 2 variables. They are necessary * for reading the hostid from the legacy file (/kernel/misc/sysinit). @@ -2557,7 +2556,7 @@ int done = 0; u_longlong_t tmp; int i; - int32_t hostid = -1; + int32_t hostid = (int32_t)HW_INVALID_HOSTID; unsigned char *c; hrtime_t tsc; @@ -2583,7 +2582,7 @@ hostid = (int32_t)atoi(hw_serial); (void) modunload(i); } - if (hostid == -1) { + if (hostid == HW_INVALID_HOSTID) { tsc = tsc_read(); if (tsc == 0) /* tsc_read can return zero sometimes */ hostid = (int32_t)tenmicrodata & 0x0CFFFFF; @@ -2638,7 +2637,7 @@ } } - if (hostid == -1) /* didn't find a hostid string */ + if (hostid == HW_INVALID_HOSTID) /* didn't find a hostid */ kobj_file_err(CE_WARN, file, "hostid missing or corrupt"); @@ -2646,7 +2645,8 @@ } /* * hostid is now the value read from /etc/hostid, or the - * new hostid we generated in this routine or -1 if not set. + * new hostid we generated in this routine or HW_INVALID_HOSTID if not + * set. */ return (hostid); }
--- a/usr/src/uts/sun4/os/ddi_impl.c Fri Jan 30 11:54:57 2009 -0800 +++ b/usr/src/uts/sun4/os/ddi_impl.c Fri Jan 30 12:25:48 2009 -0800 @@ -20,12 +20,10 @@ */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * sun4 specific DDI implementation */ @@ -1742,14 +1740,10 @@ parse_idprom(void) { if (idprom.id_format == IDFORM_1) { - uint_t i; - (void) localetheraddr((struct ether_addr *)idprom.id_ether, (struct ether_addr *)NULL); - - i = idprom.id_machine << 24; - i = i + idprom.id_serial; - numtos((ulong_t)i, hw_serial); + (void) snprintf(hw_serial, HW_HOSTID_LEN, "%u", + (idprom.id_machine << 24) + idprom.id_serial); } else prom_printf("Invalid format code in IDprom.\n"); }