Hi
I use 3 Patches from Ubuntu to build 0.6.5.11 on Kernel 4.13.... build
and works :)
spl:
0001-Update-struct-member-intializers-to-C89.patch
0002-Linux-4.13-compat-wait-queues.patch
zfs:
2001-Linux-4.13-compat-bio-bi_status-and-blk_status_t.patch
Greetings
Holger...
>From 5c1315aa74f9fb04942300740cd843e99baec466 Mon Sep 17 00:00:00 2001
From: Colin Ian King <[email protected]>
Date: Wed, 9 Aug 2017 11:26:02 +0000
Subject: [PATCH 3/3] Linux 4.13 compat: bio->bi_status and blk_status_t
Commit torvalds/linux@4e4cbee9. The bio->bi_error field was
replaced with bio->bi_status which is an enum that describes
all possible error types.
Reviewed-by: Chunwei Chen <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #6351
(backported from ZFS commit 36ba27e9e07b35340ba388e6624e65995595ed92)
Signed-off-by: Colin Ian King <[email protected]>
---
config/kernel-bio-end-io-t-args.m4 | 22 ++++++++
config/kernel.m4 | 1 +
include/linux/blkdev_compat.h | 92 +++++++++++++++++++++++++++++++++-
module/zfs/vdev_disk.c | 11 ++--
4 files changed, 120 insertions(+), 6 deletions(-)
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/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/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);
--
2.11.0
>From e6084a687101b3cb328617847224638e802a3143 Mon Sep 17 00:00:00 2001
From: Colin Ian King <[email protected]>
Date: Wed, 9 Aug 2017 10:32:56 +0000
Subject: [PATCH 1/3] Update struct member intializers to C89
When building SPL within the kernel tree, C99 initializers cause
build failures and need to be converted to C89 as kernel CFLAGS
specify -std=gnu89.
This fix was provided by @behlendorf in #595 discussion notes and
manually implemented in the current master revision.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: RageLtMan <rageltman@sempervictus>
Closes #597
Signed-off-by: RageLtMan <[email protected]>
(backported from SPL commit 120faefed90aa4c276a3db45525dc5c804cb1a00)
Signed-off-by: Colin Ian King <[email protected]>
---
module/spl/spl-proc.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
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
--
2.11.0
>From 52ec1ef054c3f7fa708f7ccd80a236407460a948 Mon Sep 17 00:00:00 2001
From: Colin Ian King <[email protected]>
Date: Wed, 9 Aug 2017 10:59:14 +0000
Subject: [PATCH 2/3] Linux 4.13 compat: wait queues
Commit torvalds/linux@ac6424b9
- Renamed struct wait_queue -> struct wait_queue_entry.
Commit torvalds/linux@2055da97
- Renamed wait_queue_head::task_list -> wait_queue_head::head
- Renamed wait_queue_entry::task_list -> wait_queue_entry::entry
Reviewed-by: Chunwei Chen <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #629
(backported from SPL commit 944117514d2aba081b15faad741e7d0c6b1465c8)
Signed-off-by: Colin Ian King <[email protected]>
---
config/spl-build.m4 | 55 +++++++++++++++++++++++++++++++++++++++++
include/linux/wait_compat.h | 9 +++++++
include/sys/condvar.h | 6 ++---
include/sys/kmem_cache.h | 2 +-
include/sys/taskq.h | 7 +++---
module/splat/splat-atomic.c | 3 ++-
module/splat/splat-kmem.c | 4 +--
module/splat/splat-rwlock.c | 2 +-
module/splat/splat-thread.c | 3 ++-
9 files changed, 79 insertions(+), 12 deletions(-)
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/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/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;
--
2.11.0