Skip to content

Commit

Permalink
Read spl_hostid module parameter before gethostid()
Browse files Browse the repository at this point in the history
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 openzfs#3034
  • Loading branch information
tuxoko authored and behlendorf committed Feb 5, 2015
1 parent aa2ef41 commit 53698a4
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 3 deletions.
2 changes: 1 addition & 1 deletion cmd/zpool/zpool_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions include/libzfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 **,
Expand Down
2 changes: 1 addition & 1 deletion lib/libzfs/libzfs_status.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
26 changes: 25 additions & 1 deletion lib/libzpool/kernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);
Expand Down

0 comments on commit 53698a4

Please sign in to comment.