aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/spl-build.m426
-rw-r--r--include/linux/Makefile.am1
-rw-r--r--include/linux/wait_compat.h45
-rw-r--r--include/sys/types.h1
-rw-r--r--module/spl/spl-kmem.c11
5 files changed, 75 insertions, 9 deletions
diff --git a/config/spl-build.m4 b/config/spl-build.m4
index eef52334f..2514d8c5b 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 59f2ec5ab..ec7023d15 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 000000000..66f9a9a61
--- /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 <[email protected]>.
+ * 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 decb6bba8..fcec0fa31 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 0a9d77534..6de513e45 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);
}