From 4cbde2ecbf7c6478bac106fadd6a23f53d538262 Mon Sep 17 00:00:00 2001 From: Matthew Ahrens Date: Mon, 8 Oct 2018 21:57:02 -0700 Subject: [PATCH] Create /proc/sys/kernel/spl/gitrev with git hash 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 Reviewed by: Brian Behlendorf Reviewed by: Tim Chase Signed-off-by: Matthew Ahrens Closes #7931 Closes #7965 --- Makefile.am | 9 ++++++- copy-builtin | 1 + include/.gitignore | 1 + include/spl/sys/sysmacros.h | 2 +- module/spl/spl-generic.c | 4 +-- module/spl/spl-proc.c | 6 ++--- module/zfs/spa_history.c | 5 ++-- scripts/Makefile.am | 1 + scripts/make_gitrev.sh | 54 +++++++++++++++++++++++++++++++++++++ 9 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 include/.gitignore create mode 100755 scripts/make_gitrev.sh diff --git a/Makefile.am b/Makefile.am index 50b80b945d..782b88c2f4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 diff --git a/copy-builtin b/copy-builtin index 8be8b4381b..eaffbd2d26 100755 --- a/copy-builtin +++ b/copy-builtin @@ -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 index 0000000000..e6eb2116fa --- /dev/null +++ b/include/.gitignore @@ -0,0 +1 @@ +/zfs_gitrev.h diff --git a/include/spl/sys/sysmacros.h b/include/spl/sys/sysmacros.h index e4bd80aa13..e11eaece5c 100644 --- a/include/spl/sys/sysmacros.h +++ b/include/spl/sys/sysmacros.h @@ -141,7 +141,7 @@ #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 */ diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index 7c1ad390be..a22e93e363 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -45,9 +45,9 @@ #include #include #include +#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; diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index 9c52924a48..a75bcc2145 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -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, }, diff --git a/module/zfs/spa_history.c b/module/zfs/spa_history.c index 969fdb000d..b590a1d57b 100644 --- a/module/zfs/spa_history.c +++ b/module/zfs/spa_history.c @@ -38,6 +38,7 @@ #include #include #include "zfs_comutil.h" +#include "zfs_gitrev.h" #ifdef _KERNEL #include #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); } diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 28d6185628..de0d4795d3 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -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 index 0000000000..04be09595c --- /dev/null +++ b/scripts/make_gitrev.sh @@ -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"