--- /dev/null
+From 307e735e4cc6806f476deb983d6ffa42dcb69f1c Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king@canonical.com>
+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 <colin.king@canonical.com>
+Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
+
+ported SPL parts for spl-module submodule
+
+Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
+---
+ 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 <linux/sched.h>
++#include <linux/wait.h>
+
+ #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 <linux/module.h>
+-#include <linux/wait.h>
++#include <linux/wait_compat.h>
+ #include <linux/delay_compat.h>
+ #include <sys/kmem.h>
+ #include <sys/mutex.h>
+@@ -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 <linux/slab.h>
+ #include <linux/interrupt.h>
+ #include <linux/kthread.h>
++#include <linux/wait_compat.h>
+ #include <sys/types.h>
+ #include <sys/thread.h>
+
+@@ -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 <sys/thread.h>
+ #include <sys/mutex.h>
+ #include <linux/mm_compat.h>
++#include <linux/wait_compat.h>
+ #include <linux/slab.h>
+ #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 <sys/random.h>
+ #include <linux/delay.h>
+ #include <linux/mm_compat.h>
++#include <linux/wait_compat.h>
+ #include <linux/slab.h>
+ #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 <linux/wait.h>
++ ],[
++ 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 <linux/wait.h>
++
++ #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 <linux/wait.h>
++
++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 <linux/wait.h>
++
++ #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 <linux/wait.h>
++
++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 <linux/wait.h>
++
++ #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
+
--- /dev/null
+From 307e735e4cc6806f476deb983d6ffa42dcb69f1c Mon Sep 17 00:00:00 2001
+From: Colin Ian King <colin.king@canonical.com>
+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 <colin.king@canonical.com>
+Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
+Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
+---
+ include/linux/blkdev_compat.h | 92 +++++++++++++++++++++-
+ zfs_config.h.in | 3 +
+ module/zfs/vdev_disk.c | 11 +--
+ config/kernel-bio-end-io-t-args.m4 | 22 ++++++
+ config/kernel.m4 | 1 +
+ configure | 136 +++++++++++++++++++++++++++++++++
+ 6 files changed, 259 insertions(+), 6 deletions(-)
+
+diff --git a/include/linux/blkdev_compat.h b/include/linux/blkdev_compat.h
+index 871506d7c924..f3054a375e0d 100644
+--- a/include/linux/blkdev_compat.h
++++ b/include/linux/blkdev_compat.h
+@@ -208,14 +208,104 @@ bio_set_flags_failfast(struct block_device *bdev, int *flags)
+ #define DISK_NAME_LEN 32
+ #endif /* DISK_NAME_LEN */
+
++#ifdef HAVE_BIO_BI_STATUS
++static inline int
++bi_status_to_errno(blk_status_t status)
++{
++ switch (status) {
++ case BLK_STS_OK:
++ return (0);
++ case BLK_STS_NOTSUPP:
++ return (EOPNOTSUPP);
++ case BLK_STS_TIMEOUT:
++ return (ETIMEDOUT);
++ case BLK_STS_NOSPC:
++ return (ENOSPC);
++ case BLK_STS_TRANSPORT:
++ return (ENOLINK);
++ case BLK_STS_TARGET:
++ return (EREMOTEIO);
++ case BLK_STS_NEXUS:
++ return (EBADE);
++ case BLK_STS_MEDIUM:
++ return (ENODATA);
++ case BLK_STS_PROTECTION:
++ return (EILSEQ);
++ case BLK_STS_RESOURCE:
++ return (ENOMEM);
++ case BLK_STS_AGAIN:
++ return (EAGAIN);
++ case BLK_STS_IOERR:
++ return (EIO);
++ default:
++ return (EIO);
++ }
++}
++
++static inline blk_status_t
++errno_to_bi_status(int error)
++{
++ switch (error) {
++ case 0:
++ return (BLK_STS_OK);
++ case EOPNOTSUPP:
++ return (BLK_STS_NOTSUPP);
++ case ETIMEDOUT:
++ return (BLK_STS_TIMEOUT);
++ case ENOSPC:
++ return (BLK_STS_NOSPC);
++ case ENOLINK:
++ return (BLK_STS_TRANSPORT);
++ case EREMOTEIO:
++ return (BLK_STS_TARGET);
++ case EBADE:
++ return (BLK_STS_NEXUS);
++ case ENODATA:
++ return (BLK_STS_MEDIUM);
++ case EILSEQ:
++ return (BLK_STS_PROTECTION);
++ case ENOMEM:
++ return (BLK_STS_RESOURCE);
++ case EAGAIN:
++ return (BLK_STS_AGAIN);
++ case EIO:
++ return (BLK_STS_IOERR);
++ default:
++ return (BLK_STS_IOERR);
++ }
++}
++#endif /* HAVE_BIO_BI_STATUS */
++
+ /*
+ * 4.3 API change
+ * The bio_endio() prototype changed slightly. These are helper
+ * macro's to ensure the prototype and invocation are handled.
+ */
+ #ifdef HAVE_1ARG_BIO_END_IO_T
++#ifdef HAVE_BIO_BI_STATUS
++#define BIO_END_IO_ERROR(bio) bi_status_to_errno(bio->bi_status)
++#define BIO_END_IO_PROTO(fn, x, z) static void fn(struct bio *x)
++#define BIO_END_IO(bio, error) bio_set_bi_status(bio, error)
++static inline void
++bio_set_bi_status(struct bio *bio, int error)
++{
++ ASSERT3S(error, <=, 0);
++ bio->bi_status = errno_to_bi_status(-error);
++ bio_endio(bio);
++}
++#else
++#define BIO_END_IO_ERROR(bio) (-(bio->bi_error))
+ #define BIO_END_IO_PROTO(fn, x, z) static void fn(struct bio *x)
+-#define BIO_END_IO(bio, error) bio->bi_error = error; bio_endio(bio);
++#define BIO_END_IO(bio, error) bio_set_bi_error(bio, error)
++static inline void
++bio_set_bi_error(struct bio *bio, int error)
++{
++ ASSERT3S(error, <=, 0);
++ bio->bi_error = error;
++ bio_endio(bio);
++}
++#endif /* HAVE_BIO_BI_STATUS */
++
+ #else
+ #define BIO_END_IO_PROTO(fn, x, z) static void fn(struct bio *x, int z)
+ #define BIO_END_IO(bio, error) bio_endio(bio, error);
+diff --git a/zfs_config.h.in b/zfs_config.h.in
+index 11d946b6bc7d..94bbeb9e6216 100644
+--- a/zfs_config.h.in
++++ b/zfs_config.h.in
+@@ -51,6 +51,9 @@
+ /* bio->bi_opf is defined */
+ #undef HAVE_BIO_BI_OPF
+
++/* bio->bi_status exists */
++#undef HAVE_BIO_BI_STATUS
++
+ /* bio has bi_iter */
+ #undef HAVE_BIO_BVEC_ITER
+
+diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c
+index 5697f68671a8..33eba20a4a15 100644
+--- a/module/zfs/vdev_disk.c
++++ b/module/zfs/vdev_disk.c
+@@ -426,7 +426,7 @@ BIO_END_IO_PROTO(vdev_disk_physio_completion, bio, error)
+
+ if (dr->dr_error == 0) {
+ #ifdef HAVE_1ARG_BIO_END_IO_T
+- dr->dr_error = -(bio->bi_error);
++ dr->dr_error = BIO_END_IO_ERROR(bio);
+ #else
+ if (error)
+ dr->dr_error = -(error);
+@@ -613,16 +613,17 @@ __vdev_disk_physio(struct block_device *bdev, zio_t *zio, caddr_t kbuf_ptr,
+ return (error);
+ }
+
+-BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, rc)
++BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, error)
+ {
+ zio_t *zio = bio->bi_private;
+ #ifdef HAVE_1ARG_BIO_END_IO_T
+- int rc = bio->bi_error;
++ zio->io_error = BIO_END_IO_ERROR(bio);
++#else
++ zio->io_error = -error;
+ #endif
+
+ zio->io_delay = jiffies_64 - zio->io_delay;
+- zio->io_error = -rc;
+- if (rc && (rc == -EOPNOTSUPP))
++ if (zio->io_error && (zio->io_error == EOPNOTSUPP))
+ zio->io_vd->vdev_nowritecache = B_TRUE;
+
+ bio_put(bio);
+diff --git a/config/kernel-bio-end-io-t-args.m4 b/config/kernel-bio-end-io-t-args.m4
+index c8c520f1ba82..3c420cc0c305 100644
+--- a/config/kernel-bio-end-io-t-args.m4
++++ b/config/kernel-bio-end-io-t-args.m4
+@@ -22,3 +22,25 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_END_IO_T_ARGS], [
+ AC_MSG_RESULT(no)
+ ])
+ ])
++
++dnl #
++dnl # 4.13 API change
++dnl # The bio->bi_error field was replaced with bio->bi_status which is an
++dnl # enum which describes all possible error types.
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_BIO_BI_STATUS], [
++ AC_MSG_CHECKING([whether bio->bi_status exists])
++ ZFS_LINUX_TRY_COMPILE([
++ #include <linux/bio.h>
++ ],[
++ struct bio bio __attribute__ ((unused));
++ blk_status_t status __attribute__ ((unused)) = BLK_STS_OK;
++
++ bio.bi_status = status;
++ ],[
++ AC_MSG_RESULT(yes)
++ AC_DEFINE(HAVE_BIO_BI_STATUS, 1, [bio->bi_status exists])
++ ],[
++ AC_MSG_RESULT(no)
++ ])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index 4a8eeab2ae10..9c6802a6c20b 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -28,6 +28,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+ ZFS_AC_KERNEL_REQ_OP_FLUSH
+ ZFS_AC_KERNEL_BIO_BI_OPF
+ ZFS_AC_KERNEL_BIO_END_IO_T_ARGS
++ ZFS_AC_KERNEL_BIO_BI_STATUS
+ ZFS_AC_KERNEL_BIO_RW_BARRIER
+ ZFS_AC_KERNEL_BIO_RW_DISCARD
+ ZFS_AC_KERNEL_BLK_QUEUE_FLUSH
+diff --git a/configure b/configure
+index 8e386e6a8c44..9634569bb611 100755
+--- a/configure
++++ b/configure
+@@ -29519,6 +29519,74 @@ fi
+
+
+
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether bio->bi_status exists" >&5
++$as_echo_n "checking whether bio->bi_status exists... " >&6; }
++
++
++cat confdefs.h - <<_ACEOF >conftest.c
++
++
++ #include <linux/bio.h>
++
++int
++main (void)
++{
++
++ struct bio bio __attribute__ ((unused));
++ blk_status_t status __attribute__ ((unused)) = BLK_STS_OK;
++
++ bio.bi_status = status;
++
++ ;
++ return 0;
++}
++
++_ACEOF
++
++
++
++cat - <<_ACEOF >conftest.h
++
++_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 conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $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_BIO_BI_STATUS 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:$LINENO: checking whether BIO_RW_BARRIER is defined" >&5
+ $as_echo_n "checking whether BIO_RW_BARRIER is defined... " >&6; }
+
+@@ -29919,6 +29987,74 @@ fi
+
+
+
++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether bio->bi_status exists" >&5
++$as_echo_n "checking whether bio->bi_status exists... " >&6; }
++
++
++cat confdefs.h - <<_ACEOF >conftest.c
++
++
++ #include <linux/bio.h>
++
++int
++main (void)
++{
++
++ struct bio bio __attribute__ ((unused));
++ blk_status_t status __attribute__ ((unused)) = BLK_STS_OK;
++
++ bio.bi_status = status;
++
++ ;
++ return 0;
++}
++
++_ACEOF
++
++
++
++cat - <<_ACEOF >conftest.h
++
++_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 conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $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_BIO_BI_STATUS 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:$LINENO: checking whether BIO_RW_BARRIER is defined" >&5
+ $as_echo_n "checking whether BIO_RW_BARRIER is defined... " >&6; }
+
+--
+2.14.1
+