Imported Upstream version 0.6.5.5

This commit is contained in:
Aron Xu 2016-03-20 22:50:19 +08:00
parent 879bbbc725
commit 81dab2ed9a
12 changed files with 118 additions and 39 deletions

2
META
View File

@ -1,7 +1,7 @@
Meta: 1 Meta: 1
Name: spl Name: spl
Branch: 1.0 Branch: 1.0
Version: 0.6.5.4 Version: 0.6.5.5
Release: 1 Release: 1
Release-Tags: relext Release-Tags: relext
License: GPL License: GPL

20
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.68 for spl 0.6.5.4. # Generated by GNU Autoconf 2.68 for spl 0.6.5.5.
# #
# #
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@ -567,8 +567,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='spl' PACKAGE_NAME='spl'
PACKAGE_TARNAME='spl' PACKAGE_TARNAME='spl'
PACKAGE_VERSION='0.6.5.4' PACKAGE_VERSION='0.6.5.5'
PACKAGE_STRING='spl 0.6.5.4' PACKAGE_STRING='spl 0.6.5.5'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' 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. # 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. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures spl 0.6.5.4 to adapt to many kinds of systems. \`configure' configures spl 0.6.5.5 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1428,7 +1428,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of spl 0.6.5.4:";; short | recursive ) echo "Configuration of spl 0.6.5.5:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1545,7 +1545,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
spl configure 0.6.5.4 spl configure 0.6.5.5
generated by GNU Autoconf 2.68 generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2010 Free Software Foundation, Inc.
@ -1823,7 +1823,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by spl $as_me 0.6.5.4, which was It was created by spl $as_me 0.6.5.5, which was
generated by GNU Autoconf 2.68. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@ $ $0 $@
@ -2947,7 +2947,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='spl' PACKAGE='spl'
VERSION='0.6.5.4' VERSION='0.6.5.5'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -17462,7 +17462,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by spl $as_me 0.6.5.4, which was This file was extended by spl $as_me 0.6.5.5, which was
generated by GNU Autoconf 2.68. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -17528,7 +17528,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
spl config.status 0.6.5.4 spl config.status 0.6.5.5
configured by $0, generated by GNU Autoconf 2.68, configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -116,7 +116,7 @@ add_after()
add_after "$KERNEL_DIR/Kconfig" 'source "arch/$SRCARCH/Kconfig"' 'source "spl/Kconfig"' add_after "$KERNEL_DIR/Kconfig" 'source "arch/$SRCARCH/Kconfig"' 'source "spl/Kconfig"'
# We must take care to build SPL before ZFS, otherwise the symbols required # We must take care to build SPL before ZFS, otherwise the symbols required
# to link ZFS will not be available. # to link ZFS will not be available.
sed -i 's#+= kernel/#+= kernel/ spl/#' "$KERNEL_DIR/Makefile" sed -i 's~mm/ fs/~mm/ spl/ fs/~' "$KERNEL_DIR/Makefile"
echo >&2 echo >&2
echo " $0: done." >&2 echo " $0: done." >&2

View File

@ -78,14 +78,20 @@ typedef struct {
unsigned int saved_flags; unsigned int saved_flags;
} fstrans_cookie_t; } fstrans_cookie_t;
#ifdef PF_MEMALLOC_NOIO
#define SPL_FSTRANS (PF_FSTRANS|PF_MEMALLOC_NOIO)
#else
#define SPL_FSTRANS (PF_FSTRANS)
#endif
static inline fstrans_cookie_t static inline fstrans_cookie_t
spl_fstrans_mark(void) spl_fstrans_mark(void)
{ {
fstrans_cookie_t cookie; fstrans_cookie_t cookie;
cookie.fstrans_thread = current; cookie.fstrans_thread = current;
cookie.saved_flags = current->flags & PF_FSTRANS; cookie.saved_flags = current->flags & SPL_FSTRANS;
current->flags |= PF_FSTRANS; current->flags |= SPL_FSTRANS;
return (cookie); return (cookie);
} }
@ -94,9 +100,9 @@ static inline void
spl_fstrans_unmark(fstrans_cookie_t cookie) spl_fstrans_unmark(fstrans_cookie_t cookie)
{ {
ASSERT3P(cookie.fstrans_thread, ==, current); ASSERT3P(cookie.fstrans_thread, ==, current);
ASSERT(current->flags & PF_FSTRANS); ASSERT((current->flags & SPL_FSTRANS) == SPL_FSTRANS);
current->flags &= ~(PF_FSTRANS); current->flags &= ~SPL_FSTRANS;
current->flags |= cookie.saved_flags; current->flags |= cookie.saved_flags;
} }

View File

@ -58,7 +58,6 @@ typedef longlong_t diskaddr_t;
typedef ushort_t o_mode_t; typedef ushort_t o_mode_t;
typedef uint_t major_t; typedef uint_t major_t;
typedef uint_t minor_t; typedef uint_t minor_t;
typedef ulong_t pfn_t;
typedef ulong_t pgcnt_t; typedef ulong_t pgcnt_t;
typedef long spgcnt_t; typedef long spgcnt_t;
typedef short index_t; typedef short index_t;

View File

@ -80,6 +80,7 @@ static void
cv_wait_common(kcondvar_t *cvp, kmutex_t *mp, int state, int io) cv_wait_common(kcondvar_t *cvp, kmutex_t *mp, int state, int io)
{ {
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
kmutex_t *m;
ASSERT(cvp); ASSERT(cvp);
ASSERT(mp); ASSERT(mp);
@ -87,11 +88,11 @@ cv_wait_common(kcondvar_t *cvp, kmutex_t *mp, int state, int io)
ASSERT(mutex_owned(mp)); ASSERT(mutex_owned(mp));
atomic_inc(&cvp->cv_refs); atomic_inc(&cvp->cv_refs);
if (cvp->cv_mutex == NULL) m = ACCESS_ONCE(cvp->cv_mutex);
cvp->cv_mutex = mp; if (!m)
m = xchg(&cvp->cv_mutex, mp);
/* Ensure the same mutex is used by all callers */ /* Ensure the same mutex is used by all callers */
ASSERT(cvp->cv_mutex == mp); ASSERT(m == NULL || m == mp);
prepare_to_wait_exclusive(&cvp->cv_event, &wait, state); prepare_to_wait_exclusive(&cvp->cv_event, &wait, state);
atomic_inc(&cvp->cv_waiters); atomic_inc(&cvp->cv_waiters);
@ -106,16 +107,25 @@ cv_wait_common(kcondvar_t *cvp, kmutex_t *mp, int state, int io)
io_schedule(); io_schedule();
else else
schedule(); schedule();
mutex_enter(mp);
/* No more waiters a different mutex could be used */ /* No more waiters a different mutex could be used */
if (atomic_dec_and_test(&cvp->cv_waiters)) { if (atomic_dec_and_test(&cvp->cv_waiters)) {
/*
* This is set without any lock, so it's racy. But this is
* just for debug anyway, so make it best-effort
*/
cvp->cv_mutex = NULL; cvp->cv_mutex = NULL;
wake_up(&cvp->cv_destroy); wake_up(&cvp->cv_destroy);
} }
finish_wait(&cvp->cv_event, &wait); finish_wait(&cvp->cv_event, &wait);
atomic_dec(&cvp->cv_refs); atomic_dec(&cvp->cv_refs);
/*
* Hold mutex after we release the cvp, otherwise we could dead lock
* with a thread holding the mutex and call cv_destroy.
*/
mutex_enter(mp);
} }
void void
@ -148,6 +158,7 @@ __cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
int state) int state)
{ {
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
kmutex_t *m;
clock_t time_left; clock_t time_left;
ASSERT(cvp); ASSERT(cvp);
@ -156,15 +167,16 @@ __cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
ASSERT(mutex_owned(mp)); ASSERT(mutex_owned(mp));
atomic_inc(&cvp->cv_refs); atomic_inc(&cvp->cv_refs);
if (cvp->cv_mutex == NULL) m = ACCESS_ONCE(cvp->cv_mutex);
cvp->cv_mutex = mp; if (!m)
m = xchg(&cvp->cv_mutex, mp);
/* Ensure the same mutex is used by all callers */ /* Ensure the same mutex is used by all callers */
ASSERT(cvp->cv_mutex == mp); ASSERT(m == NULL || m == mp);
/* XXX - Does not handle jiffie wrap properly */ /* XXX - Does not handle jiffie wrap properly */
time_left = expire_time - jiffies; time_left = expire_time - jiffies;
if (time_left <= 0) { if (time_left <= 0) {
/* XXX - doesn't reset cv_mutex */
atomic_dec(&cvp->cv_refs); atomic_dec(&cvp->cv_refs);
return (-1); return (-1);
} }
@ -179,10 +191,13 @@ __cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
*/ */
mutex_exit(mp); mutex_exit(mp);
time_left = schedule_timeout(time_left); time_left = schedule_timeout(time_left);
mutex_enter(mp);
/* No more waiters a different mutex could be used */ /* No more waiters a different mutex could be used */
if (atomic_dec_and_test(&cvp->cv_waiters)) { if (atomic_dec_and_test(&cvp->cv_waiters)) {
/*
* This is set without any lock, so it's racy. But this is
* just for debug anyway, so make it best-effort
*/
cvp->cv_mutex = NULL; cvp->cv_mutex = NULL;
wake_up(&cvp->cv_destroy); wake_up(&cvp->cv_destroy);
} }
@ -190,6 +205,11 @@ __cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time,
finish_wait(&cvp->cv_event, &wait); finish_wait(&cvp->cv_event, &wait);
atomic_dec(&cvp->cv_refs); atomic_dec(&cvp->cv_refs);
/*
* Hold mutex after we release the cvp, otherwise we could dead lock
* with a thread holding the mutex and call cv_destroy.
*/
mutex_enter(mp);
return (time_left > 0 ? time_left : -1); return (time_left > 0 ? time_left : -1);
} }
@ -216,6 +236,7 @@ __cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t expire_time,
int state) int state)
{ {
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
kmutex_t *m;
hrtime_t time_left, now; hrtime_t time_left, now;
unsigned long time_left_us; unsigned long time_left_us;
@ -225,11 +246,11 @@ __cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t expire_time,
ASSERT(mutex_owned(mp)); ASSERT(mutex_owned(mp));
atomic_inc(&cvp->cv_refs); atomic_inc(&cvp->cv_refs);
if (cvp->cv_mutex == NULL) m = ACCESS_ONCE(cvp->cv_mutex);
cvp->cv_mutex = mp; if (!m)
m = xchg(&cvp->cv_mutex, mp);
/* Ensure the same mutex is used by all callers */ /* Ensure the same mutex is used by all callers */
ASSERT(cvp->cv_mutex == mp); ASSERT(m == NULL || m == mp);
now = gethrtime(); now = gethrtime();
time_left = expire_time - now; time_left = expire_time - now;
@ -253,10 +274,13 @@ __cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t expire_time,
* interrupts * interrupts
*/ */
usleep_range(time_left_us, time_left_us + 100); usleep_range(time_left_us, time_left_us + 100);
mutex_enter(mp);
/* No more waiters a different mutex could be used */ /* No more waiters a different mutex could be used */
if (atomic_dec_and_test(&cvp->cv_waiters)) { if (atomic_dec_and_test(&cvp->cv_waiters)) {
/*
* This is set without any lock, so it's racy. But this is
* just for debug anyway, so make it best-effort
*/
cvp->cv_mutex = NULL; cvp->cv_mutex = NULL;
wake_up(&cvp->cv_destroy); wake_up(&cvp->cv_destroy);
} }
@ -264,6 +288,7 @@ __cv_timedwait_hires(kcondvar_t *cvp, kmutex_t *mp, hrtime_t expire_time,
finish_wait(&cvp->cv_event, &wait); finish_wait(&cvp->cv_event, &wait);
atomic_dec(&cvp->cv_refs); atomic_dec(&cvp->cv_refs);
mutex_enter(mp);
time_left = expire_time - gethrtime(); time_left = expire_time - gethrtime();
return (time_left > 0 ? time_left : -1); return (time_left > 0 ? time_left : -1);
} }

View File

@ -1630,16 +1630,11 @@ spl_kmem_cache_reap_now(spl_kmem_cache_t *skc, int count)
atomic_inc(&skc->skc_ref); atomic_inc(&skc->skc_ref);
/* /*
* Execute the registered reclaim callback if it exists. The * Execute the registered reclaim callback if it exists.
* per-cpu caches will be drained when is set KMC_EXPIRE_MEM.
*/ */
if (skc->skc_flags & KMC_SLAB) { if (skc->skc_flags & KMC_SLAB) {
if (skc->skc_reclaim) if (skc->skc_reclaim)
skc->skc_reclaim(skc->skc_private); skc->skc_reclaim(skc->skc_private);
if (spl_kmem_cache_expire & KMC_EXPIRE_MEM)
kmem_cache_shrink(skc->skc_linux_cache);
goto out; goto out;
} }

View File

@ -88,6 +88,9 @@ splat_condvar_test12_thread(void *arg)
ct->ct_thread->comm, atomic_read(&cv->cv_condvar.cv_waiters)); ct->ct_thread->comm, atomic_read(&cv->cv_condvar.cv_waiters));
mutex_exit(&cv->cv_mtx); mutex_exit(&cv->cv_mtx);
/* wait for main thread reap us */
while (!kthread_should_stop())
schedule();
return 0; return 0;
} }
@ -151,6 +154,12 @@ splat_condvar_test1(struct file *file, void *arg)
/* Wake everything for the failure case */ /* Wake everything for the failure case */
cv_broadcast(&cv.cv_condvar); cv_broadcast(&cv.cv_condvar);
cv_destroy(&cv.cv_condvar); cv_destroy(&cv.cv_condvar);
/* wait for threads to exit */
for (i = 0; i < SPLAT_CONDVAR_TEST_COUNT; i++) {
if (!IS_ERR(ct[i].ct_thread))
kthread_stop(ct[i].ct_thread);
}
mutex_destroy(&cv.cv_mtx); mutex_destroy(&cv.cv_mtx);
return rc; return rc;
@ -199,6 +208,12 @@ splat_condvar_test2(struct file *file, void *arg)
/* Wake everything for the failure case */ /* Wake everything for the failure case */
cv_destroy(&cv.cv_condvar); cv_destroy(&cv.cv_condvar);
/* wait for threads to exit */
for (i = 0; i < SPLAT_CONDVAR_TEST_COUNT; i++) {
if (!IS_ERR(ct[i].ct_thread))
kthread_stop(ct[i].ct_thread);
}
mutex_destroy(&cv.cv_mtx); mutex_destroy(&cv.cv_mtx);
return rc; return rc;
@ -234,6 +249,9 @@ splat_condvar_test34_thread(void *arg)
mutex_exit(&cv->cv_mtx); mutex_exit(&cv->cv_mtx);
/* wait for main thread reap us */
while (!kthread_should_stop())
schedule();
return 0; return 0;
} }
@ -302,6 +320,12 @@ splat_condvar_test3(struct file *file, void *arg)
/* Wake everything for the failure case */ /* Wake everything for the failure case */
cv_broadcast(&cv.cv_condvar); cv_broadcast(&cv.cv_condvar);
cv_destroy(&cv.cv_condvar); cv_destroy(&cv.cv_condvar);
/* wait for threads to exit */
for (i = 0; i < SPLAT_CONDVAR_TEST_COUNT; i++) {
if (!IS_ERR(ct[i].ct_thread))
kthread_stop(ct[i].ct_thread);
}
mutex_destroy(&cv.cv_mtx); mutex_destroy(&cv.cv_mtx);
return rc; return rc;
@ -372,6 +396,12 @@ splat_condvar_test4(struct file *file, void *arg)
/* Wake everything for the failure case */ /* Wake everything for the failure case */
cv_broadcast(&cv.cv_condvar); cv_broadcast(&cv.cv_condvar);
cv_destroy(&cv.cv_condvar); cv_destroy(&cv.cv_condvar);
/* wait for threads to exit */
for (i = 0; i < SPLAT_CONDVAR_TEST_COUNT; i++) {
if (!IS_ERR(ct[i].ct_thread))
kthread_stop(ct[i].ct_thread);
}
mutex_destroy(&cv.cv_mtx); mutex_destroy(&cv.cv_mtx);
return rc; return rc;

View File

@ -152,6 +152,8 @@ for kernel_version in %{?kernel_versions}; do
INSTALL_MOD_DIR=%{kmodinstdir_postfix} INSTALL_MOD_DIR=%{kmodinstdir_postfix}
cd .. cd ..
done done
# find-debuginfo.sh only considers executables
chmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/*/* chmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/*/*
%{?akmod_install} %{?akmod_install}
@ -160,6 +162,13 @@ chmod u+x ${RPM_BUILD_ROOT}%{kmodinstdir_prefix}/*/extra/*/*/*
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
%changelog %changelog
* Wed Mar 9 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.5-1
- Linux 4.5 compatibility zfsonlinux/spl#524
- Create working debuginfo packages on Red Hat zfsonlinux/zfs#4224
- Allow copy-builtin to run multiple times zfsonlinux/spl#526
- Use safer flags for in-kernel memory allocations zfsonlinux/spl#523
- Fix potential deadlock in cv_wait() zfsonlinux/zfs#4106
- Fix livelock in shrinker zfsonlinux/zfs#3936
* Fri Jan 8 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.4-1 * Fri Jan 8 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.4-1
- Build fixes on SPARC and some kernels - Build fixes on SPARC and some kernels
- Fix taskq dynamic spawning deadlock - Fix taskq dynamic spawning deadlock

View File

@ -38,6 +38,13 @@ make install DESTDIR=%{?buildroot}
%{_mandir}/man5/* %{_mandir}/man5/*
%changelog %changelog
* Wed Mar 9 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.5-1
- Linux 4.5 compatibility zfsonlinux/spl#524
- Create working debuginfo packages on Red Hat zfsonlinux/zfs#4224
- Allow copy-builtin to run multiple times zfsonlinux/spl#526
- Use safer flags for in-kernel memory allocations zfsonlinux/spl#523
- Fix potential deadlock in cv_wait() zfsonlinux/zfs#4106
- Fix livelock in shrinker zfsonlinux/zfs#3936
* Fri Jan 8 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.4-1 * Fri Jan 8 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.4-1
- Build fixes on SPARC and some kernels - Build fixes on SPARC and some kernels
- Fix taskq dynamic spawning deadlock - Fix taskq dynamic spawning deadlock

View File

@ -27,7 +27,6 @@ This package contains the kernel modules required to emulate
several interfaces provided by the Solaris kernel. several interfaces provided by the Solaris kernel.
%define kmod_name spl %define kmod_name spl
%define debug_package %{nil}
%kernel_module_package -n %{kmod_name} -p %{_sourcedir}/kmod-preamble %kernel_module_package -n %{kmod_name} -p %{_sourcedir}/kmod-preamble
@ -96,6 +95,8 @@ make install \
DESTDIR=${RPM_BUILD_ROOT} \ DESTDIR=${RPM_BUILD_ROOT} \
INSTALL_MOD_DIR=extra/%{kmod_name} INSTALL_MOD_DIR=extra/%{kmod_name}
%{__rm} -f %{buildroot}/lib/modules/%{kverrel}/modules.* %{__rm} -f %{buildroot}/lib/modules/%{kverrel}/modules.*
# find-debuginfo.sh only considers executables
%{__chmod} u+x %{buildroot}/lib/modules/%{kverrel}/extra/*/*/*
%clean %clean
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT

View File

@ -38,6 +38,13 @@ make install DESTDIR=%{?buildroot}
%{_mandir}/man5/* %{_mandir}/man5/*
%changelog %changelog
* Wed Mar 9 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.5-1
- Linux 4.5 compatibility zfsonlinux/spl#524
- Create working debuginfo packages on Red Hat zfsonlinux/zfs#4224
- Allow copy-builtin to run multiple times zfsonlinux/spl#526
- Use safer flags for in-kernel memory allocations zfsonlinux/spl#523
- Fix potential deadlock in cv_wait() zfsonlinux/zfs#4106
- Fix livelock in shrinker zfsonlinux/zfs#3936
* Fri Jan 8 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.4-1 * Fri Jan 8 2016 Ned Bass <bass6@llnl.gov> - 0.6.5.4-1
- Build fixes on SPARC and some kernels - Build fixes on SPARC and some kernels
- Fix taskq dynamic spawning deadlock - Fix taskq dynamic spawning deadlock