diff options
Diffstat (limited to 'module')
-rw-r--r-- | module/spl/spl-generic.c | 20 | ||||
-rw-r--r-- | module/spl/spl-proc.c | 9 |
2 files changed, 17 insertions, 12 deletions
diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index 2b43f0c33..680655d0f 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -52,8 +52,10 @@ char spl_version[16] = "SPL v" SPL_META_VERSION; EXPORT_SYMBOL(spl_version); -long spl_hostid = 0; +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); @@ -362,13 +364,18 @@ struct new_utsname *__utsname(void) } EXPORT_SYMBOL(__utsname); +#define GET_HOSTID_CMD \ + "exec 0</dev/null " \ + " 1>/proc/sys/kernel/spl/hostid " \ + " 2>/dev/null; " \ + "hostid" + static int set_hostid(void) { - char sh_path[] = "/bin/sh"; - char *argv[] = { sh_path, + char *argv[] = { "/bin/sh", "-c", - "/usr/bin/hostid >/proc/sys/kernel/spl/hostid", + GET_HOSTID_CMD, NULL }; char *envp[] = { "HOME=/", "TERM=linux", @@ -382,7 +389,7 @@ set_hostid(void) * '/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(sh_path, argv, envp, 1); + rc = call_usermodehelper(argv[0], argv, envp, 1); if (rc) printk("SPL: Failed user helper '%s %s %s', rc = %d\n", argv[0], argv[1], argv[2], rc); @@ -475,7 +482,8 @@ __init spl_init(void) if ((rc = zlib_init())) SGOTO(out9, rc); - if ((rc = set_hostid())) + /* Get the hostid if it was not passed as a module parameter. */ + if (spl_hostid == 0 && (rc = set_hostid())) SGOTO(out10, rc = -EADDRNOTAVAIL); #ifndef HAVE_KALLSYMS_LOOKUP_NAME diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index d2b295ce0..fa0d1fb3d 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -487,7 +487,6 @@ SPL_PROC_HANDLER(proc_doslab) SPL_PROC_HANDLER(proc_dohostid) { int len, rc = 0; - int32_t val; char *end, str[32]; SENTRY; @@ -499,17 +498,15 @@ SPL_PROC_HANDLER(proc_dohostid) if (rc < 0) SRETURN(rc); - val = simple_strtol(str, &end, 16); + spl_hostid = simple_strtoul(str, &end, 16); if (str == end) SRETURN(-EINVAL); - spl_hostid = (long) val; - (void) snprintf(hw_serial, HW_HOSTID_LEN, "%u", - (val >= 0) ? val : -val); + (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); + len = snprintf(str, sizeof(str), "%lux", spl_hostid); if (*ppos >= len) rc = 0; else |