diff --git a/.gitmodules b/.gitmodules index 5535d6a..f604950 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,6 @@ -[submodule "submodules/zfs-module"] - path = submodules/zfs-module - url = ../mirror_zfs-debian -[submodule "submodules/spl-module"] - path = submodules/spl-module - url = ../mirror_spl-debian [submodule "submodules/ubuntu-artful"] path = submodules/ubuntu-artful url = ../mirror_ubuntu-artful-kernel +[submodule "submodules/zfsonlinux"] + path = submodules/zfsonlinux + url = ../zfsonlinux diff --git a/Makefile b/Makefile index becaecf..3a21937 100644 --- a/Makefile +++ b/Makefile @@ -44,12 +44,13 @@ IGBSRC=${IGBDIR}.tar.gz IXGBEDIR=ixgbe-5.2.3 IXGBESRC=${IXGBEDIR}.tar.gz +ZFSONLINUX_SUBMODULE=submodules/zfsonlinux SPLDIR=pkg-spl -SPLSRC=submodules/spl-module +SPLSRC=${ZFSONLINUX_SUBMODULE}/spl-debian ZFSDIR=pkg-zfs -ZFSSRC=submodules/zfs-module +ZFSSRC=${ZFSONLINUX_SUBMODULE}/zfs-debian ZFS_KO=zfs.ko -ZFS_KO_REST=zavl.ko znvpair.ko zunicode.ko zcommon.ko zpios.ko +ZFS_KO_REST=zavl.ko znvpair.ko zunicode.ko zcommon.ko zpios.ko icp.ko ZFS_MODULES=$(ZFS_KO) $(ZFS_KO_REST) SPL_KO=spl.ko SPL_KO_REST=splat.ko @@ -271,7 +272,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}; for patch in ../${SPLSRC}/../spl-patches/*.patch; do patch --verbose -p1 < $${patch}; done cd ${SPLDIR}; ./autogen.sh cd ${SPLDIR}; ./configure --with-config=kernel --with-linux=${TOP}/${KERNEL_SRC} --with-linux-obj=${TOP}/${KERNEL_SRC} cd ${SPLDIR}; make @@ -283,7 +284,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}; for patch in ../${ZFSSRC}/../zfs-patches/*.patch; do patch --verbose -p1 < $${patch}; done 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 @@ -293,6 +294,7 @@ $(ZFS_KO): .compile_mark ${ZFSSRC} cp ${ZFSDIR}/module/unicode/zunicode.ko zunicode.ko cp ${ZFSDIR}/module/zcommon/zcommon.ko zcommon.ko cp ${ZFSDIR}/module/zpios/zpios.ko zpios.ko + cp ${ZFSDIR}/module/icp/icp.ko icp.ko headers_tmp := $(CURDIR)/tmp-headers headers_dir := $(headers_tmp)/usr/src/linux-headers-${KVNAME} @@ -336,13 +338,15 @@ distclean: clean .PHONY: update_modules update_modules: submodule git submodule foreach 'git pull --ff-only origin master' + cd ${ZFSSRC}; git pull --ff-only origin master + cd ${SPLSRC}; git pull --ff-only origin master # make sure submodules were initialized .PHONY: submodule submodule: - test -f "${KERNEL_SRC_SUBMODULE}/README" || git submodule update --init - test -f "${ZFSSRC}/debian/changelog" || git submodule update --init - test -f "${SPLSRC}/debian/changelog" || git submodule update --init + test -f "${KERNEL_SRC_SUBMODULE}/README" || git submodule update --init ${KERNEL_SRC_SUBMODULE} + test -f "${ZFSONLINUX_SUBMODULE}/Makefile" || git submodule update --init ${ZFSONLINUX_SUBMODULE} + (test -f "${ZFSSRC}/debian/changelog" && test -f "${SPLZRC}/debian/changelog") || (cd ${ZFSONLINUX_SUBMODULE}; git submodule update --init) .PHONY: clean diff --git a/patches/spl/0001-4.13-compat.patch b/patches/spl/0001-4.13-compat.patch deleted file mode 100644 index eca1464..0000000 --- a/patches/spl/0001-4.13-compat.patch +++ /dev/null @@ -1,617 +0,0 @@ -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 deleted file mode 100644 index 6055db1..0000000 --- a/patches/zfs/0001-4.13-compat.patch +++ /dev/null @@ -1,388 +0,0 @@ -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 - diff --git a/submodules/spl-module b/submodules/spl-module deleted file mode 160000 index b635835..0000000 --- a/submodules/spl-module +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b6358351cca47024ffb421bf986f2a949608188e diff --git a/submodules/zfs-module b/submodules/zfs-module deleted file mode 160000 index a540f8d..0000000 --- a/submodules/zfs-module +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a540f8d7eff8fa1d79909c4f2e8a3a03535ede74 diff --git a/submodules/zfsonlinux b/submodules/zfsonlinux new file mode 160000 index 0000000..2ce263d --- /dev/null +++ b/submodules/zfsonlinux @@ -0,0 +1 @@ +Subproject commit 2ce263d24dfa524b0504e2f3e0eb03ad6abda8da