]> granicus.if.org Git - zfs/commitdiff
Create /proc/sys/kernel/spl/gitrev with git hash
authorMatthew Ahrens <mahrens@delphix.com>
Tue, 9 Oct 2018 04:57:02 +0000 (21:57 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 9 Oct 2018 04:57:02 +0000 (21:57 -0700)
The existing mechanisms for determining what code is running in the
kernel do not always correctly report the git hash.  The versions
reported there do not reflect changes made since `configure` was run
(i.e. incremental builds do not update the version) and they are
misleading if git tags are not set up properly.  This applies to
`modinfo zfs`, `dmesg`, and `/sys/module/zfs/version`.

There are complicated requirements on how the existing version is
generated.  Therefore we are leaving that alone, and adding a new
mechanism to record and retrieve the git hash:
`cat /proc/sys/kernel/spl/gitrev`

The gitrev is re-generated at compile time, when running `make`
(including for incremental builds).  The value is the output of `git
describe` (or "unknown" if not in a git repo or there are uncommitted
changes).

We're also removing /proc/sys/kernel/spl/version, which was never very
useful.

Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Tim Chase <tim@chase2k.com>
Signed-off-by: Matthew Ahrens <mahrens@delphix.com>
Closes #7931
Closes #7965

Makefile.am
copy-builtin
include/.gitignore [new file with mode: 0644]
include/spl/sys/sysmacros.h
module/spl/spl-generic.c
module/spl/spl-proc.c
module/zfs/spa_history.c
scripts/Makefile.am
scripts/make_gitrev.sh [new file with mode: 0755]

index 50b80b945d53656d419aaee09460c8db3690d173..782b88c2f4c4559fb09c0e7745885d26651c41e0 100644 (file)
@@ -25,6 +25,12 @@ EXTRA_DIST += META AUTHORS COPYRIGHT LICENSE NEWS NOTICE README.md
 
 @CODE_COVERAGE_RULES@
 
+.PHONY: gitrev
+gitrev:
+       -${top_srcdir}/scripts/make_gitrev.sh
+
+BUILT_SOURCES = gitrev
+
 distclean-local::
        -$(RM) -R autom4te*.cache
        -find . \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \
@@ -40,7 +46,8 @@ distclean-local::
 all-local:
        -${top_srcdir}/scripts/zfs-tests.sh -c
 
-dist-hook:
+dist-hook: gitrev
+       cp ${top_srcdir}/include/zfs_gitrev.h $(distdir)/include; \
        sed -i 's/Release:[[:print:]]*/Release:      $(RELEASE)/' \
                $(distdir)/META
 
index 8be8b4381b37579ef60d437628a8266288d06413..eaffbd2d26ec3b1f819bed58cb6c86de91385422 100755 (executable)
@@ -30,6 +30,7 @@ then
 fi
 
 make clean || true
+scripts/make_gitrev.sh
 
 rm -rf "$KERNEL_DIR/include/zfs" "$KERNEL_DIR/fs/zfs"
 cp --recursive include "$KERNEL_DIR/include/zfs"
diff --git a/include/.gitignore b/include/.gitignore
new file mode 100644 (file)
index 0000000..e6eb211
--- /dev/null
@@ -0,0 +1 @@
+/zfs_gitrev.h
index e4bd80aa13209cdfe6a7edf0144d8277771999fe..e11eaece5c9ffd13ba510f5104e1e7418c8d2375 100644 (file)
 #define        DTRACE_PROBE4(a, b, c, d, e, f, g, h, i)        ((void)0)
 
 /* Missing globals */
-extern char spl_version[32];
+extern char spl_gitrev[64];
 extern unsigned long spl_hostid;
 
 /* Missing misc functions */
index 7c1ad390be4d26aedc5c14b936ec899846897153..a22e93e3634b194daeed6917ae1c50b7061d71ea 100644 (file)
@@ -45,9 +45,9 @@
 #include <sys/random.h>
 #include <sys/strings.h>
 #include <linux/kmod.h>
+#include "zfs_gitrev.h"
 
-char spl_version[32] = "SPL v" ZFS_META_VERSION "-" ZFS_META_RELEASE;
-EXPORT_SYMBOL(spl_version);
+char spl_gitrev[64] = ZFS_META_GITREV;
 
 /* BEGIN CSTYLED */
 unsigned long spl_hostid = 0;
index 9c52924a48227165c5a2fa78979de59f23d03790..a75bcc2145bd4a4cb797080508669854c31f1f78 100644 (file)
@@ -659,9 +659,9 @@ static struct ctl_table spl_table[] = {
         * sysctl(8) prefers to go via /proc for portability.
         */
        {
-               .procname       = "version",
-               .data           = spl_version,
-               .maxlen         = sizeof (spl_version),
+               .procname       = "gitrev",
+               .data           = spl_gitrev,
+               .maxlen         = sizeof (spl_gitrev),
                .mode           = 0444,
                .proc_handler   = &proc_dostring,
        },
index 969fdb000d29e52810be387d87e1f3139e3568ba..b590a1d57bd11376aa3f1e583bc835db474ee5a0 100644 (file)
@@ -38,6 +38,7 @@
 #include <sys/sunddi.h>
 #include <sys/cred.h>
 #include "zfs_comutil.h"
+#include "zfs_gitrev.h"
 #ifdef _KERNEL
 #include <sys/zone.h>
 #endif
@@ -617,8 +618,8 @@ spa_history_log_version(spa_t *spa, const char *operation, dmu_tx_t *tx)
        utsname_t *u = utsname();
 
        spa_history_log_internal(spa, operation, tx,
-           "pool version %llu; software version %llu/%llu; uts %s %s %s %s",
-           (u_longlong_t)spa_version(spa), SPA_VERSION, ZPL_VERSION,
+           "pool version %llu; software version %s; uts %s %s %s %s",
+           (u_longlong_t)spa_version(spa), ZFS_META_GITREV,
            u->nodename, u->release, u->version, u->machine);
 }
 
index 28d6185628b4cc5bbe04610ec4905e10faf6ed08..de0d4795d38755f799d2d9eb462f643cdf838044 100644 (file)
@@ -14,6 +14,7 @@ EXTRA_DIST = \
        dkms.postbuild \
        enum-extract.pl \
        kmodtool \
+       make_gitrev.sh \
        paxcheck.sh \
        zfs2zol-patch.sed \
        cstyle.pl
diff --git a/scripts/make_gitrev.sh b/scripts/make_gitrev.sh
new file mode 100755 (executable)
index 0000000..04be095
--- /dev/null
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+#
+# CDDL HEADER START
+#
+# This file and its contents are supplied under the terms of the
+# Common Development and Distribution License ("CDDL"), version 1.0.
+# You may only use this file in accordance with the terms of version
+# 1.0 of the CDDL.
+#
+# A full copy of the text of the CDDL should have accompanied this
+# source.  A copy of the CDDL is also available via the Internet at
+# http://www.illumos.org/license/CDDL.
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2018 by Delphix. All rights reserved.
+#
+
+#
+# Generate zfs_gitrev.h.  Note that we need to do this for every
+# invocation of `make`, including for incremental builds.  Therefore we
+# can't use a zfs_gitrev.h.in file which would be processed only when
+# `configure` is run.
+#
+
+BASE_DIR=$(dirname "$0")
+
+file=${BASE_DIR}/../include/zfs_gitrev.h
+
+#
+# Set default file contents in case we bail.
+#
+rm -f "$file"
+# shellcheck disable=SC2039
+/bin/echo -e "#define\tZFS_META_GITREV \"unknown\"" >>"$file"
+
+#
+# Check if git is installed and we are in a git repo.
+#
+git rev-parse --git-dir > /dev/null 2>&1 || exit
+
+#
+# Check if there are uncommitted changes
+#
+git diff-index --quiet HEAD || exit
+
+rev=$(git describe 2>/dev/null) || exit
+
+rm -f "$file"
+# shellcheck disable=SC2039
+/bin/echo -e "#define\tZFS_META_GITREV \"${rev}\"" >>"$file"