From 307e735e4cc6806f476deb983d6ffa42dcb69f1c Mon Sep 17 00:00:00 2001 From: Colin Ian King Date: Wed, 9 Aug 2017 17:16:31 +0100 Subject: [PATCH] UBUNTU: SAUCE: (noup) Update spl to 0.6.5.11-ubuntu1, zfs to 0.6.5.11-1ubuntu3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This includes backports of upstream 4.13 compat fixes from ZFS and SPL SPL: 120faefed90a ("Update struct member intializers to C89") 944117514d2a ("Linux 4.13 compat: wait queues") ZFS: 36ba27e9e07b ("Linux 4.13 compat: bio->bi_status and blk_status_t") Signed-off-by: Colin Ian King Signed-off-by: Seth Forshee ported SPL parts for spl-module submodule Signed-off-by: Fabian Grünbichler --- include/linux/wait_compat.h | 9 ++ include/sys/condvar.h | 6 +- include/sys/kmem_cache.h | 2 +- include/sys/taskq.h | 7 +- spl_config.h.in | 6 + module/spl/spl-proc.c | 10 +- module/splat/splat-atomic.c | 3 +- module/splat/splat-kmem.c | 4 +- module/splat/splat-rwlock.c | 2 +- module/splat/splat-thread.c | 3 +- config/spl-build.m4 | 55 +++++++++ configure | 264 ++++++++++++++++++++++++++++++++++++++++ 12 files changed, 354 insertions(+), 17 deletions(-) diff --git a/include/linux/wait_compat.h b/include/linux/wait_compat.h index d8cd09b9eb08..445a73c68fa1 100644 --- a/include/linux/wait_compat.h +++ b/include/linux/wait_compat.h @@ -26,6 +26,7 @@ #define _SPL_WAIT_COMPAT_H #include +#include #ifndef HAVE_WAIT_ON_BIT_ACTION # define spl_wait_on_bit(word, bit, mode) wait_on_bit(word, bit, mode) @@ -43,4 +44,12 @@ spl_bit_wait(void *word) #endif /* HAVE_WAIT_ON_BIT_ACTION */ +#ifdef HAVE_WAIT_QUEUE_ENTRY_T +typedef wait_queue_head_t spl_wait_queue_head_t; +typedef wait_queue_entry_t spl_wait_queue_entry_t; +#else +typedef wait_queue_head_t spl_wait_queue_head_t; +typedef wait_queue_t spl_wait_queue_entry_t; +#endif + #endif /* SPL_WAIT_COMPAT_H */ diff --git a/include/sys/condvar.h b/include/sys/condvar.h index efcf0dda2769..8a4aab44b5ab 100644 --- a/include/sys/condvar.h +++ b/include/sys/condvar.h @@ -26,7 +26,7 @@ #define _SPL_CONDVAR_H #include -#include +#include #include #include #include @@ -41,8 +41,8 @@ typedef struct { int cv_magic; - wait_queue_head_t cv_event; - wait_queue_head_t cv_destroy; + spl_wait_queue_head_t cv_event; + spl_wait_queue_head_t cv_destroy; atomic_t cv_refs; atomic_t cv_waiters; kmutex_t *cv_mutex; diff --git a/include/sys/kmem_cache.h b/include/sys/kmem_cache.h index e971c2b0d952..8fa14f67e73f 100644 --- a/include/sys/kmem_cache.h +++ b/include/sys/kmem_cache.h @@ -193,7 +193,7 @@ typedef struct spl_kmem_cache { struct list_head skc_partial_list; /* Partially alloc'ed */ struct rb_root skc_emergency_tree; /* Min sized objects */ spinlock_t skc_lock; /* Cache lock */ - wait_queue_head_t skc_waitq; /* Allocation waiters */ + spl_wait_queue_head_t skc_waitq; /* Allocation waiters */ uint64_t skc_slab_fail; /* Slab alloc failures */ uint64_t skc_slab_create; /* Slab creates */ uint64_t skc_slab_destroy; /* Slab destroys */ diff --git a/include/sys/taskq.h b/include/sys/taskq.h index a43a86da6514..fa4b2703e462 100644 --- a/include/sys/taskq.h +++ b/include/sys/taskq.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -79,13 +80,13 @@ typedef struct taskq { struct list_head tq_pend_list; /* pending task_t's */ struct list_head tq_prio_list; /* priority pending task_t's */ struct list_head tq_delay_list; /* delayed task_t's */ - wait_queue_head_t tq_work_waitq; /* new work waitq */ - wait_queue_head_t tq_wait_waitq; /* wait waitq */ + spl_wait_queue_head_t tq_work_waitq; /* new work waitq */ + spl_wait_queue_head_t tq_wait_waitq; /* wait waitq */ } taskq_t; typedef struct taskq_ent { spinlock_t tqent_lock; - wait_queue_head_t tqent_waitq; + spl_wait_queue_head_t tqent_waitq; struct timer_list tqent_timer; struct list_head tqent_list; taskqid_t tqent_id; diff --git a/spl_config.h.in b/spl_config.h.in index 7cd020be1151..52b110fdba88 100644 --- a/spl_config.h.in +++ b/spl_config.h.in @@ -144,6 +144,12 @@ /* yes */ #undef HAVE_WAIT_ON_BIT_ACTION +/* wait_queue_entry_t exists */ +#undef HAVE_WAIT_QUEUE_ENTRY_T + +/* wq_head->head and wq_entry->entry exist */ +#undef HAVE_WAIT_QUEUE_HEAD_ENTRY + /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index eb00505d6ee8..08ca974145f3 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -402,11 +402,11 @@ static struct ctl_table spl_kmem_table[] = { .mode = 0444, .proc_handler = &proc_doslab, }, - {0}, + {}, }; static struct ctl_table spl_kstat_table[] = { - {0}, + {}, }; static struct ctl_table spl_table[] = { @@ -437,7 +437,7 @@ static struct ctl_table spl_table[] = { .mode = 0555, .child = spl_kstat_table, }, - { 0 }, + {}, }; static struct ctl_table spl_dir[] = { @@ -446,7 +446,7 @@ static struct ctl_table spl_dir[] = { .mode = 0555, .child = spl_table, }, - { 0 } + {} }; static struct ctl_table spl_root[] = { @@ -458,7 +458,7 @@ static struct ctl_table spl_root[] = { .mode = 0555, .child = spl_dir, }, - { 0 } + {} }; int diff --git a/module/splat/splat-atomic.c b/module/splat/splat-atomic.c index 999f4f058767..b0a8c70615b7 100644 --- a/module/splat/splat-atomic.c +++ b/module/splat/splat-atomic.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "splat-internal.h" @@ -55,7 +56,7 @@ typedef struct atomic_priv { unsigned long ap_magic; struct file *ap_file; kmutex_t ap_lock; - wait_queue_head_t ap_waitq; + spl_wait_queue_head_t ap_waitq; volatile uint64_t ap_atomic; volatile uint64_t ap_atomic_exited; atomic_op_t ap_op; diff --git a/module/splat/splat-kmem.c b/module/splat/splat-kmem.c index b3fd1a84dc87..b9b566f3e3da 100644 --- a/module/splat/splat-kmem.c +++ b/module/splat/splat-kmem.c @@ -275,8 +275,8 @@ typedef struct kmem_cache_priv { struct file *kcp_file; kmem_cache_t *kcp_cache; spinlock_t kcp_lock; - wait_queue_head_t kcp_ctl_waitq; - wait_queue_head_t kcp_thr_waitq; + spl_wait_queue_head_t kcp_ctl_waitq; + spl_wait_queue_head_t kcp_thr_waitq; int kcp_flags; int kcp_kct_count; kmem_cache_thread_t *kcp_kct[SPLAT_KMEM_THREADS]; diff --git a/module/splat/splat-rwlock.c b/module/splat/splat-rwlock.c index 4576f20c7d00..7abb19d1c87c 100644 --- a/module/splat/splat-rwlock.c +++ b/module/splat/splat-rwlock.c @@ -76,7 +76,7 @@ typedef struct rw_priv { struct file *rw_file; krwlock_t rw_rwlock; spinlock_t rw_lock; - wait_queue_head_t rw_waitq; + spl_wait_queue_head_t rw_waitq; int rw_completed; int rw_holders; int rw_waiters; diff --git a/module/splat/splat-thread.c b/module/splat/splat-thread.c index 8a44714078d4..dcf7d4a98788 100644 --- a/module/splat/splat-thread.c +++ b/module/splat/splat-thread.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "splat-internal.h" @@ -54,7 +55,7 @@ typedef struct thread_priv { unsigned long tp_magic; struct file *tp_file; spinlock_t tp_lock; - wait_queue_head_t tp_waitq; + spl_wait_queue_head_t tp_waitq; uint_t tp_keys[SPLAT_THREAD_TEST_KEYS]; int tp_rc; int tp_count; diff --git a/config/spl-build.m4 b/config/spl-build.m4 index d5849635acfc..603fc65ec356 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -52,6 +52,8 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ SPL_AC_INODE_LOCK SPL_AC_MUTEX_OWNER SPL_AC_GROUP_INFO_GID + SPL_AC_WAIT_QUEUE_ENTRY_T + SPL_AC_WAIT_QUEUE_HEAD_ENTRY ]) AC_DEFUN([SPL_AC_MODULE_SYMVERS], [ @@ -1632,3 +1634,56 @@ AC_DEFUN([SPL_AC_GROUP_INFO_GID], [ ]) EXTRA_KCFLAGS="$tmp_flags" ]) + +dnl # +dnl # 4.13 API change +dnl # Renamed struct wait_queue -> struct wait_queue_entry. +dnl # +AC_DEFUN([SPL_AC_WAIT_QUEUE_ENTRY_T], [ + AC_MSG_CHECKING([whether wait_queue_entry_t exists]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + wait_queue_entry_t *entry __attribute__ ((unused)); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_WAIT_QUEUE_ENTRY_T, 1, + [wait_queue_entry_t exists]) + ],[ + AC_MSG_RESULT(no) + ]) +]) + +dnl # +dnl # 4.13 API change +dnl # Renamed wait_queue_head::task_list -> wait_queue_head::head +dnl # Renamed wait_queue_entry::task_list -> wait_queue_entry::entry +dnl # +AC_DEFUN([SPL_AC_WAIT_QUEUE_HEAD_ENTRY], [ + AC_MSG_CHECKING([whether wq_head->head and wq_entry->entry exist]) + SPL_LINUX_TRY_COMPILE([ + #include + + #ifdef HAVE_WAIT_QUEUE_ENTRY_T + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_entry_t spl_wait_queue_entry_t; + #else + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_t spl_wait_queue_entry_t; + #endif + ],[ + spl_wait_queue_head_t wq_head; + spl_wait_queue_entry_t wq_entry; + struct list_head *head __attribute__ ((unused)); + struct list_head *entry __attribute__ ((unused)); + + head = &wq_head.head; + entry = &wq_entry.entry; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_WAIT_QUEUE_HEAD_ENTRY, 1, + [wq_head->head and wq_entry->entry exist]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/configure b/configure index df103800f919..608eff9beffa 100755 --- a/configure +++ b/configure @@ -15367,6 +15367,138 @@ fi EXTRA_KCFLAGS="$tmp_flags" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wait_queue_entry_t exists" >&5 +$as_echo_n "checking whether wait_queue_entry_t exists... " >&6; } + + +cat confdefs.h - <<_ACEOF >conftest.c + + + #include + +int +main (void) +{ + + wait_queue_entry_t *entry __attribute__ ((unused)); + + ; + 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_WAIT_QUEUE_ENTRY_T 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 wq_head->head and wq_entry->entry exist" >&5 +$as_echo_n "checking whether wq_head->head and wq_entry->entry exist... " >&6; } + + +cat confdefs.h - <<_ACEOF >conftest.c + + + #include + + #ifdef HAVE_WAIT_QUEUE_ENTRY_T + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_entry_t spl_wait_queue_entry_t; + #else + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_t spl_wait_queue_entry_t; + #endif + +int +main (void) +{ + + spl_wait_queue_head_t wq_head; + spl_wait_queue_entry_t wq_entry; + struct list_head *head __attribute__ ((unused)); + struct list_head *entry __attribute__ ((unused)); + + head = &wq_head.head; + entry = &wq_entry.entry; + + ; + 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_WAIT_QUEUE_HEAD_ENTRY 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 + + + ;; user) ;; all) @@ -18353,6 +18485,138 @@ fi EXTRA_KCFLAGS="$tmp_flags" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wait_queue_entry_t exists" >&5 +$as_echo_n "checking whether wait_queue_entry_t exists... " >&6; } + + +cat confdefs.h - <<_ACEOF >conftest.c + + + #include + +int +main (void) +{ + + wait_queue_entry_t *entry __attribute__ ((unused)); + + ; + 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_WAIT_QUEUE_ENTRY_T 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 wq_head->head and wq_entry->entry exist" >&5 +$as_echo_n "checking whether wq_head->head and wq_entry->entry exist... " >&6; } + + +cat confdefs.h - <<_ACEOF >conftest.c + + + #include + + #ifdef HAVE_WAIT_QUEUE_ENTRY_T + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_entry_t spl_wait_queue_entry_t; + #else + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_t spl_wait_queue_entry_t; + #endif + +int +main (void) +{ + + spl_wait_queue_head_t wq_head; + spl_wait_queue_entry_t wq_entry; + struct list_head *head __attribute__ ((unused)); + struct list_head *entry __attribute__ ((unused)); + + head = &wq_head.head; + entry = &wq_entry.entry; + + ; + 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_WAIT_QUEUE_HEAD_ENTRY 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 + + + + ;; srpm) ;; *) -- 2.14.1