Add zone_get_hostid() function

Minimal support added for the zone_get_hostid() function.  Only
global zones are supported therefore this function must be called
with a NULL argumment.  Additionally, I've added the HW_HOSTID_LEN
define and updated all instances where a hard coded magic value
of 11 was used; "A good riddance of bad rubbish!"
This commit is contained in:
Brian Behlendorf 2009-02-19 11:26:17 -08:00
parent 63a93055fb
commit 99639e4a13
5 changed files with 26 additions and 2 deletions

View File

@ -33,6 +33,7 @@
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <sys/systeminfo.h>
#include <sys/kmem.h> #include <sys/kmem.h>
#include <sys/mutex.h> #include <sys/mutex.h>
#include <sys/kstat.h> #include <sys/kstat.h>

View File

@ -143,6 +143,7 @@ extern int p0;
/* Missing misc functions */ /* Missing misc functions */
extern int highbit(unsigned long i); extern int highbit(unsigned long i);
extern uint32_t zone_get_hostid(void *zone);
#define makedevice(maj,min) makedev(maj,min) #define makedevice(maj,min) makedev(maj,min)

View File

@ -1,4 +1,9 @@
#ifndef _SPL_SYSTEMINFO_H #ifndef _SPL_SYSTEMINFO_H
#define _SPL_SYSTEMINFO_H #define _SPL_SYSTEMINFO_H
#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 */
#endif /* SPL_SYSTEMINFO_H */ #endif /* SPL_SYSTEMINFO_H */

View File

@ -25,6 +25,7 @@
*/ */
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <sys/systeminfo.h>
#include <sys/vmsystm.h> #include <sys/vmsystm.h>
#include <sys/vnode.h> #include <sys/vnode.h>
#include <sys/kmem.h> #include <sys/kmem.h>
@ -47,7 +48,7 @@ char spl_version[16] = "SPL v" VERSION;
long spl_hostid = 0; long spl_hostid = 0;
EXPORT_SYMBOL(spl_hostid); EXPORT_SYMBOL(spl_hostid);
char hw_serial[11] = "<none>"; char hw_serial[HW_HOSTID_LEN] = "<none>";
EXPORT_SYMBOL(hw_serial); EXPORT_SYMBOL(hw_serial);
int p0 = 0; int p0 = 0;
@ -253,6 +254,21 @@ set_hostid(void)
return call_usermodehelper(sh_path, argv, envp, 1); return call_usermodehelper(sh_path, argv, envp, 1);
} }
uint32_t
zone_get_hostid(void *zone)
{
unsigned long hostid;
/* Only the global zone is supported */
ASSERT(zone == NULL);
if (ddi_strtoul(hw_serial, NULL, HW_HOSTID_LEN-1, &hostid) != 0)
return HW_INVALID_HOSTID;
return (uint32_t)hostid;
}
EXPORT_SYMBOL(zone_get_hostid);
static int __init spl_init(void) static int __init spl_init(void)
{ {
int rc = 0; int rc = 0;

View File

@ -470,7 +470,8 @@ proc_dohostid(struct ctl_table *table, int write, struct file *filp,
RETURN(-EINVAL); RETURN(-EINVAL);
spl_hostid = (long)val; spl_hostid = (long)val;
(void)snprintf(hw_serial, 11, "%u", (val >= 0) ? val : -val); (void)snprintf(hw_serial, HW_HOSTID_LEN-1, "%u",
(val >= 0) ? val : -val);
*ppos += *lenp; *ppos += *lenp;
} else { } else {
len = snprintf(str, sizeof(str), "%lx", spl_hostid); len = snprintf(str, sizeof(str), "%lx", spl_hostid);