Skip to content

Commit

Permalink
Create /proc/sys/kernel/spl/gitrev with git hash
Browse files Browse the repository at this point in the history
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
ahrens authored and behlendorf committed Oct 9, 2018
1 parent dfbe267 commit 4cbde2e
Showing 9 changed files with 74 additions and 9 deletions.
9 changes: 8 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
@@ -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

1 change: 1 addition & 0 deletions copy-builtin
Original file line number Diff line number Diff line change
@@ -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"
1 change: 1 addition & 0 deletions include/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/zfs_gitrev.h
2 changes: 1 addition & 1 deletion include/spl/sys/sysmacros.h
Original file line number Diff line number Diff line change
@@ -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 */
4 changes: 2 additions & 2 deletions module/spl/spl-generic.c
Original file line number Diff line number Diff line change
@@ -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;
6 changes: 3 additions & 3 deletions module/spl/spl-proc.c
Original file line number Diff line number Diff line change
@@ -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,
},
5 changes: 3 additions & 2 deletions module/zfs/spa_history.c
Original file line number Diff line number Diff line change
@@ -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);
}

1 change: 1 addition & 0 deletions scripts/Makefile.am
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@ EXTRA_DIST = \
dkms.postbuild \
enum-extract.pl \
kmodtool \
make_gitrev.sh \
paxcheck.sh \
zfs2zol-patch.sed \
cstyle.pl
54 changes: 54 additions & 0 deletions scripts/make_gitrev.sh
Original file line number Diff line number Diff line change
@@ -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"

0 comments on commit 4cbde2e

Please sign in to comment.