Meta: 1
Name: spl
Branch: 1.0
-Version: 0.6.5.7
+Version: 0.6.5.8
Release: 1
Release-Tags: relext
License: GPL
SPL_AC_ATOMIC_SPINLOCK
SPL_AC_SHRINKER_CALLBACK
SPL_AC_CTL_NAME
+ SPL_AC_CONFIG_TRIM_UNUSED_KSYMS
SPL_AC_PDE_DATA
SPL_AC_SET_FS_PWD_WITH_CONST
SPL_AC_2ARGS_VFS_UNLINK
SPL_AC_2ARGS_ZLIB_DEFLATE_WORKSPACESIZE
SPL_AC_SHRINK_CONTROL_STRUCT
SPL_AC_RWSEM_SPINLOCK_IS_RAW
+ SPL_AC_RWSEM_ACTIVITY
+ SPL_AC_RWSEM_ATOMIC_LONG_COUNT
SPL_AC_SCHED_RT_HEADER
SPL_AC_2ARGS_VFS_GETATTR
SPL_AC_USLEEP_RANGE
SPL_AC_KMEM_CACHE_ALLOCFLAGS
SPL_AC_WAIT_ON_BIT
+ SPL_AC_INODE_LOCK
+ SPL_AC_MUTEX_OWNER
])
AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
])
])
+dnl #
+dnl # config trim unused symbols,
+dnl # Verify the kernel has CONFIG_TRIM_UNUSED_KSYMS DISABLED.
+dnl #
+AC_DEFUN([SPL_AC_CONFIG_TRIM_UNUSED_KSYMS], [
+ AC_MSG_CHECKING([whether CONFIG_TRIM_UNUSED_KSYM is disabled])
+ SPL_LINUX_TRY_COMPILE([
+ #if defined(CONFIG_TRIM_UNUSED_KSYMS)
+ #error CONFIG_TRIM_UNUSED_KSYMS not defined
+ #endif
+ ],[ ],[
+ AC_MSG_RESULT([yes])
+ ],[
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([
+ *** This kernel has unused symbols trimming enabled, please disable.
+ *** Rebuild the kernel with CONFIG_TRIM_UNUSED_KSYMS=n set.])
+ ])
+])
+
dnl #
dnl # 2.6.39 API compat,
dnl # The function zlib_deflate_workspacesize() now take 2 arguments.
EXTRA_KCFLAGS="$tmp_flags"
])
+dnl #
+dnl # 3.16 API Change
+dnl #
+dnl # rwsem-spinlock "->activity" changed to "->count"
+dnl #
+AC_DEFUN([SPL_AC_RWSEM_ACTIVITY], [
+ AC_MSG_CHECKING([whether struct rw_semaphore has member activity])
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+ SPL_LINUX_TRY_COMPILE([
+ #include <linux/rwsem.h>
+ ],[
+ struct rw_semaphore dummy_semaphore __attribute__ ((unused));
+ dummy_semaphore.activity = 0;
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_RWSEM_ACTIVITY, 1,
+ [struct rw_semaphore has member activity])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+ EXTRA_KCFLAGS="$tmp_flags"
+])
+
+dnl #
+dnl # 4.8 API Change
+dnl #
+dnl # rwsem "->count" changed to atomic_long_t type
+dnl #
+AC_DEFUN([SPL_AC_RWSEM_ATOMIC_LONG_COUNT], [
+ AC_MSG_CHECKING(
+ [whether struct rw_semaphore has atomic_long_t member count])
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+ SPL_LINUX_TRY_COMPILE([
+ #include <linux/rwsem.h>
+ ],[
+ DECLARE_RWSEM(dummy_semaphore);
+ (void) atomic_long_read(&dummy_semaphore.count);
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_RWSEM_ATOMIC_LONG_COUNT, 1,
+ [struct rw_semaphore has atomic_long_t member count])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+ EXTRA_KCFLAGS="$tmp_flags"
+])
+
dnl #
dnl # 3.9 API change,
dnl # Moved things from linux/sched.h to linux/sched/rt.h
AC_MSG_RESULT(no)
])
])
+
+dnl #
+dnl # 4.7 API change
+dnl # i_mutex is changed to i_rwsem. Instead of directly using
+dnl # i_mutex/i_rwsem, we should use inode_lock() and inode_lock_shared()
+dnl # We test inode_lock_shared because inode_lock is introduced earlier.
+dnl #
+AC_DEFUN([SPL_AC_INODE_LOCK], [
+ AC_MSG_CHECKING([whether inode_lock_shared() exists])
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+ SPL_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ ],[
+ struct inode *inode = NULL;
+ inode_lock_shared(inode);
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_INODE_LOCK_SHARED, 1, [yes])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+ EXTRA_KCFLAGS="$tmp_flags"
+])
+
+dnl #
+dnl # Check whether mutex has owner with task_struct type.
+dnl #
+dnl # Note that before Linux 3.0, mutex owner is of type thread_info.
+dnl #
+dnl # Note that in Linux 3.18, the condition for owner is changed from
+dnl # defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_SMP) to
+dnl # defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_MUTEX_SPIN_ON_OWNER)
+dnl #
+AC_DEFUN([SPL_AC_MUTEX_OWNER], [
+ AC_MSG_CHECKING([whether mutex has owner])
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+ SPL_LINUX_TRY_COMPILE([
+ #include <linux/mutex.h>
+ #include <linux/spinlock.h>
+ ],[
+ DEFINE_MUTEX(m);
+ struct task_struct *t __attribute__ ((unused));
+ t = m.owner;
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_MUTEX_OWNER, 1, [yes])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+ EXTRA_KCFLAGS="$tmp_flags"
+])
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for spl 0.6.5.7.
+# Generated by GNU Autoconf 2.68 for spl 0.6.5.8.
#
#
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
# Identity of this package.
PACKAGE_NAME='spl'
PACKAGE_TARNAME='spl'
-PACKAGE_VERSION='0.6.5.7'
-PACKAGE_STRING='spl 0.6.5.7'
+PACKAGE_VERSION='0.6.5.8'
+PACKAGE_STRING='spl 0.6.5.8'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures spl 0.6.5.7 to adapt to many kinds of systems.
+\`configure' configures spl 0.6.5.8 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of spl 0.6.5.7:";;
+ short | recursive ) echo "Configuration of spl 0.6.5.8:";;
esac
cat <<\_ACEOF
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-spl configure 0.6.5.7
+spl configure 0.6.5.8
generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by spl $as_me 0.6.5.7, which was
+It was created by spl $as_me 0.6.5.8, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
# Define the identity of the package.
PACKAGE='spl'
- VERSION='0.6.5.7'
+ VERSION='0.6.5.8'
cat >>confdefs.h <<_ACEOF
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CONFIG_TRIM_UNUSED_KSYM is disabled" >&5
+$as_echo_n "checking whether CONFIG_TRIM_UNUSED_KSYM is disabled... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #if defined(CONFIG_TRIM_UNUSED_KSYMS)
+ #error CONFIG_TRIM_UNUSED_KSYMS not defined
+ #endif
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ as_fn_error $? "
+ *** This kernel has unused symbols trimming enabled, please disable.
+ *** Rebuild the kernel with CONFIG_TRIM_UNUSED_KSYMS=n set." "$LINENO" 5
+
+
+
+fi
+ rm -Rf build
+
+
+
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether PDE_DATA() is available" >&5
$as_echo_n "checking whether PDE_DATA() is available... " >&6; }
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct rw_semaphore has member activity" >&5
+$as_echo_n "checking whether struct rw_semaphore has member activity... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/rwsem.h>
+
+int
+main (void)
+{
+
+ struct rw_semaphore dummy_semaphore __attribute__ ((unused));
+ dummy_semaphore.activity = 0;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_RWSEM_ACTIVITY 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct rw_semaphore has atomic_long_t member count" >&5
+$as_echo_n "checking whether struct rw_semaphore has atomic_long_t member count... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/rwsem.h>
+
+int
+main (void)
+{
+
+ DECLARE_RWSEM(dummy_semaphore);
+ (void) atomic_long_read(&dummy_semaphore.count);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_RWSEM_ATOMIC_LONG_COUNT 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
fi
rm -Rf build
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether inode_lock_shared() exists" >&5
+$as_echo_n "checking whether inode_lock_shared() exists... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/fs.h>
+
+int
+main (void)
+{
+
+ struct inode *inode = NULL;
+ inode_lock_shared(inode);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_INODE_LOCK_SHARED 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mutex has owner" >&5
+$as_echo_n "checking whether mutex has owner... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/mutex.h>
+ #include <linux/spinlock.h>
+
+int
+main (void)
+{
+
+ DEFINE_MUTEX(m);
+ struct task_struct *t __attribute__ ((unused));
+ t = m.owner;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_MUTEX_OWNER 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
;;
user) ;;
all)
-fi
- rm -Rf build
+fi
+ rm -Rf build
+
+
+
+
+
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct ctl_table has ctl_name" >&5
+$as_echo_n "checking whether struct ctl_table has ctl_name... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/sysctl.h>
+
+int
+main (void)
+{
+
+ struct ctl_table ctl __attribute__ ((unused));
+ ctl.ctl_name = 0;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_CTL_NAME 1" >>confdefs.h
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
rm -Rf build
- EXTRA_KCFLAGS="$tmp_flags"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct ctl_table has ctl_name" >&5
-$as_echo_n "checking whether struct ctl_table has ctl_name... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CONFIG_TRIM_UNUSED_KSYM is disabled" >&5
+$as_echo_n "checking whether CONFIG_TRIM_UNUSED_KSYM is disabled... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.c
- #include <linux/sysctl.h>
+ #if defined(CONFIG_TRIM_UNUSED_KSYMS)
+ #error CONFIG_TRIM_UNUSED_KSYMS not defined
+ #endif
int
main (void)
{
- struct ctl_table ctl __attribute__ ((unused));
- ctl.ctl_name = 0;
-
;
return 0;
}
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
-$as_echo "#define HAVE_CTL_NAME 1" >>confdefs.h
-
-
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
+ as_fn_error $? "
+ *** This kernel has unused symbols trimming enabled, please disable.
+ *** Rebuild the kernel with CONFIG_TRIM_UNUSED_KSYMS=n set." "$LINENO" 5
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct rw_semaphore has member activity" >&5
+$as_echo_n "checking whether struct rw_semaphore has member activity... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/rwsem.h>
+
+int
+main (void)
+{
+
+ struct rw_semaphore dummy_semaphore __attribute__ ((unused));
+ dummy_semaphore.activity = 0;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_RWSEM_ACTIVITY 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct rw_semaphore has atomic_long_t member count" >&5
+$as_echo_n "checking whether struct rw_semaphore has atomic_long_t member count... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/rwsem.h>
+
+int
+main (void)
+{
+
+ DECLARE_RWSEM(dummy_semaphore);
+ (void) atomic_long_read(&dummy_semaphore.count);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_RWSEM_ATOMIC_LONG_COUNT 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
fi
rm -Rf build
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether inode_lock_shared() exists" >&5
+$as_echo_n "checking whether inode_lock_shared() exists... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/fs.h>
+
+int
+main (void)
+{
+
+ struct inode *inode = NULL;
+ inode_lock_shared(inode);
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_INODE_LOCK_SHARED 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mutex has owner" >&5
+$as_echo_n "checking whether mutex has owner... " >&6; }
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Werror"
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+ #include <linux/mutex.h>
+ #include <linux/spinlock.h>
+
+int
+main (void)
+{
+
+ DEFINE_MUTEX(m);
+ struct task_struct *t __attribute__ ((unused));
+ t = m.owner;
+
+ ;
+ return 0;
+}
+
+_ACEOF
+
+
+ rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+ echo "obj-m := conftest.o" >build/Makefile
+ modpost_flag=''
+ test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+ if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then :
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_MUTEX_OWNER 1" >>confdefs.h
+
+
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+ rm -Rf build
+
+
+ EXTRA_KCFLAGS="$tmp_flags"
+
+
;;
srpm) ;;
*)
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by spl $as_me 0.6.5.7, which was
+This file was extended by spl $as_me 0.6.5.8, which was
generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-spl config.status 0.6.5.7
+spl config.status 0.6.5.8
configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
#define spl_filp_fsync(fp, sync) vfs_fsync(fp, (fp)->f_dentry, sync)
#endif /* HAVE_2ARGS_VFS_FSYNC */
+#ifdef HAVE_INODE_LOCK_SHARED
+#define spl_inode_lock(ip) inode_lock(ip)
+#define spl_inode_unlock(ip) inode_unlock(ip)
+#define spl_inode_lock_shared(ip) inode_lock_shared(ip)
+#define spl_inode_unlock_shared(ip) inode_unlock_shared(ip)
+#define spl_inode_trylock(ip) inode_trylock(ip)
+#define spl_inode_trylock_shared(ip) inode_trylock_shared(ip)
+#define spl_inode_is_locked(ip) inode_is_locked(ip)
+#define spl_inode_lock_nested(ip, s) inode_lock_nested(ip, s)
+#else
#define spl_inode_lock(ip) mutex_lock(&(ip)->i_mutex)
#define spl_inode_unlock(ip) mutex_unlock(&(ip)->i_mutex)
+#define spl_inode_lock_shared(ip) mutex_lock(&(ip)->i_mutex)
+#define spl_inode_unlock_shared(ip) mutex_unlock(&(ip)->i_mutex)
+#define spl_inode_trylock(ip) mutex_trylock(&(ip)->i_mutex)
+#define spl_inode_trylock_shared(ip) mutex_trylock(&(ip)->i_mutex)
+#define spl_inode_is_locked(ip) mutex_is_locked(&(ip)->i_mutex)
+#define spl_inode_lock_nested(ip, s) mutex_lock_nested(&(ip)->i_mutex, s)
+#endif
#endif /* SPL_FILE_COMPAT_H */
#include <linux/rwsem.h>
+#ifdef CONFIG_RWSEM_GENERIC_SPINLOCK
+#define SPL_RWSEM_SINGLE_READER_VALUE (1)
+#define SPL_RWSEM_SINGLE_WRITER_VALUE (-1)
+#else
+#define SPL_RWSEM_SINGLE_READER_VALUE (RWSEM_ACTIVE_READ_BIAS)
+#define SPL_RWSEM_SINGLE_WRITER_VALUE (RWSEM_ACTIVE_WRITE_BIAS)
+#endif
+
+/* Linux 3.16 changed activity to count for rwsem-spinlock */
+#if defined(HAVE_RWSEM_ACTIVITY)
+#define RWSEM_COUNT(sem) sem->activity
+/* Linux 4.8 changed count to an atomic_long_t for !rwsem-spinlock */
+#elif defined(HAVE_RWSEM_ATOMIC_LONG_COUNT)
+#define RWSEM_COUNT(sem) atomic_long_read(&(sem)->count)
+#else
+#define RWSEM_COUNT(sem) sem->count
+#endif
+
+int rwsem_tryupgrade(struct rw_semaphore *rwsem);
+
#if defined(RWSEM_SPINLOCK_IS_RAW)
#define spl_rwsem_lock_irqsave(lk, fl) raw_spin_lock_irqsave(lk, fl)
#define spl_rwsem_unlock_irqrestore(lk, fl) raw_spin_unlock_irqrestore(lk, fl)
#define _BIG_ENDIAN
-#else /* Currently x86_64, i386, arm, powerpc, s390, and sparc are supported */
+/* MIPS arch specific defines */
+#elif defined(__mips__)
+
+#if defined(__MIPSEB__)
+#define _BIG_ENDIAN
+#elif defined(__MIPSEL__)
+#define _LITTLE_ENDIAN
+#else
+#error MIPS no endian specified
+#endif
+
+#ifndef _LP64
+#define _ILP32
+#endif
+
+#define _SUNOS_VTOC_16
+
+#else
+/*
+ * Currently supported:
+ * x86_64, i386, arm, powerpc, s390, sparc, and mips
+ */
#error "Unsupported ISA type"
#endif
typedef struct {
struct mutex m_mutex;
spinlock_t m_lock; /* used for serializing mutex_exit */
+#ifndef HAVE_MUTEX_OWNER
+ /* only when kernel doesn't have owner */
kthread_t *m_owner;
+#endif
} kmutex_t;
#define MUTEX(mp) (&((mp)->m_mutex))
static inline void
spl_mutex_set_owner(kmutex_t *mp)
{
+ /*
+ * kernel will handle its owner, so we don't need to do anything if it
+ * is defined.
+ */
+#ifndef HAVE_MUTEX_OWNER
mp->m_owner = current;
+#endif
}
static inline void
spl_mutex_clear_owner(kmutex_t *mp)
{
+#ifndef HAVE_MUTEX_OWNER
mp->m_owner = NULL;
+#endif
}
+#ifdef HAVE_MUTEX_OWNER
+#define mutex_owner(mp) (ACCESS_ONCE(MUTEX(mp)->owner))
+#else
#define mutex_owner(mp) (ACCESS_ONCE((mp)->m_owner))
+#endif
#define mutex_owned(mp) (mutex_owner(mp) == current)
#define MUTEX_HELD(mp) mutex_owned(mp)
#define MUTEX_NOT_HELD(mp) (!MUTEX_HELD(mp))
downgrade_write(SEM(rwp)); \
})
-#if defined(CONFIG_RWSEM_GENERIC_SPINLOCK)
/*
- * For the generic implementations of rw-semaphores the following is
- * true. If your semaphore implementation internally represents the
- * semaphore state differently then special case handling is required.
- * - if activity/count is 0 then there are no active readers or writers
- * - if activity/count is +ve then that is the number of active readers
- * - if activity/count is -1 then there is one active writer
+ * This implementation of rw_tryupgrade() behaves slightly differently
+ * from its counterparts on other platforms. It drops the RW_READER lock
+ * and then acquires the RW_WRITER lock leaving a small window where no
+ * lock is held. On other platforms the lock is never released during
+ * the upgrade process. This is necessary under Linux because the kernel
+ * does not provide an upgrade function.
*/
-
-extern void __up_read_locked(struct rw_semaphore *);
-extern int __down_write_trylock_locked(struct rw_semaphore *);
-
-#define rw_tryupgrade(rwp) \
-({ \
- unsigned long _flags_; \
- int _rc_ = 0; \
- \
- spl_rwsem_lock_irqsave(&SEM(rwp)->wait_lock, _flags_); \
- if ((list_empty(&SEM(rwp)->wait_list)) && \
- (SEM(rwp)->activity == 1)) { \
- __up_read_locked(SEM(rwp)); \
- VERIFY(_rc_ = __down_write_trylock_locked(SEM(rwp))); \
- (rwp)->rw_owner = current; \
- } \
- spl_rwsem_unlock_irqrestore(&SEM(rwp)->wait_lock, _flags_); \
- _rc_; \
+#define rw_tryupgrade(rwp) \
+({ \
+ int _rc_ = 0; \
+ \
+ if (RW_WRITE_HELD(rwp)) { \
+ _rc_ = 1; \
+ } else { \
+ if ((_rc_ = rwsem_tryupgrade(SEM(rwp)))) \
+ spl_rw_set_owner(rwp); \
+ } \
+ _rc_; \
})
-#else
-/*
- * rw_tryupgrade() can be implemented correctly but for each supported
- * arch we will need a custom implementation. For the x86 implementation
- * it looks like a custom cmpxchg() to atomically check and promote the
- * rwsem would be safe. For now that's not worth the trouble so in this
- * case rw_tryupgrade() has just been disabled.
- */
-#define rw_tryupgrade(rwp) ({ 0; })
-#endif
int spl_rw_init(void);
void spl_rw_fini(void);
{
kmem_debug_t *dptr;
+ /* Ignore NULL pointer since we haven't tracked it at all*/
+ if (ptr == NULL)
+ return;
+
/* Must exist in hash due to kmem_alloc() */
dptr = kmem_del_init(&kmem_lock, kmem_table, KMEM_HASH_BITS, ptr);
ASSERT3P(dptr, !=, NULL);
#define DEBUG_SUBSYSTEM S_RWLOCK
-#ifdef CONFIG_RWSEM_GENERIC_SPINLOCK
-
-/*
- * From lib/rwsem-spinlock.c but modified such that the caller is
- * responsible for acquiring and dropping the sem->wait_lock.
- */
-struct rwsem_waiter {
- struct list_head list;
- struct task_struct *task;
- unsigned int flags;
-#define RWSEM_WAITING_FOR_READ 0x00000001
-#define RWSEM_WAITING_FOR_WRITE 0x00000002
-};
-
-/* wake a single writer */
-static struct rw_semaphore *
-__rwsem_wake_one_writer_locked(struct rw_semaphore *sem)
+#if defined(CONFIG_RWSEM_GENERIC_SPINLOCK)
+static int
+__rwsem_tryupgrade(struct rw_semaphore *rwsem)
{
- struct rwsem_waiter *waiter;
- struct task_struct *tsk;
-
- sem->activity = -1;
-
- waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list);
- list_del(&waiter->list);
-
- tsk = waiter->task;
- smp_mb();
- waiter->task = NULL;
- wake_up_process(tsk);
- put_task_struct(tsk);
- return sem;
+ int ret = 0;
+ unsigned long flags;
+ spl_rwsem_lock_irqsave(&rwsem->wait_lock, flags);
+ if (RWSEM_COUNT(rwsem) == SPL_RWSEM_SINGLE_READER_VALUE &&
+ list_empty(&rwsem->wait_list)) {
+ ret = 1;
+ RWSEM_COUNT(rwsem) = SPL_RWSEM_SINGLE_WRITER_VALUE;
+ }
+ spl_rwsem_unlock_irqrestore(&rwsem->wait_lock, flags);
+ return (ret);
}
-
-/* release a read lock on the semaphore */
-void
-__up_read_locked(struct rw_semaphore *sem)
+#elif defined(HAVE_RWSEM_ATOMIC_LONG_COUNT)
+static int
+__rwsem_tryupgrade(struct rw_semaphore *rwsem)
{
- if (--sem->activity == 0 && !list_empty(&sem->wait_list))
- (void)__rwsem_wake_one_writer_locked(sem);
+ long val;
+ val = atomic_long_cmpxchg(&rwsem->count, SPL_RWSEM_SINGLE_READER_VALUE,
+ SPL_RWSEM_SINGLE_WRITER_VALUE);
+ return (val == SPL_RWSEM_SINGLE_READER_VALUE);
}
-EXPORT_SYMBOL(__up_read_locked);
-
-/* trylock for writing -- returns 1 if successful, 0 if contention */
-int
-__down_write_trylock_locked(struct rw_semaphore *sem)
+#else
+static int
+__rwsem_tryupgrade(struct rw_semaphore *rwsem)
{
- int ret = 0;
-
- if (sem->activity == 0 && list_empty(&sem->wait_list)) {
- sem->activity = -1;
- ret = 1;
- }
-
- return ret;
+ typeof (rwsem->count) val;
+ val = cmpxchg(&rwsem->count, SPL_RWSEM_SINGLE_READER_VALUE,
+ SPL_RWSEM_SINGLE_WRITER_VALUE);
+ return (val == SPL_RWSEM_SINGLE_READER_VALUE);
}
-EXPORT_SYMBOL(__down_write_trylock_locked);
+#endif
+int
+rwsem_tryupgrade(struct rw_semaphore *rwsem)
+{
+ if (__rwsem_tryupgrade(rwsem)) {
+ rwsem_release(&rwsem->dep_map, 1, _RET_IP_);
+ rwsem_acquire(&rwsem->dep_map, 0, 1, _RET_IP_);
+#ifdef CONFIG_RWSEM_SPIN_ON_OWNER
+ rwsem->owner = current;
#endif
+ return (1);
+ }
+ return (0);
+}
+EXPORT_SYMBOL(rwsem_tryupgrade);
int spl_rw_init(void) { return 0; }
void spl_rw_fini(void) { }
void
taskq_wait_outstanding(taskq_t *tq, taskqid_t id)
{
- wait_event(tq->tq_wait_waitq,
- taskq_wait_outstanding_check(tq, id ? id : tq->tq_next_id - 1));
+ id = id ? id : tq->tq_next_id - 1;
+ wait_event(tq->tq_wait_waitq, taskq_wait_outstanding_check(tq, id));
}
EXPORT_SYMBOL(taskq_wait_outstanding);
{
taskq_t *tq = (taskq_t *)arg;
- (void) taskq_thread_create(tq);
-
- spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
- tq->tq_nspawn--;
- spin_unlock_irqrestore(&tq->tq_lock, tq->tq_lock_flags);
+ if (taskq_thread_create(tq) == NULL) {
+ /* restore spawning count if failed */
+ spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
+ tq->tq_nspawn--;
+ spin_unlock_irqrestore(&tq->tq_lock, tq->tq_lock_flags);
+ }
}
/*
flush_signals(current);
spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
+ /*
+ * If we are dynamically spawned, decrease spawning count. Note that
+ * we could be created during taskq_create, in which case we shouldn't
+ * do the decrement. But it's fine because taskq_create will reset
+ * tq_nspawn later.
+ */
+ if (tq->tq_flags & TASKQ_DYNAMIC)
+ tq->tq_nspawn--;
/* Immediately exit if more threads than allowed were created. */
if (tq->tq_nthreads >= tq->tq_maxthreads)
/* Wait for all threads to be started before potential destroy */
wait_event(tq->tq_wait_waitq, tq->tq_nthreads == count);
+ /*
+ * taskq_thread might have touched nspawn, but we don't want them to
+ * because they're not dynamically spawned. So we reset it to 0
+ */
+ tq->tq_nspawn = 0;
if (rc) {
taskq_destroy(tq);
taskq_wait(tq);
spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
+ /* wait for spawning threads to insert themselves to the list */
+ while (tq->tq_nspawn) {
+ spin_unlock_irqrestore(&tq->tq_lock, tq->tq_lock_flags);
+ schedule_timeout_interruptible(1);
+ spin_lock_irqsave(&tq->tq_lock, tq->tq_lock_flags);
+ }
/*
* Signal each thread to exit and block until it does. Each thread
if (rc)
return (ERR_PTR(rc));
- spl_inode_lock(parent.dentry->d_inode);
+ /* use I_MUTEX_PARENT because vfs_unlink needs it */
+ spl_inode_lock_nested(parent.dentry->d_inode, I_MUTEX_PARENT);
dentry = lookup_one_len(basename, parent.dentry, len);
if (IS_ERR(dentry)) {
+++ /dev/null
-#include <linux/module.h>
-#include <linux/vermagic.h>
-#include <linux/compiler.h>
-
-MODULE_INFO(vermagic, VERMAGIC_STRING);
-
-struct module __this_module
-__attribute__((section(".gnu.linkonce.this_module"))) = {
- .name = KBUILD_MODNAME,
- .init = init_module,
-#ifdef CONFIG_MODULE_UNLOAD
- .exit = cleanup_module,
-#endif
- .arch = MODULE_ARCH_INIT,
-};
-
-static const struct modversion_info ____versions[]
-__used
-__attribute__((section("__versions"))) = {
- { 0x51198477, "module_layout" },
- { 0x6a5fa363, "sigprocmask" },
- { 0xdc9e0715, "kmem_cache_destroy" },
- { 0xc816dc2d, "kmalloc_caches" },
- { 0x5a34a45c, "__kmalloc" },
- { 0x5aeb145f, "complete_and_exit" },
- { 0x77ecac9f, "zlib_inflateEnd" },
- { 0xf5893abf, "up_read" },
- { 0x4c4fef19, "kernel_stack" },
- { 0xadaabe1b, "pv_lock_ops" },
- { 0xc163599a, "register_sysctl_table" },
- { 0x287f10e3, "inode_permission" },
- { 0x3ec8886f, "param_ops_int" },
- { 0xa0fbac79, "wake_up_bit" },
- { 0x25ec1b28, "strlen" },
- { 0xf6221cbb, "seq_open" },
- { 0xc8b57c27, "autoremove_wake_function" },
- { 0xbd100793, "cpu_online_mask" },
- { 0xb5dcab5b, "remove_wait_queue" },
- { 0xd0bd878, "seq_puts" },
- { 0xc8bbd666, "proc_dointvec" },
- { 0x20000329, "simple_strtoul" },
- { 0xc0a3d105, "find_next_bit" },
- { 0xace09de5, "dput" },
- { 0x21a7d814, "seq_printf" },
- { 0x7406e576, "remove_proc_entry" },
- { 0xc3784385, "filp_close" },
- { 0xebebe14, "groups_free" },
- { 0xfb0e29f, "init_timer_key" },
- { 0xf8983de7, "prepare_to_wait_exclusive" },
- { 0xba2adaf, "mutex_unlock" },
- { 0x8581d631, "vfs_fsync" },
- { 0x999e8297, "vfree" },
- { 0x47c7b0d2, "cpu_number" },
- { 0x84000109, "path_get" },
- { 0x79fd81ae, "seq_read" },
- { 0xd3b65d9d, "kthread_create_on_node" },
- { 0x7d11c268, "jiffies" },
- { 0x57a6ccd0, "down_read" },
- { 0x393fb80d, "unlock_rename" },
- { 0x76ac54ea, "kthread_bind" },
- { 0x6395be94, "__init_waitqueue_head" },
- { 0x4f8b5ddb, "_copy_to_user" },
- { 0xffd5a395, "default_wake_function" },
- { 0xfe7c4287, "nr_cpu_ids" },
- { 0x72aa82c6, "param_ops_charp" },
- { 0xa69289f4, "vfs_read" },
- { 0xd5f2172f, "del_timer_sync" },
- { 0xaba3870c, "kern_path" },
- { 0xde0bdcff, "memset" },
- { 0xc5661c2c, "proc_mkdir" },
- { 0x11089ac7, "_ctype" },
- { 0x8f64aa4, "_raw_spin_unlock_irqrestore" },
- { 0x69371301, "current_task" },
- { 0x87ebeb76, "__mutex_init" },
- { 0x27e1a049, "printk" },
- { 0xe15f42bb, "_raw_spin_trylock" },
- { 0x4ebec927, "kthread_stop" },
- { 0x2fa5a500, "memcmp" },
- { 0xa1c76e0a, "_cond_resched" },
- { 0xc0580937, "rb_erase" },
- { 0x7ec9bfbc, "strncpy" },
- { 0xd38eccd0, "proc_doulongvec_minmax" },
- { 0xb4390f9a, "mcount" },
- { 0xce5ac24f, "zlib_inflate_workspacesize" },
- { 0x85abc85f, "strncmp" },
- { 0x672144bd, "strlcpy" },
- { 0xde31469e, "kmem_cache_free" },
- { 0x93a6e0b2, "io_schedule" },
- { 0xc2fadba6, "lock_rename" },
- { 0xafe1db9d, "mutex_lock" },
- { 0x1e6d26a8, "strstr" },
- { 0xbe2c0274, "add_timer" },
- { 0xf0f1246c, "kvasprintf" },
- { 0xc740c64a, "memchr" },
- { 0x315c65fd, "zlib_deflateInit2" },
- { 0x3b4ceb4a, "up_write" },
- { 0xe6e3b875, "down_write" },
- { 0x4d839a9e, "fput" },
- { 0x3d66107e, "proc_dostring" },
- { 0xcde0a3b6, "flush_signals" },
- { 0x881039d0, "zlib_inflate" },
- { 0x9f984513, "strrchr" },
- { 0xafd3be90, "kmem_cache_alloc" },
- { 0x78764f4e, "pv_irq_ops" },
- { 0x618911fc, "numa_node" },
- { 0xc50bab05, "unregister_shrinker" },
- { 0xcc07af75, "strnlen" },
- { 0x12a38747, "usleep_range" },
- { 0x457df5c7, "unregister_sysctl_table" },
- { 0x93fca811, "__get_free_pages" },
- { 0xe9f7149c, "zlib_deflate_workspacesize" },
- { 0xf0fdf6cb, "__stack_chk_fail" },
- { 0xb9249d16, "cpu_possible_mask" },
- { 0xd62c833f, "schedule_timeout" },
- { 0x1000e51, "schedule" },
- { 0x79a38e61, "___ratelimit" },
- { 0x6b2dc060, "dump_stack" },
- { 0xcfa37f55, "wake_up_process" },
- { 0xa9f5a57b, "__put_cred" },
- { 0xcdd61e06, "user_path_at" },
- { 0x82384b7, "path_put" },
- { 0x54b130a8, "kmem_cache_alloc_trace" },
- { 0xd52bf1ce, "_raw_spin_lock" },
- { 0x3928efe9, "__per_cpu_offset" },
- { 0x9327f5ce, "_raw_spin_lock_irqsave" },
- { 0xa6dcc773, "rb_insert_color" },
- { 0x5a642ebb, "vfs_unlink" },
- { 0x83acad80, "kmem_cache_create" },
- { 0x4211c3c1, "zlib_inflateInit2" },
- { 0xaf64ad0d, "zlib_deflate" },
- { 0x10f2eb76, "vsnprintf" },
- { 0x4302d0eb, "free_pages" },
- { 0xcf21d241, "__wake_up" },
- { 0xd2965f6f, "kthread_should_stop" },
- { 0xa0ceef51, "out_of_line_wait_on_bit" },
- { 0x1711d684, "proc_create_data" },
- { 0x2de278c4, "seq_lseek" },
- { 0x506746b6, "getrawmonotonic" },
- { 0x5c5fd5f1, "iput" },
- { 0xa9bd2676, "__vmalloc" },
- { 0x37a0cba, "kfree" },
- { 0x236c8c64, "memcpy" },
- { 0x5c8b5ce8, "prepare_to_wait" },
- { 0x9518b623, "register_shrinker" },
- { 0xcd2549e0, "set_user_nice" },
- { 0xee46885d, "add_wait_queue_exclusive" },
- { 0x3340f4bd, "fget" },
- { 0xf741c793, "zlib_deflateEnd" },
- { 0xfa66f77c, "finish_wait" },
- { 0x4cbbd171, "__bitmap_weight" },
- { 0xe8116e08, "__kmalloc_node" },
- { 0x50720c5f, "snprintf" },
- { 0x1649bb51, "seq_release" },
- { 0xa3a5be95, "memmove" },
- { 0x2258d378, "lookup_one_len" },
- { 0xcc025652, "vfs_rename" },
- { 0x5541ea93, "on_each_cpu" },
- { 0x7a97c742, "vfs_getattr" },
- { 0x4f6b400b, "_copy_from_user" },
- { 0xa2c56c31, "param_ops_ulong" },
- { 0xc3fe87c8, "param_ops_uint" },
- { 0x2a6e6109, "__init_rwsem" },
- { 0x3ddcc090, "vfs_write" },
- { 0x3312bd6c, "filp_open" },
-};
-
-static const char __module_depends[]
-__used
-__attribute__((section(".modinfo"))) =
-"depends=zlib_deflate";
-
-
-MODULE_INFO(srcversion, "9E7B4A7108A949885C986BF");
#define SPLAT_RWLOCK_TEST5_DESC "Write downgrade"
#define SPLAT_RWLOCK_TEST6_ID 0x0706
-#define SPLAT_RWLOCK_TEST6_NAME "rw_tryupgrade"
-#define SPLAT_RWLOCK_TEST6_DESC "Read upgrade"
+#define SPLAT_RWLOCK_TEST6_NAME "rw_tryupgrade-1"
+#define SPLAT_RWLOCK_TEST6_DESC "rwsem->count value"
+
+#define SPLAT_RWLOCK_TEST7_ID 0x0707
+#define SPLAT_RWLOCK_TEST7_NAME "rw_tryupgrade-2"
+#define SPLAT_RWLOCK_TEST7_DESC "Read upgrade"
#define SPLAT_RWLOCK_TEST_MAGIC 0x115599DDUL
#define SPLAT_RWLOCK_TEST_NAME "rwlock_test"
splat_init_rw_priv(rwp, file);
rw_enter(&rwp->rw_rwlock, RW_READER);
- if (!RW_READ_HELD(&rwp->rw_rwlock)) {
+ if (RWSEM_COUNT(SEM(&rwp->rw_rwlock)) !=
+ SPL_RWSEM_SINGLE_READER_VALUE) {
+ splat_vprint(file, SPLAT_RWLOCK_TEST6_NAME,
+ "We assumed single reader rwsem->count "
+ "should be %ld, but is %ld\n",
+ SPL_RWSEM_SINGLE_READER_VALUE,
+ RWSEM_COUNT(SEM(&rwp->rw_rwlock)));
+ rc = -ENOLCK;
+ goto out;
+ }
+ rw_exit(&rwp->rw_rwlock);
+
+ rw_enter(&rwp->rw_rwlock, RW_WRITER);
+ if (RWSEM_COUNT(SEM(&rwp->rw_rwlock)) !=
+ SPL_RWSEM_SINGLE_WRITER_VALUE) {
splat_vprint(file, SPLAT_RWLOCK_TEST6_NAME,
+ "We assumed single writer rwsem->count "
+ "should be %ld, but is %ld\n",
+ SPL_RWSEM_SINGLE_WRITER_VALUE,
+ RWSEM_COUNT(SEM(&rwp->rw_rwlock)));
+ rc = -ENOLCK;
+ goto out;
+ }
+ rc = 0;
+ splat_vprint(file, SPLAT_RWLOCK_TEST6_NAME, "%s",
+ "rwsem->count same as we assumed\n");
+out:
+ rw_exit(&rwp->rw_rwlock);
+ rw_destroy(&rwp->rw_rwlock);
+ kfree(rwp);
+
+ return rc;
+}
+
+static int
+splat_rwlock_test7(struct file *file, void *arg)
+{
+ rw_priv_t *rwp;
+ int rc;
+
+ rwp = (rw_priv_t *)kmalloc(sizeof(*rwp), GFP_KERNEL);
+ if (rwp == NULL)
+ return -ENOMEM;
+
+ splat_init_rw_priv(rwp, file);
+
+ rw_enter(&rwp->rw_rwlock, RW_READER);
+ if (!RW_READ_HELD(&rwp->rw_rwlock)) {
+ splat_vprint(file, SPLAT_RWLOCK_TEST7_NAME,
"rwlock should be read lock: %d\n",
RW_READ_HELD(&rwp->rw_rwlock));
rc = -ENOLCK;
goto out;
}
-#if defined(CONFIG_RWSEM_GENERIC_SPINLOCK)
/* With one reader upgrade should never fail. */
rc = rw_tryupgrade(&rwp->rw_rwlock);
if (!rc) {
- splat_vprint(file, SPLAT_RWLOCK_TEST6_NAME,
+ splat_vprint(file, SPLAT_RWLOCK_TEST7_NAME,
"rwlock failed upgrade from reader: %d\n",
RW_READ_HELD(&rwp->rw_rwlock));
rc = -ENOLCK;
}
if (RW_READ_HELD(&rwp->rw_rwlock) || !RW_WRITE_HELD(&rwp->rw_rwlock)) {
- splat_vprint(file, SPLAT_RWLOCK_TEST6_NAME, "rwlock should "
+ splat_vprint(file, SPLAT_RWLOCK_TEST7_NAME, "rwlock should "
"have 0 (not %d) reader and 1 (not %d) writer\n",
RW_READ_HELD(&rwp->rw_rwlock),
RW_WRITE_HELD(&rwp->rw_rwlock));
}
rc = 0;
- splat_vprint(file, SPLAT_RWLOCK_TEST6_NAME, "%s",
+ splat_vprint(file, SPLAT_RWLOCK_TEST7_NAME, "%s",
"rwlock properly upgraded\n");
-#else
- rc = 0;
- splat_vprint(file, SPLAT_RWLOCK_TEST6_NAME, "%s",
- "rw_tryupgrade() is disabled for this arch\n");
-#endif
out:
rw_exit(&rwp->rw_rwlock);
rw_destroy(&rwp->rw_rwlock);
SPLAT_RWLOCK_TEST5_ID, splat_rwlock_test5);
SPLAT_TEST_INIT(sub, SPLAT_RWLOCK_TEST6_NAME, SPLAT_RWLOCK_TEST6_DESC,
SPLAT_RWLOCK_TEST6_ID, splat_rwlock_test6);
+ SPLAT_TEST_INIT(sub, SPLAT_RWLOCK_TEST7_NAME, SPLAT_RWLOCK_TEST7_DESC,
+ SPLAT_RWLOCK_TEST7_ID, splat_rwlock_test7);
return sub;
}
splat_rwlock_fini(splat_subsystem_t *sub)
{
ASSERT(sub);
+ SPLAT_TEST_FINI(sub, SPLAT_RWLOCK_TEST7_ID);
SPLAT_TEST_FINI(sub, SPLAT_RWLOCK_TEST6_ID);
SPLAT_TEST_FINI(sub, SPLAT_RWLOCK_TEST5_ID);
SPLAT_TEST_FINI(sub, SPLAT_RWLOCK_TEST4_ID);
+++ /dev/null
-#include <linux/module.h>
-#include <linux/vermagic.h>
-#include <linux/compiler.h>
-
-MODULE_INFO(vermagic, VERMAGIC_STRING);
-
-struct module __this_module
-__attribute__((section(".gnu.linkonce.this_module"))) = {
- .name = KBUILD_MODNAME,
- .init = init_module,
-#ifdef CONFIG_MODULE_UNLOAD
- .exit = cleanup_module,
-#endif
- .arch = MODULE_ARCH_INIT,
-};
-
-static const struct modversion_info ____versions[]
-__used
-__attribute__((section("__versions"))) = {
- { 0x51198477, "module_layout" },
- { 0xdd4acab1, "vn_fsync" },
- { 0xc816dc2d, "kmalloc_caches" },
- { 0x5a34a45c, "__kmalloc" },
- { 0xf9a482f9, "msleep" },
- { 0x8d8996ce, "z_uncompress" },
- { 0x26b64321, "call_usermodehelper_setfns" },
- { 0xd670e116, "spl_kmem_alloc_warn" },
- { 0xf5893abf, "up_read" },
- { 0x1c1af916, "set_normalized_timespec" },
- { 0xdb347c7a, "call_usermodehelper_exec" },
- { 0xd6ee688f, "vmalloc" },
- { 0xadaabe1b, "pv_lock_ops" },
- { 0x25ec1b28, "strlen" },
- { 0x8205f265, "crhold" },
- { 0x1efe1f66, "vn_close" },
- { 0x4ff1c9bc, "populate_rootfs_wait" },
- { 0x19295e53, "taskq_create" },
- { 0x3f38bd50, "crgetruid" },
- { 0xc8b57c27, "autoremove_wake_function" },
- { 0xd14a7eb5, "vn_getattr" },
- { 0xbd100793, "cpu_online_mask" },
- { 0x79aa04a2, "get_random_bytes" },
- { 0xab140103, "spl_kmem_alloc" },
- { 0x80c478fd, "rootdir" },
- { 0x52760ca9, "getnstimeofday" },
- { 0x73a78bc4, "downgrade_write" },
- { 0xffff91e3, "taskq_init_ent" },
- { 0xefc4da17, "kobj_close_file" },
- { 0xc0a3d105, "find_next_bit" },
- { 0xf7fb002a, "kobj_get_filesize" },
- { 0x63bdf5f0, "crgetngroups" },
- { 0xf7756b61, "vn_rename" },
- { 0x8e4c2658, "crgetgroups" },
- { 0xebebe14, "groups_free" },
- { 0xba2adaf, "mutex_unlock" },
- { 0x4704f678, "vn_rdwr" },
- { 0x999e8297, "vfree" },
- { 0xda8ebb70, "crgetsuid" },
- { 0x91715312, "sprintf" },
- { 0x8eb0a41f, "tsd_destroy" },
- { 0xb8e71471, "spl_kmem_cache_free" },
- { 0x53c639a, "ddi_strtoul" },
- { 0xbc32eee7, "spl_panic" },
- { 0x7d11c268, "jiffies" },
- { 0x31eb4278, "mutex_trylock" },
- { 0x57a6ccd0, "down_read" },
- { 0x30e8b295, "spl_kthread_create" },
- { 0x35225ea3, "down_write_trylock" },
- { 0xde9360ba, "totalram_pages" },
- { 0x786ba98a, "crgetuid" },
- { 0x6395be94, "__init_waitqueue_head" },
- { 0x4f8b5ddb, "_copy_to_user" },
- { 0xfe7c4287, "nr_cpu_ids" },
- { 0x106b6ba8, "taskq_destroy" },
- { 0x114258fb, "misc_register" },
- { 0xde0bdcff, "memset" },
- { 0x8b78128, "spl_kmem_cache_destroy" },
- { 0xbc9dddde, "taskq_wait_id" },
- { 0x8f64aa4, "_raw_spin_unlock_irqrestore" },
- { 0x69371301, "current_task" },
- { 0x143fcac6, "__cv_signal" },
- { 0x87ebeb76, "__mutex_init" },
- { 0x27e1a049, "printk" },
- { 0x4ebec927, "kthread_stop" },
- { 0x8bb0527b, "crgetrgid" },
- { 0x2fa5a500, "memcmp" },
- { 0x856dab93, "set_current_groups" },
- { 0xa1c76e0a, "_cond_resched" },
- { 0xb940ee11, "taskq_wait" },
- { 0x7ec9bfbc, "strncpy" },
- { 0xb4390f9a, "mcount" },
- { 0x676335fa, "__cv_timedwait" },
- { 0x85abc85f, "strncmp" },
- { 0xafe1db9d, "mutex_lock" },
- { 0xa340453c, "system_taskq" },
- { 0x13401075, "taskq_dispatch" },
- { 0x5bb6ad4b, "spl_vmem_zalloc" },
- { 0x6e06545b, "crgetsgid" },
- { 0x3b4ceb4a, "up_write" },
- { 0xe6e3b875, "down_write" },
- { 0x6d601403, "crgetgid" },
- { 0x1b7b5809, "__cv_broadcast" },
- { 0x3323ccb1, "tsd_get" },
- { 0x53bddca5, "taskq_dispatch_ent" },
- { 0x9d271bf, "spl_kmem_cache_expire" },
- { 0x31eaf145, "init_task" },
- { 0xfd07bd40, "spl_kmem_alloc_max" },
- { 0x351c2576, "z_compress_level" },
- { 0x81376bfd, "vn_remove" },
- { 0xc50bab05, "unregister_shrinker" },
- { 0x6ae07d22, "__cv_wait" },
- { 0x17980bc5, "crfree" },
- { 0x93fca811, "__get_free_pages" },
- { 0xf0fdf6cb, "__stack_chk_fail" },
- { 0xd62c833f, "schedule_timeout" },
- { 0x1000e51, "schedule" },
- { 0x4b5814ef, "kmalloc_order_trace" },
- { 0x958b84e3, "tsd_create" },
- { 0x667ba081, "spl_kmem_cache_create" },
- { 0x20173f35, "taskq_wait_outstanding" },
- { 0xaebbec7c, "kobj_read_file" },
- { 0xdae80439, "spl_vmem_alloc" },
- { 0xcfa37f55, "wake_up_process" },
- { 0xd22ed5e2, "spl_kmem_cache_alloc" },
- { 0xa3a77c69, "down_read_trylock" },
- { 0x54b130a8, "kmem_cache_alloc_trace" },
- { 0x360e492b, "__cv_init" },
- { 0xd52bf1ce, "_raw_spin_lock" },
- { 0x9327f5ce, "_raw_spin_lock_irqsave" },
- { 0x4302d0eb, "free_pages" },
- { 0xcf21d241, "__wake_up" },
- { 0x659a64d0, "call_usermodehelper_setup" },
- { 0xd2965f6f, "kthread_should_stop" },
- { 0x2c0fbe10, "vn_open" },
- { 0x31ec560e, "groups_alloc" },
- { 0x506746b6, "getrawmonotonic" },
- { 0x1285cb78, "tsd_set" },
- { 0x3896a905, "__thread_exit" },
- { 0x37a0cba, "kfree" },
- { 0x82fe53e1, "ddi_strtol" },
- { 0x236c8c64, "memcpy" },
- { 0x5c8b5ce8, "prepare_to_wait" },
- { 0x9518b623, "register_shrinker" },
- { 0xf68905fd, "ddi_strtoull" },
- { 0xd9ace09, "ddi_strtoll" },
- { 0xfa66f77c, "finish_wait" },
- { 0x4cbbd171, "__bitmap_weight" },
- { 0x9f46de9, "kobj_open_file" },
- { 0x185936d6, "groupmember" },
- { 0x401c592f, "spl_version" },
- { 0x50720c5f, "snprintf" },
- { 0x80c3f220, "spl_kmem_free" },
- { 0x7466fa85, "spl_kmem_cache_reap_now" },
- { 0x1500ba78, "__thread_create" },
- { 0x4f6b400b, "_copy_from_user" },
- { 0x778a305, "spl_vmem_free" },
- { 0xb3e56341, "taskq_cancel_id" },
- { 0xdfb0b5e5, "misc_deregister" },
- { 0x2a6e6109, "__init_rwsem" },
- { 0xec031267, "taskq_dispatch_delay" },
- { 0x85524b8b, "p0" },
- { 0x59fe72f0, "__cv_destroy" },
- { 0x2e1cae5a, "vn_openat" },
- { 0x9dcb88fc, "spl_kmem_zalloc" },
- { 0xdb7958d9, "taskq_empty_ent" },
-};
-
-static const char __module_depends[]
-__used
-__attribute__((section(".modinfo"))) =
-"depends=spl";
-
-
-MODULE_INFO(srcversion, "EFD5F56EF2E9E5A7BCED0BE");
rm -rf $RPM_BUILD_ROOT
%changelog
+* Fri Sep 9 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.8-1
+- Fix HAVE_MUTEX_OWNER test for kernels prior to 4.6 zfsonlinux/spl#566
+- Add handling for kernel 4.7's CONFIG_TRIM_UNUSED_KSYMS zfsonlinux/spl#565
+- Linux 4.8 compat: rw_semaphore atomic_long_t count zfsonlinux/spl#563
+- Implement a proper rw_tryupgrade zfsonlinux/spl#554
+- Add rw_tryupgrade() zfsonlinux/spl#534 zfsonlinux/zfs#4388
+- Fix taskq_wait_outstanding re-evaluate tq_next_id zfsonlinux/spl#553
+- Fix race between taskq_destroy and dynamic spawning thread zfsonlinux/spl#553 zfsonlinux/spl#550
+- Use kernel provided mutex owner zfsonlinux/spl#553 zfsonlinux/spl#550
+- Add isa_defs for MIPS zfsonlinux/spl#558
+- Linux 4.7 compat: inode_lock() and friends zfsonlinux/spl#549
+- Fix: handle NULL case in spl_kmem_free_track() zfsonlinux/spl#567
* Thu May 12 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.7-1
- Fix PPC build failure zfsonlinux/spl#516
* Tue Mar 22 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.6-1
%{_mandir}/man5/*
%changelog
+* Fri Sep 9 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.8-1
+- Fix HAVE_MUTEX_OWNER test for kernels prior to 4.6 zfsonlinux/spl#566
+- Add handling for kernel 4.7's CONFIG_TRIM_UNUSED_KSYMS zfsonlinux/spl#565
+- Linux 4.8 compat: rw_semaphore atomic_long_t count zfsonlinux/spl#563
+- Implement a proper rw_tryupgrade zfsonlinux/spl#554
+- Add rw_tryupgrade() zfsonlinux/spl#534 zfsonlinux/zfs#4388
+- Fix taskq_wait_outstanding re-evaluate tq_next_id zfsonlinux/spl#553
+- Fix race between taskq_destroy and dynamic spawning thread zfsonlinux/spl#553 zfsonlinux/spl#550
+- Use kernel provided mutex owner zfsonlinux/spl#553 zfsonlinux/spl#550
+- Add isa_defs for MIPS zfsonlinux/spl#558
+- Linux 4.7 compat: inode_lock() and friends zfsonlinux/spl#549
+- Fix: handle NULL case in spl_kmem_free_track() zfsonlinux/spl#567
* Thu May 12 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.7-1
- Fix PPC build failure zfsonlinux/spl#516
* Tue Mar 22 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.6-1
%{_mandir}/man5/*
%changelog
+* Fri Sep 9 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.8-1
+- Fix HAVE_MUTEX_OWNER test for kernels prior to 4.6 zfsonlinux/spl#566
+- Add handling for kernel 4.7's CONFIG_TRIM_UNUSED_KSYMS zfsonlinux/spl#565
+- Linux 4.8 compat: rw_semaphore atomic_long_t count zfsonlinux/spl#563
+- Implement a proper rw_tryupgrade zfsonlinux/spl#554
+- Add rw_tryupgrade() zfsonlinux/spl#534 zfsonlinux/zfs#4388
+- Fix taskq_wait_outstanding re-evaluate tq_next_id zfsonlinux/spl#553
+- Fix race between taskq_destroy and dynamic spawning thread zfsonlinux/spl#553 zfsonlinux/spl#550
+- Use kernel provided mutex owner zfsonlinux/spl#553 zfsonlinux/spl#550
+- Add isa_defs for MIPS zfsonlinux/spl#558
+- Linux 4.7 compat: inode_lock() and friends zfsonlinux/spl#549
+- Fix: handle NULL case in spl_kmem_free_track() zfsonlinux/spl#567
* Thu May 12 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.7-1
- Fix PPC build failure zfsonlinux/spl#516
* Tue Mar 22 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.6-1
/* fops->fallocate() exists */
#undef HAVE_INODE_FALLOCATE
+/* yes */
+#undef HAVE_INODE_LOCK_SHARED
+
/* truncate_range() inode operation is available */
#undef HAVE_INODE_TRUNCATE_RANGE
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
+/* yes */
+#undef HAVE_MUTEX_OWNER
+
/* yes */
#undef HAVE_PDE_DATA
/* __put_task_struct() is available */
#undef HAVE_PUT_TASK_STRUCT
+/* struct rw_semaphore has member activity */
+#undef HAVE_RWSEM_ACTIVITY
+
+/* struct rw_semaphore has atomic_long_t member count */
+#undef HAVE_RWSEM_ATOMIC_LONG_COUNT
+
/* linux/sched/rt.h exists */
#undef HAVE_SCHED_RT_HEADER