From 53698a453d1cc318f99477fef596c476b4b0cb47 Mon Sep 17 00:00:00 2001 From: Chunwei Chen Date: Fri, 23 Jan 2015 16:05:04 +0800 Subject: [PATCH] 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 Signed-off-by: Brian Behlendorf Closes #3034 --- cmd/zpool/zpool_main.c | 2 +- include/libzfs.h | 1 + lib/libzfs/libzfs_status.c | 2 +- lib/libzpool/kernel.c | 26 +++++++++++++++++++++++++- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index db5805bcf66a..0f2bab6e925c 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 df38d29e1863..108b75f5eb3c 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 534ff853a5bc..f69bd4544f36 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 db50352c5191..325cb3ceaa79 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);