summary refs log tree commit diff
path: root/pkgs/os-specific
diff options
context:
space:
mode:
authorRicardo M. Correia <rcorreia@wizy.org>2014-10-07 16:21:55 +0200
committerRicardo M. Correia <rcorreia@wizy.org>2014-10-07 16:52:14 +0200
commitebfb50603694851c0044a02372d812603b0f6500 (patch)
tree77debbdd6aa13a07c6d94dc7f6f54838bdbd5c5b /pkgs/os-specific
parentff371b96dff876166bd46eb14161621a1637a98e (diff)
downloadnixlib-ebfb50603694851c0044a02372d812603b0f6500.tar
nixlib-ebfb50603694851c0044a02372d812603b0f6500.tar.gz
nixlib-ebfb50603694851c0044a02372d812603b0f6500.tar.bz2
nixlib-ebfb50603694851c0044a02372d812603b0f6500.tar.lz
nixlib-ebfb50603694851c0044a02372d812603b0f6500.tar.xz
nixlib-ebfb50603694851c0044a02372d812603b0f6500.tar.zst
nixlib-ebfb50603694851c0044a02372d812603b0f6500.zip
spl: Backport compatibility patches for newer kernels
Diffstat (limited to 'pkgs/os-specific')
-rw-r--r--pkgs/os-specific/linux/spl/default.nix2
-rw-r--r--pkgs/os-specific/linux/spl/git.nix2
-rw-r--r--pkgs/os-specific/linux/spl/kernel-3.16.patch34
-rw-r--r--pkgs/os-specific/linux/spl/kernel-3.17.patch175
4 files changed, 211 insertions, 2 deletions
diff --git a/pkgs/os-specific/linux/spl/default.nix b/pkgs/os-specific/linux/spl/default.nix
index 944fb6ff554c..7f1dad248e6f 100644
--- a/pkgs/os-specific/linux/spl/default.nix
+++ b/pkgs/os-specific/linux/spl/default.nix
@@ -7,7 +7,7 @@ stdenv.mkDerivation {
     sha256 = "1qqzyj2if5wai4jiwml4i8s6v8k7hbi7jmiph800lhkk5j8s72l9";
   };
 
-  patches = [ ./install_prefix.patch ./const.patch ];
+  patches = [ ./install_prefix.patch ./const.patch ./kernel-3.16.patch ./kernel-3.17.patch ];
 
   buildInputs = [ perl autoconf automake libtool ];
 
diff --git a/pkgs/os-specific/linux/spl/git.nix b/pkgs/os-specific/linux/spl/git.nix
index d3ed285ccfef..93629495164b 100644
--- a/pkgs/os-specific/linux/spl/git.nix
+++ b/pkgs/os-specific/linux/spl/git.nix
@@ -8,7 +8,7 @@ stdenv.mkDerivation {
     sha256 = "0mcivbddms8kbapbs9x6achqyvh5i6h1rd2b3jm8g5yjn0flc5gl";
   };
 
-  patches = [ ./install_prefix.patch ./const.patch ];
+  patches = [ ./install_prefix.patch ./const.patch ./kernel-3.16.patch ./kernel-3.17.patch ];
 
   buildInputs = [ perl autoconf automake libtool ];
 
diff --git a/pkgs/os-specific/linux/spl/kernel-3.16.patch b/pkgs/os-specific/linux/spl/kernel-3.16.patch
new file mode 100644
index 000000000000..25641c7a384f
--- /dev/null
+++ b/pkgs/os-specific/linux/spl/kernel-3.16.patch
@@ -0,0 +1,34 @@
+From e3020723dc43af2bc22af0d68571a61daf9b44d0 Mon Sep 17 00:00:00 2001
+From: Turbo Fredriksson <turbo@bayour.com>
+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 <turbo@bayour.com>
+Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
+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
new file mode 100644
index 000000000000..f5ce2c8805d8
--- /dev/null
+++ b/pkgs/os-specific/linux/spl/kernel-3.17.patch
@@ -0,0 +1,175 @@
+From 2fc44f66ec9b83069593d87cf311069458c0d5ae Mon Sep 17 00:00:00 2001
+From: Ned Bass <bass6@llnl.gov>
+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 <bass6@llnl.gov>
+Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
+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 <linux/wait.h>
++	],[
++		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 <behlendorf1@llnl.gov>.
++ *  UCRL-CODE-235197
++ *
++ *  This file is part of the SPL, Solaris Porting Layer.
++ *  For details, see <http://zfsonlinux.org/>.
++ *
++ *  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 <http://www.gnu.org/licenses/>.
++\*****************************************************************************/
++
++#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 <linux/zlib_compat.h>
+ #include <linux/mm_compat.h>
+ #include <linux/delay.h>
++#include <linux/wait_compat.h>
+ 
+ #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);
+ 	}
+