]> git.proxmox.com Git - mirror_spl-debian.git/commitdiff
Imported Upstream version 0.6.5.8
authorAron Xu <aron@debian.org>
Sat, 17 Sep 2016 16:59:02 +0000 (00:59 +0800)
committerAron Xu <aron@debian.org>
Sat, 17 Sep 2016 16:59:02 +0000 (00:59 +0800)
19 files changed:
META
config/spl-build.m4
configure
include/linux/file_compat.h
include/linux/rwsem_compat.h
include/sys/isa_defs.h
include/sys/mutex.h
include/sys/rwlock.h
module/spl/spl-kmem.c [changed mode: 0644->0755]
module/spl/spl-rwlock.c
module/spl/spl-taskq.c
module/spl/spl-vnode.c
module/spl/spl.mod.c [deleted file]
module/splat/splat-rwlock.c
module/splat/splat.mod.c [deleted file]
rpm/generic/spl-kmod.spec.in
rpm/generic/spl.spec.in
rpm/redhat/spl.spec.in
spl_config.h.in

diff --git a/META b/META
index 5bc4a29d80b3d3f95cade1c2ce34ef91f33582d7..659f39a2c1f85e86379c707d2d00957ece067e3f 100644 (file)
--- a/META
+++ b/META
@@ -1,7 +1,7 @@
 Meta:         1
 Name:         spl
 Branch:       1.0
-Version:      0.6.5.7
+Version:      0.6.5.8
 Release:      1
 Release-Tags: relext
 License:      GPL
index b9c04a95e01d60aa6d92d81e49836d200085f542..c401fd8bca1c5dbdcbd3fc4500922fd193ad3eac 100644 (file)
@@ -24,6 +24,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        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
@@ -39,11 +40,15 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        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], [
@@ -1244,6 +1249,26 @@ AC_DEFUN([SPL_AC_CONFIG_ZLIB_DEFLATE], [
        ])
 ])
 
+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.
@@ -1314,6 +1339,55 @@ AC_DEFUN([SPL_AC_RWSEM_SPINLOCK_IS_RAW], [
        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
@@ -1447,3 +1521,56 @@ AC_DEFUN([SPL_AC_WAIT_ON_BIT], [
                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"
+])
index b7ef488a5895bdc1d0975e1963e1ddc2edee1fe0..1e6215fc4e7a838150be5ee82d653a80a3e6daf1 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /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,
@@ -567,8 +567,8 @@ MAKEFLAGS=
 # 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=''
 
@@ -1357,7 +1357,7 @@ if test "$ac_init_help" = "long"; then
   # 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]...
 
@@ -1428,7 +1428,7 @@ fi
 
 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
 
@@ -1545,7 +1545,7 @@ fi
 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.
@@ -1823,7 +1823,7 @@ cat >config.log <<_ACEOF
 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 $@
@@ -2947,7 +2947,7 @@ fi
 
 # 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; }
 
@@ -13895,6 +13954,132 @@ $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 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;
 }
@@ -15058,15 +15430,15 @@ _ACEOF
                { $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
 
 
 
@@ -16470,6 +16842,132 @@ $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 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)                        ;;
                *)
@@ -17462,7 +18088,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # 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
@@ -17528,7 +18154,7 @@ _ACEOF
 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\\"
 
index a2db2590a23554e7fc56fa841e79c58793275e8e..916514566a23807fcd83ca4431f48ab72151259a 100644 (file)
@@ -76,8 +76,25 @@ spl_filp_fallocate(struct file *fp, int mode, loff_t offset, loff_t len)
 #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 */
 
index 5841d7c286978011df049ecbc2520edb249bdf7a..c874885b0c9de4f79abc889c6f9a341ee79a7307 100644 (file)
 
 #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)
index 3d474872cb0b846353972d520ab6f70919c05efb..53dead38c19b897bf67b8bd909d8eee2e2258ed6 100644 (file)
 
 #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
 
index 9b297e9faea38e63dcbe5dc39a9f6db69117c92c..be69deaab5d585915a001889b35928fbb560f00e 100644 (file)
@@ -38,7 +38,10 @@ typedef enum {
 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))
@@ -46,16 +49,28 @@ typedef struct {
 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))
index 7064e8f1f2018a162ceae6097bf7b80a49948fdd..7e85f59e02f09bc2c978480d834fc8332df69c7f 100644 (file)
@@ -167,44 +167,26 @@ RW_LOCK_HELD(krwlock_t *rwp)
         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);
old mode 100644 (file)
new mode 100755 (executable)
index 0931fdf..2b68c29
@@ -383,6 +383,10 @@ spl_kmem_free_track(const void *ptr, size_t size)
 {
        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);
index 462a6f0de7761f3ccfeb3f082070c753b326c928..77f46f2d6fdf5119132424fe396de23378d4e644 100644 (file)
 
 #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) { }
index 7d233c23e40d2425f252165c22ca0d3495ac1986..017b410ac03a6384a7a004b432aef3ff20bc6609 100644 (file)
@@ -419,8 +419,8 @@ taskq_wait_outstanding_check(taskq_t *tq, taskqid_t id)
 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);
 
@@ -738,11 +738,12 @@ taskq_thread_spawn_task(void *arg)
 {
        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);
+       }
 }
 
 /*
@@ -820,6 +821,14 @@ taskq_thread(void *args)
        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)
@@ -1020,6 +1029,11 @@ taskq_create(const char *name, int nthreads, pri_t pri,
 
        /* 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);
@@ -1052,6 +1066,12 @@ taskq_destroy(taskq_t *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
index ab9830d1867a04ea6577d534110d6f41a229b85c..4d690b52f9cb967026a6557eec6cb9919740a7f5 100644 (file)
@@ -353,7 +353,8 @@ spl_kern_path_locked(const char *name, struct path *path)
        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)) {
diff --git a/module/spl/spl.mod.c b/module/spl/spl.mod.c
deleted file mode 100644 (file)
index 9145049..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-#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");
index 284f77370d37dc245dd2982ac947e362bce12347..c17eb07ba5c0ba62b499d16cc8ce54744d9b7620 100644 (file)
 #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"
@@ -580,19 +584,65 @@ splat_rwlock_test6(struct file *file, void *arg)
        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;
@@ -600,7 +650,7 @@ splat_rwlock_test6(struct file *file, void *arg)
        }
 
        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));
@@ -608,13 +658,8 @@ splat_rwlock_test6(struct file *file, void *arg)
        }
 
        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);
@@ -652,6 +697,8 @@ splat_rwlock_init(void)
                      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;
 }
@@ -660,6 +707,7 @@ void
 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);
diff --git a/module/splat/splat.mod.c b/module/splat/splat.mod.c
deleted file mode 100644 (file)
index d20b6a5..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-#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");
index f73d8ecbeea86f9f5dab6e484e41a8bee5fdcb10..19ddc9f05f83300e11a4dc7e10d0146a1ad67139 100644 (file)
@@ -162,6 +162,18 @@ chmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/*/*
 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
index dcac68eac48a58e9524cf9a703fde6a979e21e0a..194241a58405f8cbb3b4947af08bc17f58d46472 100644 (file)
@@ -33,6 +33,18 @@ make install DESTDIR=%{?buildroot}
 %{_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
index dcac68eac48a58e9524cf9a703fde6a979e21e0a..194241a58405f8cbb3b4947af08bc17f58d46472 100644 (file)
@@ -33,6 +33,18 @@ make install DESTDIR=%{?buildroot}
 %{_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
index cfd94db79c4496b79a0b3f5fbc6114ec3340fd7f..cfd6d8c2ad2a98c3963976926a244e2771db2245 100644 (file)
@@ -60,6 +60,9 @@
 /* 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