Skip to content
This repository has been archived by the owner on Feb 26, 2020. It is now read-only.

Commit

Permalink
Simplify hostid logic
Browse files Browse the repository at this point in the history
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 <ryao@cs.stonybrook.edu>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #224
  • Loading branch information
ryao authored and behlendorf committed Apr 14, 2014
1 parent 3ceb71e commit acf0ade
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 64 deletions.
1 change: 0 additions & 1 deletion include/sys/sysmacros.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,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);
Expand Down
1 change: 0 additions & 1 deletion include/sys/systeminfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
#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 */
Expand Down
55 changes: 6 additions & 49 deletions module/spl/spl-generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -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] = "<none>";
EXPORT_SYMBOL(hw_serial);

proc_t p0 = { 0 };
EXPORT_SYMBOL(p0);

Expand Down Expand Up @@ -467,7 +464,7 @@ hostid_read(void)
int result;
uint64_t size;
struct _buf *file;
unsigned long hostid = 0;
uint32_t hostid = 0;

file = kobj_open_file(spl_hostid_path);

Expand Down Expand Up @@ -511,45 +508,10 @@ hostid_read(void)
return 0;
}

#define GET_HOSTID_CMD \
"exec 0</dev/null " \
" 1>/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);
Expand All @@ -559,21 +521,16 @@ zone_get_hostid(void *zone)

/*
* 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);

Expand Down
13 changes: 0 additions & 13 deletions module/spl/spl-proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ struct proc_dir_entry *proc_spl_kstat = NULL;

#define CTL_VERSION CTL_UNNUMBERED /* Version */
#define CTL_HOSTID CTL_UNNUMBERED /* Host id by /usr/bin/hostid */
#define CTL_HW_SERIAL CTL_UNNUMBERED /* HW serial number by hostid */
#define CTL_KALLSYMS CTL_UNNUMBERED /* kallsyms_lookup_name addr */

#define CTL_DEBUG_SUBSYS CTL_UNNUMBERED /* Debug subsystem */
Expand Down Expand Up @@ -129,7 +128,6 @@ enum {
enum {
CTL_VERSION = 1, /* Version */
CTL_HOSTID, /* Host id reported by /usr/bin/hostid */
CTL_HW_SERIAL, /* Hardware serial number from hostid */
CTL_KALLSYMS, /* Address of kallsyms_lookup_name */

#ifdef DEBUG_LOG
Expand Down Expand Up @@ -513,9 +511,6 @@ SPL_PROC_HANDLER(proc_dohostid)
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)
Expand Down Expand Up @@ -1058,14 +1053,6 @@ static struct ctl_table spl_table[] = {
.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)
Expand Down

0 comments on commit acf0ade

Please sign in to comment.