From f0e324f25d5ada5da5f8930fc1789af6896c72b4 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 1 Oct 2014 15:02:12 -0400 Subject: [PATCH] Update utsname support Modify the code to use the utsname() kernel function rather than a global variable. This results is cleaner more portable code because utsname() is already provided by the kernel and can be easily emulated in user space via uname(2). This means that it will behave consistently in both contexts. This is also has the benefit that it allows the removal of a few _KERNEL pre-processor conditions. And it also is a pre-requisite for a proper FUSE port because we need to provide a valid utsname. Finally, it allows us to remove this functionality from the SPL and all the related compatibility code. Signed-off-by: Brian Behlendorf Issue #2757 --- include/linux/Makefile.am | 3 ++- .../linux/utsname_compat.h | 23 ++++++++----------- include/sys/zfs_context.h | 5 ++++ lib/libspl/include/sys/Makefile.am | 1 - lib/libzpool/kernel.c | 12 ++++++---- module/zfs/spa_config.c | 5 ++-- module/zfs/spa_history.c | 11 ++++----- 7 files changed, 31 insertions(+), 29 deletions(-) rename lib/libspl/include/sys/utsname.h => include/linux/utsname_compat.h (50%) diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am index c2a74912180c..fc2df090ef9d 100644 --- a/include/linux/Makefile.am +++ b/include/linux/Makefile.am @@ -4,7 +4,8 @@ KERNEL_H = \ $(top_srcdir)/include/linux/dcache_compat.h \ $(top_srcdir)/include/linux/xattr_compat.h \ $(top_srcdir)/include/linux/vfs_compat.h \ - $(top_srcdir)/include/linux/blkdev_compat.h + $(top_srcdir)/include/linux/blkdev_compat.h \ + $(top_srcdir)/include/linux/utsname_compat.h USER_H = diff --git a/lib/libspl/include/sys/utsname.h b/include/linux/utsname_compat.h similarity index 50% rename from lib/libspl/include/sys/utsname.h rename to include/linux/utsname_compat.h index e16e22dbdce7..88da45cf504e 100644 --- a/lib/libspl/include/sys/utsname.h +++ b/include/linux/utsname_compat.h @@ -2,33 +2,28 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * - * You can obtain a copy of the license at usr/src/OPENLIBSPLARIS.LICENSE + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENLIBSPLARIS.LICENSE. + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ -/* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ -#ifndef _LIBSPL_UTSNAME_H -#define _LIBSPL_UTSNAME_H +#ifndef _ZFS_UTSNAME_H +#define _ZFS_UTSNAME_H -#include_next +#include -struct utsname utsname; +typedef struct new_utsname utsname_t; -#endif /* _LIBSPL_UTSNAME_H */ +#endif /* _ZFS_UTSNAME_H */ diff --git a/include/sys/zfs_context.h b/include/sys/zfs_context.h index f26c827dc76d..ee8221d534dd 100644 --- a/include/sys/zfs_context.h +++ b/include/sys/zfs_context.h @@ -67,6 +67,7 @@ #include #include #include +#include #else /* _KERNEL */ @@ -117,6 +118,7 @@ #include #include #include +#include /* * Stack @@ -673,6 +675,9 @@ extern int ddi_strtoul(const char *str, char **nptr, int base, extern int ddi_strtoull(const char *str, char **nptr, int base, u_longlong_t *result); +typedef struct utsname utsname_t; +extern utsname_t *utsname(void); + /* ZFS Boot Related stuff. */ struct _buf { diff --git a/lib/libspl/include/sys/Makefile.am b/lib/libspl/include/sys/Makefile.am index f55abc8fae8d..d86cc6a5601a 100644 --- a/lib/libspl/include/sys/Makefile.am +++ b/lib/libspl/include/sys/Makefile.am @@ -47,7 +47,6 @@ libspl_HEADERS = \ $(top_srcdir)/lib/libspl/include/sys/types.h \ $(top_srcdir)/lib/libspl/include/sys/tzfile.h \ $(top_srcdir)/lib/libspl/include/sys/uio.h \ - $(top_srcdir)/lib/libspl/include/sys/utsname.h \ $(top_srcdir)/lib/libspl/include/sys/va_list.h \ $(top_srcdir)/lib/libspl/include/sys/varargs.h \ $(top_srcdir)/lib/libspl/include/sys/vnode.h \ diff --git a/lib/libzpool/kernel.c b/lib/libzpool/kernel.c index 5adcfa617ab8..995f61d05de2 100644 --- a/lib/libzpool/kernel.c +++ b/lib/libzpool/kernel.c @@ -47,10 +47,7 @@ int aok; uint64_t physmem; vnode_t *rootdir = (vnode_t *)0xabcd1234; char hw_serial[HW_HOSTID_LEN]; - -struct utsname utsname = { - "userland", "libzpool", "1", "1", "na" -}; +struct utsname hw_utsname; /* this only exists to have its address taken */ struct proc p0; @@ -1089,6 +1086,12 @@ ddi_strtoull(const char *str, char **nptr, int base, u_longlong_t *result) return (0); } +utsname_t * +utsname(void) +{ + return (&hw_utsname); +} + /* * ========================================================================= * kernel emulation setup & teardown @@ -1121,6 +1124,7 @@ kernel_init(int mode) VERIFY((random_fd = open("/dev/random", O_RDONLY)) != -1); VERIFY((urandom_fd = open("/dev/urandom", O_RDONLY)) != -1); + VERIFY0(uname(&hw_utsname)); thread_init(); system_taskq_init(); diff --git a/module/zfs/spa_config.c b/module/zfs/spa_config.c index c8fe79ed5278..a08456d56f60 100644 --- a/module/zfs/spa_config.c +++ b/module/zfs/spa_config.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -408,8 +407,8 @@ spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats) VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_HOSTID, hostid) == 0); } - VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_HOSTNAME, - utsname.nodename) == 0); + VERIFY0(nvlist_add_string(config, ZPOOL_CONFIG_HOSTNAME, + utsname()->nodename)); if (vd != rvd) { VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_TOP_GUID, diff --git a/module/zfs/spa_history.c b/module/zfs/spa_history.c index 5b82238b90f9..1c434197d898 100644 --- a/module/zfs/spa_history.c +++ b/module/zfs/spa_history.c @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -236,9 +235,8 @@ spa_history_log_sync(void *arg, dmu_tx_t *tx) #endif fnvlist_add_uint64(nvl, ZPOOL_HIST_TIME, gethrestime_sec()); -#ifdef _KERNEL - fnvlist_add_string(nvl, ZPOOL_HIST_HOST, utsname.nodename); -#endif + fnvlist_add_string(nvl, ZPOOL_HIST_HOST, utsname()->nodename); + if (nvlist_exists(nvl, ZPOOL_HIST_CMD)) { zfs_dbgmsg("command: %s", fnvlist_lookup_string(nvl, ZPOOL_HIST_CMD)); @@ -546,11 +544,12 @@ spa_history_log_internal_dd(dsl_dir_t *dd, const char *operation, void spa_history_log_version(spa_t *spa, const char *operation) { + utsname_t *u = utsname(); + spa_history_log_internal(spa, operation, NULL, "pool version %llu; software version %llu/%d; uts %s %s %s %s", (u_longlong_t)spa_version(spa), SPA_VERSION, ZPL_VERSION, - utsname.nodename, utsname.release, utsname.version, - utsname.machine); + u->nodename, u->release, u->version, u->machine); } #if defined(_KERNEL) && defined(HAVE_SPL)