From f47f028ae6f039c13d3138e2ee1c0056a3a3f789 Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Mon, 11 Mar 2013 21:16:36 -0400 Subject: [PATCH] Simplify hostid logic There is plenty of compatibility code for a hw_hostid that isn't used by anything. At the same time, there are apparently issues with the current hostid logic. coredumb in #zfsonlinux on freenode reported that Fedora 17 changes its hostid on every boot, which required force importing his pool. A suggestion by wca was to adopt FreeBSD's behavior, where it treats hostid as zero if /etc/hostid does not exist Adopting FreeBSD's behavior permits us to eliminate plenty of code, including a userland helper that invokes the system's hostid as a fallback. Signed-off-by: Richard Yao --- include/sys/sysmacros.h | 1 - include/sys/systeminfo.h | 3 +-- module/spl/spl-generic.c | 55 ++++++------------------------------------------ module/spl/spl-proc.c | 11 ---------- 4 files changed, 7 insertions(+), 63 deletions(-) diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h index 7c4da67..4dd2685 100644 --- a/include/sys/sysmacros.h +++ b/include/sys/sysmacros.h @@ -138,7 +138,6 @@ /* Missing globals */ extern char spl_version[32]; extern unsigned long spl_hostid; -extern char hw_serial[11]; /* Missing misc functions */ extern int highbit(unsigned long i); diff --git a/include/sys/systeminfo.h b/include/sys/systeminfo.h index e22a085..a4c1984 100644 --- a/include/sys/systeminfo.h +++ b/include/sys/systeminfo.h @@ -25,6 +25,5 @@ #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 */ diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index 3cef489..b8e2ed1 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -52,14 +52,11 @@ char spl_version[32] = "SPL v" SPL_META_VERSION "-" SPL_META_RELEASE; EXPORT_SYMBOL(spl_version); -unsigned long spl_hostid = HW_INVALID_HOSTID; +unsigned long spl_hostid = 0; EXPORT_SYMBOL(spl_hostid); module_param(spl_hostid, ulong, 0644); MODULE_PARM_DESC(spl_hostid, "The system hostid."); -char hw_serial[HW_HOSTID_LEN] = ""; -EXPORT_SYMBOL(hw_serial); - proc_t p0 = { 0 }; EXPORT_SYMBOL(p0); @@ -467,7 +464,7 @@ struct new_utsname *__utsname(void) int result; uint64_t size; struct _buf *file; - unsigned long hostid = 0; + uint32_t hostid = 0; file = kobj_open_file(spl_hostid_path); @@ -511,45 +508,10 @@ struct new_utsname *__utsname(void) return 0; } -#define GET_HOSTID_CMD \ - "exec 0/proc/sys/kernel/spl/hostid " \ - " 2>/dev/null; " \ - "hostid" - -static int -hostid_exec(void) -{ - char *argv[] = { "/bin/sh", - "-c", - GET_HOSTID_CMD, - NULL }; - char *envp[] = { "HOME=/", - "TERM=linux", - "PATH=/sbin:/usr/sbin:/bin:/usr/bin", - NULL }; - int rc; - - /* Doing address resolution in the kernel is tricky and just - * not a good idea in general. So to set the proper 'hw_serial' - * use the usermodehelper support to ask '/bin/sh' to run - * '/usr/bin/hostid' and redirect the result to /proc/sys/spl/hostid - * for us to use. It's a horrific solution but it will do for now. - */ - rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC); - if (rc) - printk("SPL: Failed user helper '%s %s %s', rc = %d\n", - argv[0], argv[1], argv[2], rc); - - return rc; -} - uint32_t zone_get_hostid(void *zone) { static int first = 1; - unsigned long hostid; - int rc; /* Only the global zone is supported */ ASSERT(zone == NULL); @@ -559,21 +521,16 @@ struct new_utsname *__utsname(void) /* * Get the hostid if it was not passed as a module parameter. - * Try reading the /etc/hostid file directly, and then fall - * back to calling the /usr/bin/hostid utility. + * Try reading the /etc/hostid file directly. */ - if ((spl_hostid == HW_INVALID_HOSTID) && - (rc = hostid_read()) && (rc = hostid_exec())) - return HW_INVALID_HOSTID; + if (hostid_read()) + spl_hostid = 0; printk(KERN_NOTICE "SPL: using hostid 0x%08x\n", (unsigned int) spl_hostid); } - if (ddi_strtoul(hw_serial, NULL, HW_HOSTID_LEN-1, &hostid) != 0) - return HW_INVALID_HOSTID; - - return (uint32_t)hostid; + return spl_hostid; } EXPORT_SYMBOL(zone_get_hostid); diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index cd4fa1b..1113cf2 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -506,9 +506,6 @@ enum { if (str == end) SRETURN(-EINVAL); - (void) snprintf(hw_serial, HW_HOSTID_LEN, "%lu", spl_hostid); - hw_serial[HW_HOSTID_LEN - 1] = '\0'; - *ppos += *lenp; } else { len = snprintf(str, sizeof(str), "%lx", spl_hostid); if (*ppos >= len) @@ -1051,14 +1048,6 @@ enum { .mode = 0644, .proc_handler = &proc_dohostid, }, - { - CTL_NAME (CTL_HW_SERIAL) - .procname = "hw_serial", - .data = hw_serial, - .maxlen = sizeof(hw_serial), - .mode = 0444, - .proc_handler = &proc_dostring, - }, #ifndef HAVE_KALLSYMS_LOOKUP_NAME { CTL_NAME (CTL_KALLSYMS) -- 1.8.1.5