aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunwei Chen <[email protected]>2015-01-23 16:05:04 +0800
committerBrian Behlendorf <[email protected]>2015-02-04 16:44:53 -0800
commit53698a453d1cc318f99477fef596c476b4b0cb47 (patch)
treedf07069d67116be61722e8c8713e500a61c43fd2
parentaa2ef419e46b3ad7c2ad8848b7a308a5a949aba7 (diff)
Read spl_hostid module parameter before gethostid()
If spl_hostid is set via module parameter, it's likely different from gethostid(). Therefore, the userspace tool should read it first before falling back to gethostid(). Signed-off-by: Chunwei Chen <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #3034
-rw-r--r--cmd/zpool/zpool_main.c2
-rw-r--r--include/libzfs.h1
-rw-r--r--lib/libzfs/libzfs_status.c2
-rw-r--r--lib/libzpool/kernel.c26
4 files changed, 28 insertions, 3 deletions
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
index db5805bcf..0f2bab6e9 100644
--- a/cmd/zpool/zpool_main.c
+++ b/cmd/zpool/zpool_main.c
@@ -1917,7 +1917,7 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
} else if (state != POOL_STATE_EXPORTED &&
!(flags & ZFS_IMPORT_ANY_HOST)) {
uint64_t hostid = 0;
- unsigned long system_hostid = gethostid() & 0xffffffff;
+ unsigned long system_hostid = get_system_hostid();
(void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_HOSTID,
&hostid);
diff --git a/include/libzfs.h b/include/libzfs.h
index df38d29e1..108b75f5e 100644
--- a/include/libzfs.h
+++ b/include/libzfs.h
@@ -350,6 +350,7 @@ typedef enum {
ZPOOL_STATUS_OK
} zpool_status_t;
+extern unsigned long get_system_hostid(void);
extern zpool_status_t zpool_get_status(zpool_handle_t *, char **,
zpool_errata_t *);
extern zpool_status_t zpool_import_status(nvlist_t *, char **,
diff --git a/lib/libzfs/libzfs_status.c b/lib/libzfs/libzfs_status.c
index 534ff853a..f69bd4544 100644
--- a/lib/libzfs/libzfs_status.c
+++ b/lib/libzfs/libzfs_status.c
@@ -195,7 +195,7 @@ check_status(nvlist_t *config, boolean_t isimport, zpool_errata_t *erratap)
uint64_t suspended;
uint64_t hostid = 0;
uint64_t errata = 0;
- unsigned long system_hostid = gethostid() & 0xffffffff;
+ unsigned long system_hostid = get_system_hostid();
verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION,
&version) == 0);
diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c
index db50352c5..325cb3cea 100644
--- a/lib/libzpool/kernel.c
+++ b/lib/libzpool/kernel.c
@@ -1107,6 +1107,30 @@ umem_out_of_memory(void)
return (0);
}
+static unsigned long
+get_spl_hostid(void)
+{
+ FILE *f;
+ unsigned long hostid;
+
+ f = fopen("/sys/module/spl/parameters/spl_hostid", "r");
+ if (!f)
+ return (0);
+ if (fscanf(f, "%lu", &hostid) != 1)
+ hostid = 0;
+ fclose(f);
+ return (hostid & 0xffffffff);
+}
+
+unsigned long
+get_system_hostid(void)
+{
+ unsigned long system_hostid = get_spl_hostid();
+ if (system_hostid == 0)
+ system_hostid = gethostid() & 0xffffffff;
+ return (system_hostid);
+}
+
void
kernel_init(int mode)
{
@@ -1120,7 +1144,7 @@ kernel_init(int mode)
(double)physmem * sysconf(_SC_PAGE_SIZE) / (1ULL << 30));
(void) snprintf(hw_serial, sizeof (hw_serial), "%ld",
- (mode & FWRITE) ? gethostid() : 0);
+ (mode & FWRITE) ? get_system_hostid() : 0);
VERIFY((random_fd = open("/dev/random", O_RDONLY)) != -1);
VERIFY((urandom_fd = open("/dev/urandom", O_RDONLY)) != -1);