]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
UBUNTU: SAUCE: (noup) Update spl to 0.6.5.11-ubuntu1, zfs to 0.6.5.11-1ubuntu3
authorColin Ian King <colin.king@canonical.com>
Wed, 9 Aug 2017 16:16:31 +0000 (17:16 +0100)
committerSeth Forshee <seth.forshee@canonical.com>
Tue, 5 Sep 2017 12:34:32 +0000 (07:34 -0500)
This includes backports of upstream 4.13 compat fixes from ZFS and SPL

SPL:
  120faefed90a ("Update struct member intializers to C89")
  944117514d2a ("Linux 4.13 compat: wait queues")

ZFS:
  36ba27e9e07b ("Linux 4.13 compat: bio->bi_status and blk_status_t")

Signed-off-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
20 files changed:
spl/META
spl/config/spl-build.m4
spl/configure
spl/include/linux/wait_compat.h
spl/include/sys/condvar.h
spl/include/sys/kmem_cache.h
spl/include/sys/taskq.h
spl/module/spl/spl-proc.c
spl/module/splat/splat-atomic.c
spl/module/splat/splat-kmem.c
spl/module/splat/splat-rwlock.c
spl/module/splat/splat-thread.c
spl/spl_config.h.in
zfs/META
zfs/config/kernel-bio-end-io-t-args.m4
zfs/config/kernel.m4
zfs/configure
zfs/include/linux/blkdev_compat.h
zfs/module/zfs/vdev_disk.c
zfs/zfs_config.h.in

index a395a7d6ce3d58a25ea9e96fa6ac1321d3441745..621807a782e5697471460377d189fa58e991d1e5 100644 (file)
--- 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
index d5849635acfcbd0775684110a4fc832d4f4b77d9..603fc65ec356d1e2f4db243a5ad946a7afa80f73 100644 (file)
@@ -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)
+       ])
+])
index df103800f9194abc2f110d5415b7f4f7262e0a97..608eff9beffa3efc4f785f9b995459d39c87da06 100755 (executable)
 
        EXTRA_KCFLAGS="$tmp_flags"
 
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wait_queue_entry_t exists" >&5
+$as_echo_n "checking whether wait_queue_entry_t exists... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+               #include <linux/wait.h>
+
+int
+main (void)
+{
+
+               wait_queue_entry_t *entry __attribute__ ((unused));
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+       echo "obj-m := conftest.o" >build/Makefile
+       modpost_flag=''
+       test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_WAIT_QUEUE_ENTRY_T 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+       rm -Rf build
+
+
+
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wq_head->head and wq_entry->entry exist" >&5
+$as_echo_n "checking whether wq_head->head and wq_entry->entry exist... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+               #include <linux/wait.h>
+
+               #ifdef HAVE_WAIT_QUEUE_ENTRY_T
+               typedef wait_queue_head_t       spl_wait_queue_head_t;
+               typedef wait_queue_entry_t      spl_wait_queue_entry_t;
+               #else
+               typedef wait_queue_head_t       spl_wait_queue_head_t;
+               typedef wait_queue_t            spl_wait_queue_entry_t;
+               #endif
+
+int
+main (void)
+{
+
+               spl_wait_queue_head_t wq_head;
+               spl_wait_queue_entry_t wq_entry;
+               struct list_head *head __attribute__ ((unused));
+               struct list_head *entry __attribute__ ((unused));
+
+               head = &wq_head.head;
+               entry = &wq_entry.entry;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+       echo "obj-m := conftest.o" >build/Makefile
+       modpost_flag=''
+       test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_WAIT_QUEUE_HEAD_ENTRY 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+       rm -Rf build
+
+
+
  ;;
                user)      ;;
                all)
        EXTRA_KCFLAGS="$tmp_flags"
 
 
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wait_queue_entry_t exists" >&5
+$as_echo_n "checking whether wait_queue_entry_t exists... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+               #include <linux/wait.h>
+
+int
+main (void)
+{
+
+               wait_queue_entry_t *entry __attribute__ ((unused));
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+       echo "obj-m := conftest.o" >build/Makefile
+       modpost_flag=''
+       test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_WAIT_QUEUE_ENTRY_T 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+       rm -Rf build
+
+
+
+
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wq_head->head and wq_entry->entry exist" >&5
+$as_echo_n "checking whether wq_head->head and wq_entry->entry exist... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+               #include <linux/wait.h>
+
+               #ifdef HAVE_WAIT_QUEUE_ENTRY_T
+               typedef wait_queue_head_t       spl_wait_queue_head_t;
+               typedef wait_queue_entry_t      spl_wait_queue_entry_t;
+               #else
+               typedef wait_queue_head_t       spl_wait_queue_head_t;
+               typedef wait_queue_t            spl_wait_queue_entry_t;
+               #endif
+
+int
+main (void)
+{
+
+               spl_wait_queue_head_t wq_head;
+               spl_wait_queue_entry_t wq_entry;
+               struct list_head *head __attribute__ ((unused));
+               struct list_head *entry __attribute__ ((unused));
+
+               head = &wq_head.head;
+               entry = &wq_entry.entry;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+       echo "obj-m := conftest.o" >build/Makefile
+       modpost_flag=''
+       test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_WAIT_QUEUE_HEAD_ENTRY 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+       rm -Rf build
+
+
+
+
                           ;;
                srpm)                        ;;
                *)
index d8cd09b9eb08431f6a425fbd740c2e4baff8dc55..445a73c68fa15c6d6b461e4b74dc266b0f09026b 100644 (file)
@@ -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 */
index efcf0dda2769b2c903636932bc0ca0f9b4da0c7d..8a4aab44b5ab04c74d195336397a03a8d42ad471 100644 (file)
@@ -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;
index e971c2b0d9522679b5aff50223f5c188cd044fbb..8fa14f67e73fe563babd542a85164c2a927340fe 100644 (file)
@@ -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 */
index a43a86da651470d42ffc7858164a620e7d516146..fa4b2703e4621fe31092c1e43d3083a2d7de33ce 100644 (file)
@@ -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;
index eb00505d6ee8240205276ac63a843a50d8c4db8e..08ca974145f3fd14a8a0d6f0b257b5fcf5d5c985 100644 (file)
@@ -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
index 999f4f0587676429107c56f1d7aff1ad042a8eca..b0a8c70615b7bfa12fd6d1051c36f6cfb7431e49 100644 (file)
@@ -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;
index b3fd1a84dc871a4d95deaafcf9c88dfd6986860d..b9b566f3e3da2b725e65c8f5cd103e8040676f7d 100644 (file)
@@ -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];
index 4576f20c7d006a9aee0ae4ce1aa07b0d2e0b935e..7abb19d1c87c4fcb0df7c8e22508e27621b628e8 100644 (file)
@@ -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;
index 8a44714078d4d5eae7461835703ea97fe1c1e636..dcf7d4a987885d7784de5bad062e969daddbc52e 100644 (file)
@@ -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;
index 7cd020be11510e8c4128e4e70b7550256279225b..52b110fdba886e3de62fb9fa26deca67ad2cf898 100644 (file)
 /* 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
 
index 2acce3913a8572a6db74cc57476d530eb18233fc..f0a20aeef7f093d84992e6ba2e55f9337bf24cef 100644 (file)
--- 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
index c8c520f1ba8295be4762b0099f121f92c10df85f..3c420cc0c305b4ccee12dd4e3f1985ac1a32de0c 100644 (file)
@@ -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)
+       ])
+])
index 4a8eeab2ae10153ce93fce2c7f69daafd52f9dde..9c6802a6c20bd2daf708ceec45a99ce326906bb1 100644 (file)
@@ -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
index 8e386e6a8c44c76a5a2c1f20623389335550a3a7..9634569bb611b413ea4d8d501fe1486a6ac3a4cf 100755 (executable)
 
 
 
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether bio->bi_status exists" >&5
+$as_echo_n "checking whether bio->bi_status exists... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+               #include <linux/bio.h>
+
+int
+main (void)
+{
+
+               struct bio bio __attribute__ ((unused));
+               blk_status_t status __attribute__ ((unused)) = BLK_STS_OK;
+
+               bio.bi_status = status;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+
+cat - <<_ACEOF >conftest.h
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+       echo "obj-m := conftest.o" >build/Makefile
+       modpost_flag=''
+       test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+       if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_BIO_BI_STATUS 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+       rm -Rf build
+
+
+
+
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether BIO_RW_BARRIER is defined" >&5
 $as_echo_n "checking whether BIO_RW_BARRIER is defined... " >&6; }
 
 
 
 
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether bio->bi_status exists" >&5
+$as_echo_n "checking whether bio->bi_status exists... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+
+
+               #include <linux/bio.h>
+
+int
+main (void)
+{
+
+               struct bio bio __attribute__ ((unused));
+               blk_status_t status __attribute__ ((unused)) = BLK_STS_OK;
+
+               bio.bi_status = status;
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+
+cat - <<_ACEOF >conftest.h
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build && touch build/conftest.mod.c
+       echo "obj-m := conftest.o" >build/Makefile
+       modpost_flag=''
+       test "x$enable_linux_builtin" = xyes && modpost_flag='modpost=true' # fake modpost stage
+       if { ac_try='cp conftest.c conftest.h build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build $modpost_flag'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_BIO_BI_STATUS 1" >>confdefs.h
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+       rm -Rf build
+
+
+
+
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether BIO_RW_BARRIER is defined" >&5
 $as_echo_n "checking whether BIO_RW_BARRIER is defined... " >&6; }
 
index 871506d7c924019192e17082ea9c6854c24f4b4c..f3054a375e0d5d73beddb6fc5fe4d7044cc1c9d4 100644 (file)
@@ -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);
index 5697f68671a8abf2fe4a15d80da646ac96e09111..33eba20a4a15e40bb1edb841943f50469f0157a8 100644 (file)
@@ -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 @@ retry:
        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);
index 11d946b6bc7de061f148dd6f3fc744cb302f4300..94bbeb9e6216eeb6c8a78f4afb75323618600d60 100644 (file)
@@ -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