diff --git a/Makefile b/Makefile index ee6b4f8..c90fb28 100644 --- a/Makefile +++ b/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 diff --git a/patches/spl/0001-4.13-compat.patch b/patches/spl/0001-4.13-compat.patch new file mode 100644 index 0000000..eca1464 --- /dev/null +++ b/patches/spl/0001-4.13-compat.patch @@ -0,0 +1,617 @@ +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 + diff --git a/patches/zfs/0001-4.13-compat.patch b/patches/zfs/0001-4.13-compat.patch new file mode 100644 index 0000000..6055db1 --- /dev/null +++ b/patches/zfs/0001-4.13-compat.patch @@ -0,0 +1,388 @@ +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 +Signed-off-by: Fabian Grünbichler +--- + 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 ++ ],[ ++ 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 ++ ++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 ++ ++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 +