diff --git a/pkgs/os-specific/linux/spl/git.nix b/pkgs/os-specific/linux/spl/git.nix index 93629495164..369e69cf1c5 100644 --- a/pkgs/os-specific/linux/spl/git.nix +++ b/pkgs/os-specific/linux/spl/git.nix @@ -1,14 +1,15 @@ { stdenv, fetchgit, kernel, perl, autoconf, automake, libtool, coreutils, gawk }: stdenv.mkDerivation { - name = "spl-0.6.3-${kernel.version}"; + name = "spl-0.6.4-${kernel.version}"; + src = fetchgit { url = git://github.com/zfsonlinux/spl.git; - rev = "31cb5383bff0fddc5058973e32a6f2c446d45e59"; - sha256 = "0mcivbddms8kbapbs9x6achqyvh5i6h1rd2b3jm8g5yjn0flc5gl"; + rev = "a3c1eb77721a0d511b4fe7111bb2314686570c4b"; + sha256 = "050qvaw45rxlfwm3dxlxw89p3d3hcnkls6k1s4anlzb4qz5x5ph9"; }; - patches = [ ./install_prefix.patch ./const.patch ./kernel-3.16.patch ./kernel-3.17.patch ]; + patches = [ ./const.patch ./install_prefix-git.patch ]; buildInputs = [ perl autoconf automake libtool ]; @@ -23,10 +24,10 @@ stdenv.mkDerivation { substituteInPlace ./module/splat/splat-linux.c --replace "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PATH=${coreutils}:/bin" ''; - configureFlags = '' - --with-linux=${kernel.dev}/lib/modules/${kernel.modDirVersion}/source - --with-linux-obj=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build - ''; + configureFlags = [ + "--with-linux=${kernel.dev}/lib/modules/${kernel.modDirVersion}/source" + "--with-linux-obj=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" + ]; enableParallelBuilding = true; diff --git a/pkgs/os-specific/linux/spl/install_prefix-git.patch b/pkgs/os-specific/linux/spl/install_prefix-git.patch new file mode 100644 index 00000000000..0f12f531f7a --- /dev/null +++ b/pkgs/os-specific/linux/spl/install_prefix-git.patch @@ -0,0 +1,173 @@ +diff --git a/Makefile.am b/Makefile.am +index 89af931..674420c 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -12,10 +12,10 @@ endif + if CONFIG_KERNEL + SUBDIRS += module + +-extradir = @prefix@/src/spl-$(VERSION) ++extradir = @prefix@/libexec/spl + extra_HEADERS = spl.release.in spl_config.h.in + +-kerneldir = @prefix@/src/spl-$(VERSION)/$(LINUX_VERSION) ++kerneldir = @prefix@/libexec/spl/$(LINUX_VERSION) + nodist_kernel_HEADERS = spl.release spl_config.h module/$(LINUX_SYMBOLS) + endif + +diff --git a/include/Makefile.am b/include/Makefile.am +index 3200222..4a47aaa 100644 +--- a/include/Makefile.am ++++ b/include/Makefile.am +@@ -13,6 +13,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include ++kerneldir = @prefix@/libexec/spl/include + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/fs/Makefile.am b/include/fs/Makefile.am +index e0da4b3..d6d7af0 100644 +--- a/include/fs/Makefile.am ++++ b/include/fs/Makefile.am +@@ -8,6 +8,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/fs ++kerneldir = @prefix@/libexec/spl/include/fs + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am +index 1cca44a..e0d843b 100644 +--- a/include/linux/Makefile.am ++++ b/include/linux/Makefile.am +@@ -19,6 +19,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/linux ++kerneldir = @prefix@/libexec/spl/include/linux + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/rpc/Makefile.am b/include/rpc/Makefile.am +index cfc8246..4fbd33d 100644 +--- a/include/rpc/Makefile.am ++++ b/include/rpc/Makefile.am +@@ -9,6 +9,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/rpc ++kerneldir = @prefix@/libexec/spl/include/rpc + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/sharefs/Makefile.am b/include/sharefs/Makefile.am +index 10e7093..febecdf 100644 +--- a/include/sharefs/Makefile.am ++++ b/include/sharefs/Makefile.am +@@ -8,6 +8,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/sharefs ++kerneldir = @prefix@/libexec/spl/include/sharefs + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/sys/Makefile.am b/include/sys/Makefile.am +index 2d21c57..3958cfd 100644 +--- a/include/sys/Makefile.am ++++ b/include/sys/Makefile.am +@@ -104,7 +104,7 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/sys ++kerneldir = @prefix@/libexec/spl/include/sys + kernel_HEADERS = $(KERNEL_H) + endif + +diff --git a/include/sys/fm/Makefile.am b/include/sys/fm/Makefile.am +index 2821cbe..a84ce8e 100644 +--- a/include/sys/fm/Makefile.am ++++ b/include/sys/fm/Makefile.am +@@ -9,6 +9,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/sys/fm ++kerneldir = @prefix@/libexec/spl/include/sys/fm + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/sys/fs/Makefile.am b/include/sys/fs/Makefile.am +index 581083e..0c35fb7 100644 +--- a/include/sys/fs/Makefile.am ++++ b/include/sys/fs/Makefile.am +@@ -8,6 +8,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/sys/fs ++kerneldir = @prefix@/libexec/spl/include/sys/fs + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/sys/sysevent/Makefile.am b/include/sys/sysevent/Makefile.am +index 63d9af3..de1aa18 100644 +--- a/include/sys/sysevent/Makefile.am ++++ b/include/sys/sysevent/Makefile.am +@@ -8,6 +8,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/sys/sysevent ++kerneldir = @prefix@/libexec/spl/include/sys/sysevent + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/util/Makefile.am b/include/util/Makefile.am +index b721b50..cbb9a05 100644 +--- a/include/util/Makefile.am ++++ b/include/util/Makefile.am +@@ -9,6 +9,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/util ++kerneldir = @prefix@/libexec/spl/include/util + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/include/vm/Makefile.am b/include/vm/Makefile.am +index 7faab0a..8148b3d 100644 +--- a/include/vm/Makefile.am ++++ b/include/vm/Makefile.am +@@ -10,6 +10,6 @@ USER_H = + EXTRA_DIST = $(COMMON_H) $(KERNEL_H) $(USER_H) + + if CONFIG_KERNEL +-kerneldir = @prefix@/src/spl-$(VERSION)/include/vm ++kerneldir = @prefix@/libexec/spl/include/vm + kernel_HEADERS = $(KERNEL_H) + endif +diff --git a/module/Makefile.in b/module/Makefile.in +index 41c1010..3141397 100644 +--- a/module/Makefile.in ++++ b/module/Makefile.in +@@ -21,15 +21,15 @@ clean: + modules_install: + @# Install the kernel modules + $(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` $@ \ +- INSTALL_MOD_PATH=$(DESTDIR)$(INSTALL_MOD_PATH) \ ++ INSTALL_MOD_PATH=@prefix@/$(INSTALL_MOD_PATH) \ + INSTALL_MOD_DIR=$(INSTALL_MOD_DIR) \ + KERNELRELEASE=@LINUX_VERSION@ + @# Remove extraneous build products when packaging +- kmoddir=$(DESTDIR)$(INSTALL_MOD_PATH)/lib/modules/@LINUX_VERSION@; \ ++ kmoddir=@prefix@/$(INSTALL_MOD_PATH)/lib/modules/@LINUX_VERSION@; \ + if [ -n $$kmoddir ]; then \ + find $$kmoddir -name 'modules.*' | xargs $(RM); \ + fi +- sysmap=$(DESTDIR)$(INSTALL_MOD_PATH)/boot/System.map-@LINUX_VERSION@; \ ++ sysmap=@prefix@/$(INSTALL_MOD_PATH)/boot/System.map-@LINUX_VERSION@; \ + if [ -f $$sysmap ]; then \ + depmod -ae -F $$sysmap @LINUX_VERSION@; \ + fi diff --git a/pkgs/os-specific/linux/spl/kernel-3.16.patch b/pkgs/os-specific/linux/spl/kernel-3.16.patch deleted file mode 100644 index 25641c7a384..00000000000 --- a/pkgs/os-specific/linux/spl/kernel-3.16.patch +++ /dev/null @@ -1,34 +0,0 @@ -From e3020723dc43af2bc22af0d68571a61daf9b44d0 Mon Sep 17 00:00:00 2001 -From: Turbo Fredriksson -Date: Sun, 14 Sep 2014 15:47:22 +0000 -Subject: [PATCH] Linux 3.16 compat: smp_mb__after_clear_bit() - -The smp_mb__{before,after}_clear_bit functions have been renamed -smp_mb__{before,after}_atomic. Rather than adding a compatibility -function to handle this the code has been updated to use smp_wmb(). - -This has the advantage of being a stable functionally equivalent -interface. On many architectures smp_mb__after_clear_bit() expands -to smp_wmb(). Others might be able to do something slightly more -efficient but this will be safe and correct on all of them. - -Signed-off-by: Turbo Fredriksson -Signed-off-by: Brian Behlendorf -Closes #386 ---- - module/spl/spl-kmem.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c -index 6de513e..79954eb 100644 ---- a/module/spl/spl-kmem.c -+++ b/module/spl/spl-kmem.c -@@ -2365,7 +2365,7 @@ spl_kmem_cache_reap_now(spl_kmem_cache_t *skc, int count) - - spl_slab_reclaim(skc, count, 1); - clear_bit(KMC_BIT_REAPING, &skc->skc_flags); -- smp_mb__after_clear_bit(); -+ smp_wmb(); - wake_up_bit(&skc->skc_flags, KMC_BIT_REAPING); - out: - atomic_dec(&skc->skc_ref); diff --git a/pkgs/os-specific/linux/spl/kernel-3.17.patch b/pkgs/os-specific/linux/spl/kernel-3.17.patch deleted file mode 100644 index f5ce2c8805d..00000000000 --- a/pkgs/os-specific/linux/spl/kernel-3.17.patch +++ /dev/null @@ -1,175 +0,0 @@ -From 2fc44f66ec9b83069593d87cf311069458c0d5ae Mon Sep 17 00:00:00 2001 -From: Ned Bass -Date: Fri, 8 Aug 2014 17:41:22 -0700 -Subject: [PATCH] Linux 3.17 compat: remove wait_on_bit action function - -Linux kernel 3.17 removes the action function argument from -wait_on_bit(). Add autoconf test and compatibility macro to support -the new interface. - -The former "wait_on_bit" interface required an 'action' function to -be provided which does the actual waiting. There were over 20 such -functions in the kernel, many of them identical, though most cases -can be satisfied by one of just two functions: one which uses -io_schedule() and one which just uses schedule(). This API change -was made to consolidate all of those redundant wait functions. - -References: torvalds/linux@7431620 - -Signed-off-by: Ned Bass -Signed-off-by: Brian Behlendorf -Closes #378 ---- - config/spl-build.m4 | 26 ++++++++++++++++++++++++++ - include/linux/Makefile.am | 1 + - include/linux/wait_compat.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ - include/sys/types.h | 1 + - module/spl/spl-kmem.c | 11 ++--------- - 5 files changed, 75 insertions(+), 9 deletions(-) - create mode 100644 include/linux/wait_compat.h - -diff --git a/config/spl-build.m4 b/config/spl-build.m4 -index eef5233..2514d8c 100644 ---- a/config/spl-build.m4 -+++ b/config/spl-build.m4 -@@ -94,6 +94,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ - SPL_AC_2ARGS_VFS_GETATTR - SPL_AC_USLEEP_RANGE - SPL_AC_KMEM_CACHE_ALLOCFLAGS -+ SPL_AC_WAIT_ON_BIT - ]) - - AC_DEFUN([SPL_AC_MODULE_SYMVERS], [ -@@ -2570,3 +2571,28 @@ AC_DEFUN([SPL_AC_KMEM_CACHE_ALLOCFLAGS], [ - ]) - ]) - ]) -+ -+dnl # -+dnl # 3.17 API change, -+dnl # wait_on_bit() no longer requires an action argument. The former -+dnl # "wait_on_bit" interface required an 'action' function to be provided -+dnl # which does the actual waiting. There were over 20 such functions in the -+dnl # kernel, many of them identical, though most cases can be satisfied by one -+dnl # of just two functions: one which uses io_schedule() and one which just -+dnl # uses schedule(). This API change was made to consolidate all of those -+dnl # redundant wait functions. -+dnl # -+AC_DEFUN([SPL_AC_WAIT_ON_BIT], [ -+ AC_MSG_CHECKING([whether wait_on_bit() takes an action]) -+ SPL_LINUX_TRY_COMPILE([ -+ #include -+ ],[ -+ int (*action)(void *) = NULL; -+ wait_on_bit(NULL, 0, action, 0); -+ ],[ -+ AC_MSG_RESULT(yes) -+ AC_DEFINE(HAVE_WAIT_ON_BIT_ACTION, 1, [yes]) -+ ],[ -+ AC_MSG_RESULT(no) -+ ]) -+]) -diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am -index 59f2ec5..ec7023d 100644 ---- a/include/linux/Makefile.am -+++ b/include/linux/Makefile.am -@@ -17,6 +17,7 @@ KERNEL_H = \ - $(top_srcdir)/include/linux/sysctl_compat.h \ - $(top_srcdir)/include/linux/time_compat.h \ - $(top_srcdir)/include/linux/uaccess_compat.h \ -+ $(top_srcdir)/include/linux/wait_compat.h \ - $(top_srcdir)/include/linux/zlib_compat.h - - USER_H = -diff --git a/include/linux/wait_compat.h b/include/linux/wait_compat.h -new file mode 100644 -index 0000000..66f9a9a ---- /dev/null -+++ b/include/linux/wait_compat.h -@@ -0,0 +1,45 @@ -+/*****************************************************************************\ -+ * Copyright (C) 2007-2014 Lawrence Livermore National Security, LLC. -+ * Copyright (C) 2007 The Regents of the University of California. -+ * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). -+ * Written by Brian Behlendorf . -+ * UCRL-CODE-235197 -+ * -+ * This file is part of the SPL, Solaris Porting Layer. -+ * For details, see . -+ * -+ * The SPL is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License as published by the -+ * Free Software Foundation; either version 2 of the License, or (at your -+ * option) any later version. -+ * -+ * The SPL is distributed in the hope that it will be useful, but WITHOUT -+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ * for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with the SPL. If not, see . -+\*****************************************************************************/ -+ -+#ifndef _SPL_WAIT_COMPAT_H -+#define _SPL_WAIT_COMPAT_H -+ -+ -+#ifndef HAVE_WAIT_ON_BIT_ACTION -+# define spl_wait_on_bit(word, bit, mode) wait_on_bit(word, bit, mode) -+#else -+ -+static inline int -+spl_bit_wait(void *word) -+{ -+ schedule(); -+ return 0; -+} -+ -+#define spl_wait_on_bit(word, bit, mode) \ -+ wait_on_bit(word, bit, spl_bit_wait, mode) -+ -+#endif /* HAVE_WAIT_ON_BIT_ACTION */ -+ -+#endif /* SPL_WAIT_COMPAT_H */ -diff --git a/include/sys/types.h b/include/sys/types.h -index decb6bb..fcec0fa 100644 ---- a/include/sys/types.h -+++ b/include/sys/types.h -@@ -43,6 +43,7 @@ - #include - #include - #include -+#include - - #ifndef HAVE_UINTPTR_T - typedef unsigned long uintptr_t; -diff --git a/module/spl/spl-kmem.c b/module/spl/spl-kmem.c -index 0a9d775..6de513e 100644 ---- a/module/spl/spl-kmem.c -+++ b/module/spl/spl-kmem.c -@@ -1900,13 +1900,6 @@ spl_cache_grow_wait(spl_kmem_cache_t *skc) - return !test_bit(KMC_BIT_GROWING, &skc->skc_flags); - } - --static int --spl_cache_reclaim_wait(void *word) --{ -- schedule(); -- return 0; --} -- - /* - * No available objects on any slabs, create a new slab. Note that this - * functionality is disabled for KMC_SLAB caches which are backed by the -@@ -1928,8 +1921,8 @@ spl_cache_grow(spl_kmem_cache_t *skc, int flags, void **obj) - * then return so the local magazine can be rechecked for new objects. - */ - if (test_bit(KMC_BIT_REAPING, &skc->skc_flags)) { -- rc = wait_on_bit(&skc->skc_flags, KMC_BIT_REAPING, -- spl_cache_reclaim_wait, TASK_UNINTERRUPTIBLE); -+ rc = spl_wait_on_bit(&skc->skc_flags, KMC_BIT_REAPING, -+ TASK_UNINTERRUPTIBLE); - SRETURN(rc ? rc : -EAGAIN); - } -