From 99639e4a13306c3809b52e487d4343d756fad2e2 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 19 Feb 2009 11:26:17 -0800 Subject: [PATCH] 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!" --- include/sys/proc.h | 1 + include/sys/sysmacros.h | 1 + include/sys/systeminfo.h | 5 +++++ module/spl/spl-generic.c | 18 +++++++++++++++++- module/spl/spl-proc.c | 3 ++- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/sys/proc.h b/include/sys/proc.h index ab2425ce89..a4b1da55a4 100644 --- a/include/sys/proc.h +++ b/include/sys/proc.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h index 03e72a1458..923cc22e7c 100644 --- a/include/sys/sysmacros.h +++ b/include/sys/sysmacros.h @@ -143,6 +143,7 @@ extern int p0; /* Missing misc functions */ extern int highbit(unsigned long i); +extern uint32_t zone_get_hostid(void *zone); #define makedevice(maj,min) makedev(maj,min) diff --git a/include/sys/systeminfo.h b/include/sys/systeminfo.h index e297f2a5a3..0e89345549 100644 --- a/include/sys/systeminfo.h +++ b/include/sys/systeminfo.h @@ -1,4 +1,9 @@ #ifndef _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 */ diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index a15cac41ec..96a14c62e1 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -47,7 +48,7 @@ char spl_version[16] = "SPL v" VERSION; long spl_hostid = 0; EXPORT_SYMBOL(spl_hostid); -char hw_serial[11] = ""; +char hw_serial[HW_HOSTID_LEN] = ""; EXPORT_SYMBOL(hw_serial); int p0 = 0; @@ -253,6 +254,21 @@ set_hostid(void) 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) { int rc = 0; diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index 1ae1c129ae..90c89ce31b 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -470,7 +470,8 @@ proc_dohostid(struct ctl_table *table, int write, struct file *filp, RETURN(-EINVAL); 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; } else { len = snprintf(str, sizeof(str), "%lx", spl_hostid);