]> git.proxmox.com Git - mirror_spl-debian.git/commitdiff
Import spl_hostid as a module parameter.
authorDarik Horn <dajhorn@vanadac.com>
Mon, 11 Apr 2011 19:49:50 +0000 (14:49 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 21 Apr 2011 16:41:01 +0000 (09:41 -0700)
Provide a call_usermodehelper() alternative by letting the hostid be passed as
a module parameter like this:

  $ modprobe spl spl_hostid=0x12345678

Internally change the spl_hostid variable to unsigned long because that is the
type that the coreutils /usr/bin/hostid returns.

Move the hostid command into GET_HOSTID_CMD for consistency with the similar
GET_KALLSYMS_ADDR_CMD invocation.

Use argv[0] instead of sh_path for consistency internally and with other Linux
drivers.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
include/sys/sysmacros.h
module/spl/spl-generic.c
module/spl/spl-proc.c

index 35f7cb5c1edb4e2fa9a4614f86852e6adf9b3a09..29dcda7fa701cc4b21aa27a134f6cc0a12b4ac7e 100644 (file)
 
 /* Missing globals */
 extern char spl_version[16];
-extern long spl_hostid;
+extern unsigned long spl_hostid;
 extern char hw_serial[11];
 
 /* Missing misc functions */
index 2b43f0c3373c378b003e030c468af2be9c83e45a..680655d0f89a4172bcd71bf5ec511f7cb4b945bc 100644 (file)
 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
index d2b295ce0aff46a4f37b110a4da5eb3ffdb49e76..fa0d1fb3d3d87d667ace8ed7b0b943a5f1cd91e4 100644 (file)
@@ -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