From patchwork Wed Aug 9 16:16:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Colin Ian King X-Patchwork-Id: 799860 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 3xSGcB2BSjz9ryr; Thu, 10 Aug 2017 02:16:42 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1dfTev-0001IW-R0; Wed, 09 Aug 2017 16:16:37 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1dfTeq-0001Du-Mp for kernel-team@lists.ubuntu.com; Wed, 09 Aug 2017 16:16:32 +0000 Received: from 1.general.cking.uk.vpn ([10.172.193.212] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1dfTeq-00025E-8X; Wed, 09 Aug 2017 16:16:32 +0000 From: Colin King To: kernel-team@lists.ubuntu.com Subject: [PATCH][ARTFUL] UBUNTU: SAUCE: (noup) Update spl to 0.6.5.11-ubuntu1, zfs to 0.6.5.11-1ubuntu3 Date: Wed, 9 Aug 2017 17:16:31 +0100 Message-Id: <20170809161631.3894-1-colin.king@canonical.com> X-Mailer: git-send-email 2.11.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Colin Ian King 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 --- spl/META | 2 +- spl/config/spl-build.m4 | 55 +++++++ spl/configure | 264 +++++++++++++++++++++++++++++++++ spl/include/linux/wait_compat.h | 9 ++ spl/include/sys/condvar.h | 6 +- spl/include/sys/kmem_cache.h | 2 +- spl/include/sys/taskq.h | 7 +- spl/module/spl/spl-proc.c | 10 +- spl/module/splat/splat-atomic.c | 3 +- spl/module/splat/splat-kmem.c | 4 +- spl/module/splat/splat-rwlock.c | 2 +- spl/module/splat/splat-thread.c | 3 +- spl/spl_config.h.in | 6 + zfs/META | 2 +- zfs/config/kernel-bio-end-io-t-args.m4 | 22 +++ zfs/config/kernel.m4 | 1 + zfs/configure | 136 +++++++++++++++++ zfs/include/linux/blkdev_compat.h | 92 +++++++++++- zfs/module/zfs/vdev_disk.c | 11 +- zfs/zfs_config.h.in | 3 + 20 files changed, 615 insertions(+), 25 deletions(-) diff --git a/spl/META b/spl/META index a395a7d6ce3d..621807a782e5 100644 --- a/spl/META +++ b/spl/META @@ -2,7 +2,7 @@ Meta: 1 Name: spl Branch: 1.0 Version: 0.6.5.11 -Release: 1 +Release: 1ubuntu1 Release-Tags: relext License: GPL Author: OpenZFS on Linux diff --git a/spl/config/spl-build.m4 b/spl/config/spl-build.m4 index d5849635acfc..603fc65ec356 100644 --- a/spl/config/spl-build.m4 +++ b/spl/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/spl/configure b/spl/configure index df103800f919..608eff9beffa 100755 --- a/spl/configure +++ b/spl/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) ;; *) diff --git a/spl/include/linux/wait_compat.h b/spl/include/linux/wait_compat.h index d8cd09b9eb08..445a73c68fa1 100644 --- a/spl/include/linux/wait_compat.h +++ b/spl/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/spl/include/sys/condvar.h b/spl/include/sys/condvar.h index efcf0dda2769..8a4aab44b5ab 100644 --- a/spl/include/sys/condvar.h +++ b/spl/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/spl/include/sys/kmem_cache.h b/spl/include/sys/kmem_cache.h index e971c2b0d952..8fa14f67e73f 100644 --- a/spl/include/sys/kmem_cache.h +++ b/spl/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/spl/include/sys/taskq.h b/spl/include/sys/taskq.h index a43a86da6514..fa4b2703e462 100644 --- a/spl/include/sys/taskq.h +++ b/spl/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/module/spl/spl-proc.c b/spl/module/spl/spl-proc.c index eb00505d6ee8..08ca974145f3 100644 --- a/spl/module/spl/spl-proc.c +++ b/spl/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/spl/module/splat/splat-atomic.c b/spl/module/splat/splat-atomic.c index 999f4f058767..b0a8c70615b7 100644 --- a/spl/module/splat/splat-atomic.c +++ b/spl/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/spl/module/splat/splat-kmem.c b/spl/module/splat/splat-kmem.c index b3fd1a84dc87..b9b566f3e3da 100644 --- a/spl/module/splat/splat-kmem.c +++ b/spl/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/spl/module/splat/splat-rwlock.c b/spl/module/splat/splat-rwlock.c index 4576f20c7d00..7abb19d1c87c 100644 --- a/spl/module/splat/splat-rwlock.c +++ b/spl/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/spl/module/splat/splat-thread.c b/spl/module/splat/splat-thread.c index 8a44714078d4..dcf7d4a98788 100644 --- a/spl/module/splat/splat-thread.c +++ b/spl/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/spl/spl_config.h.in b/spl/spl_config.h.in index 7cd020be1151..52b110fdba88 100644 --- a/spl/spl_config.h.in +++ b/spl/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 where libtool stores uninstalled libraries. */ #undef LT_OBJDIR diff --git a/zfs/META b/zfs/META index 2acce3913a85..f0a20aeef7f0 100644 --- a/zfs/META +++ b/zfs/META @@ -2,7 +2,7 @@ Meta: 1 Name: zfs Branch: 1.0 Version: 0.6.5.11 -Release: 1ubuntu1 +Release: 1ubuntu3 Release-Tags: relext License: CDDL Author: OpenZFS on Linux diff --git a/zfs/config/kernel-bio-end-io-t-args.m4 b/zfs/config/kernel-bio-end-io-t-args.m4 index c8c520f1ba82..3c420cc0c305 100644 --- a/zfs/config/kernel-bio-end-io-t-args.m4 +++ b/zfs/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/zfs/config/kernel.m4 b/zfs/config/kernel.m4 index 4a8eeab2ae10..9c6802a6c20b 100644 --- a/zfs/config/kernel.m4 +++ b/zfs/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/zfs/configure b/zfs/configure index 8e386e6a8c44..9634569bb611 100755 --- a/zfs/configure +++ b/zfs/configure @@ -16297,6 +16297,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:${as_lineno-$LINENO}: checking whether BIO_RW_BARRIER is defined" >&5 $as_echo_n "checking whether BIO_RW_BARRIER is defined... " >&6; } @@ -27919,6 +27987,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:${as_lineno-$LINENO}: checking whether BIO_RW_BARRIER is defined" >&5 $as_echo_n "checking whether BIO_RW_BARRIER is defined... " >&6; } diff --git a/zfs/include/linux/blkdev_compat.h b/zfs/include/linux/blkdev_compat.h index 871506d7c924..f3054a375e0d 100644 --- a/zfs/include/linux/blkdev_compat.h +++ b/zfs/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/module/zfs/vdev_disk.c b/zfs/module/zfs/vdev_disk.c index 5697f68671a8..33eba20a4a15 100644 --- a/zfs/module/zfs/vdev_disk.c +++ b/zfs/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/zfs/zfs_config.h.in b/zfs/zfs_config.h.in index 11d946b6bc7d..94bbeb9e6216 100644 --- a/zfs/zfs_config.h.in +++ b/zfs/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