ZFS/SPL: add 4.13 compat patches
This commit is contained in:
		
							parent
							
								
									e03fa66fce
								
							
						
					
					
						commit
						d84d9cdc47
					
				
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							@ -271,6 +271,7 @@ $(SPL_KO): .compile_mark ${SPLSRC}
 | 
			
		||||
	rm -rf ${SPLDIR}
 | 
			
		||||
	rsync -ra ${SPLSRC}/ ${SPLDIR}
 | 
			
		||||
	[ ! -e /lib/modules/${KVNAME}/build ] || (echo "please remove /lib/modules/${KVNAME}/build" && false)
 | 
			
		||||
	cd ${SPLDIR}; patch -p1 < ../patches/spl/0001-4.13-compat.patch
 | 
			
		||||
	cd ${SPLDIR}; ./autogen.sh
 | 
			
		||||
	cd ${SPLDIR}; ./configure --with-config=kernel --with-linux=${TOP}/${KERNEL_SRC} --with-linux-obj=${TOP}/${KERNEL_SRC}
 | 
			
		||||
	cd ${SPLDIR}; make
 | 
			
		||||
@ -282,6 +283,7 @@ $(ZFS_KO): .compile_mark ${ZFSSRC}
 | 
			
		||||
	rm -rf ${ZFSDIR}
 | 
			
		||||
	rsync -ra ${ZFSSRC}/ ${ZFSDIR}
 | 
			
		||||
	[ ! -e /lib/modules/${KVNAME}/build ] || (echo "please remove /lib/modules/${KVNAME}/build" && false)
 | 
			
		||||
	cd ${ZFSDIR}; patch -p1 < ../patches/zfs/0001-4.13-compat.patch
 | 
			
		||||
	cd ${ZFSDIR}; ./autogen.sh
 | 
			
		||||
	cd ${ZFSDIR}; ./configure --with-spl=${TOP}/${SPLDIR} --with-spl-obj=${TOP}/${SPLDIR} --with-config=kernel --with-linux=${TOP}/${KERNEL_SRC} --with-linux-obj=${TOP}/${KERNEL_SRC}
 | 
			
		||||
	cd ${ZFSDIR}; make
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										617
									
								
								patches/spl/0001-4.13-compat.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										617
									
								
								patches/spl/0001-4.13-compat.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,617 @@
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										388
									
								
								patches/zfs/0001-4.13-compat.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								patches/zfs/0001-4.13-compat.patch
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,388 @@
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user