Add FAILFAST support
authorBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 1 Oct 2010 17:57:56 +0000 (10:57 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 12 Oct 2010 21:55:02 +0000 (14:55 -0700)
ZFS works best when it is notified as soon as possible when a device
failure occurs.  This allows it to immediately start any recovery
actions which may be needed.  In theory Linux supports a flag which
can be set on bio's called FAILFAST which provides this quick
notification by disabling the retry logic in the lower scsi layers.

That's the theory at least.  In practice is turns out that while the
flag exists you oddly have to set it with the BIO_RW_AHEAD flag.
And even when it's set it you may get retries in the low level
drivers decides that's the right behavior, or if you don't get the
right error codes reported to the scsi midlayer.

Unfortunately, without additional kernels patchs there's not much
which can be done to improve this.  Basically, this just means that
it may take 2-3 minutes before a ZFS is notified properly that a
device has failed.  This can be improved and I suspect I'll be
submitting patches upstream to handle this.

49 files changed:
Makefile.in
cmd/Makefile.in
cmd/zdb/Makefile.in
cmd/zfs/Makefile.in
cmd/zinject/Makefile.in
cmd/zpios/Makefile.in
cmd/zpool/Makefile.in
cmd/zpool_id/Makefile.in
cmd/zpool_layout/Makefile.in
cmd/ztest/Makefile.in
config/kernel-bio-failfast.m4 [new file with mode: 0644]
config/kernel.m4
configure
etc/Makefile.in
include/Makefile.in
include/sys/Makefile.in
include/sys/blkdev.h
include/sys/fm/Makefile.in
include/sys/fm/fs/Makefile.in
include/sys/fs/Makefile.in
lib/Makefile.in
lib/libavl/Makefile.in
lib/libefi/Makefile.in
lib/libnvpair/Makefile.in
lib/libspl/Makefile.in
lib/libspl/asm-generic/Makefile.in
lib/libspl/asm-i386/Makefile.in
lib/libspl/asm-x86_64/Makefile.in
lib/libspl/include/Makefile.in
lib/libspl/include/ia32/Makefile.in
lib/libspl/include/ia32/sys/Makefile.in
lib/libspl/include/rpc/Makefile.in
lib/libspl/include/sys/Makefile.in
lib/libspl/include/sys/dktp/Makefile.in
lib/libspl/include/sys/sysevent/Makefile.in
lib/libspl/include/util/Makefile.in
lib/libunicode/Makefile.in
lib/libuutil/Makefile.in
lib/libzfs/Makefile.in
lib/libzpool/Makefile.in
man/Makefile.in
man/man8/Makefile.in
module/zfs/vdev_disk.c
scripts/Makefile.in
scripts/zpios-profile/Makefile.in
scripts/zpios-test/Makefile.in
scripts/zpool-config/Makefile.in
scripts/zpool-layout/Makefile.in
zfs_config.h.in

index e3a7bc6..2502482 100644 (file)
@@ -57,6 +57,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index f866436..f8f5a76 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index a34342f..88152b8 100644 (file)
@@ -45,6 +45,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index fd80e2d..dd44b26 100644 (file)
@@ -45,6 +45,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 265b944..ddf61bc 100644 (file)
@@ -45,6 +45,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index f2ee687..911f9c3 100644 (file)
@@ -45,6 +45,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 94761f6..258de64 100644 (file)
@@ -45,6 +45,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index d991a00..6d2fd50 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 0b0e00c..ea8947c 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index a70d055..c102d02 100644 (file)
@@ -45,6 +45,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
diff --git a/config/kernel-bio-failfast.m4 b/config/kernel-bio-failfast.m4
new file mode 100644 (file)
index 0000000..acc6575
--- /dev/null
@@ -0,0 +1,22 @@
+dnl #
+dnl # 2.6.28 API change
+dnl # Device, transport, and driver FAILFAST flags were added and
+dnl # the now legacy BIO_RW_FAILFAST flag was removed.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_BIO_FAILFAST], [
+       AC_MSG_CHECKING([whether BIO_RW_FAILFAST_* are defined])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/bio.h>
+       ],[
+               int flags;
+               flags = ((1 << BIO_RW_FAILFAST_DEV) |
+                        (1 << BIO_RW_FAILFAST_TRANSPORT) |
+                        (1 << BIO_RW_FAILFAST_DRIVER));
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_BIO_RW_FAILFAST, 1,
+                         [BIO_RW_FAILFAST_* are defined])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index 193aae1..517af39 100644 (file)
@@ -12,6 +12,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_INVALIDATE_BDEV_ARGS
        ZFS_AC_KERNEL_BDEV_LOGICAL_BLOCK_SIZE
        ZFS_AC_KERNEL_BIO_EMPTY_BARRIER
+       ZFS_AC_KERNEL_BIO_FAILFAST
        ZFS_AC_KERNEL_BIO_END_IO_T_ARGS
        ZFS_AC_KERNEL_BIO_RW_SYNCIO
        ZFS_AC_KERNEL_BLK_END_REQUEST
index 7bb25ab..328be65 100755 (executable)
--- a/configure
+++ b/configure
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether BIO_RW_FAILFAST_* are defined" >&5
+$as_echo_n "checking whether BIO_RW_FAILFAST_* are defined... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/bio.h>
+
+int
+main (void)
+{
+
+               int flags;
+               flags = ((1 << BIO_RW_FAILFAST_DEV) |
+                        (1 << BIO_RW_FAILFAST_TRANSPORT) |
+                        (1 << BIO_RW_FAILFAST_DRIVER));
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       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'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BIO_RW_FAILFAST 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
        { $as_echo "$as_me:$LINENO: checking whether bio_end_io_t wants 2 args" >&5
 $as_echo_n "checking whether bio_end_io_t wants 2 args... " >&6; }
        tmp_flags="$EXTRA_KCFLAGS"
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether BIO_RW_FAILFAST_* are defined" >&5
+$as_echo_n "checking whether BIO_RW_FAILFAST_* are defined... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/bio.h>
+
+int
+main (void)
+{
+
+               int flags;
+               flags = ((1 << BIO_RW_FAILFAST_DEV) |
+                        (1 << BIO_RW_FAILFAST_TRANSPORT) |
+                        (1 << BIO_RW_FAILFAST_DRIVER));
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       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'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BIO_RW_FAILFAST 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
        { $as_echo "$as_me:$LINENO: checking whether bio_end_io_t wants 2 args" >&5
 $as_echo_n "checking whether bio_end_io_t wants 2 args... " >&6; }
        tmp_flags="$EXTRA_KCFLAGS"
index f5835b3..5eb5551 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 6c351a8..6821a67 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index bcadd90..8964aae 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index b84f66a..7102890 100644 (file)
@@ -202,6 +202,38 @@ struct req_iterator {
                bio_for_each_segment(bvl, _iter.bio, _iter.i)
 #endif /* HAVE_RQ_FOR_EACH_SEGMENT */
 
+static inline void
+bio_set_flags_failfast(struct block_device *bdev, int *flags)
+{
+#ifdef HAVE_BIO_RW_FAILFAST
+       /*
+        * Disable BIO_RW_FAILFAST_* for loopback devices because of
+        * the following incorrect BUG_ON() in loop_make_request().
+        * This support is also disabled for md devices because the
+        * test suite layers md devices on top of loopback devices.
+        * This may be removed when the loopback driver is fixed.
+        *
+        *   BUG_ON(!lo || (rw != READ && rw != WRITE));
+        */
+#ifdef CONFIG_BUG
+       if ((MAJOR(bdev->bd_dev) == LOOP_MAJOR) ||
+           (MAJOR(bdev->bd_dev) == MD_MAJOR))
+               return;
+
+#ifdef BLOCK_EXT_MAJOR
+       if (MAJOR(bdev->bd_dev) == BLOCK_EXT_MAJOR)
+               return;
+#endif /* BLOCK_EXT_MAJOR */
+#endif /* CONFIG_BUG */
+       *flags |=
+           ((1 << BIO_RW_FAILFAST_DEV) |
+            (1 << BIO_RW_FAILFAST_TRANSPORT) |
+            (1 << BIO_RW_FAILFAST_DRIVER));
+#else /* !HAVE_BIO_RW_FAILFAST */
+       *flags |= (1 << BIO_RW_FAILFAST);
+#endif /* HAVE_BIO_RW_FAILFAST */
+}
+
 #ifndef DISK_NAME_LEN
 #define DISK_NAME_LEN  32
 #endif /* DISK_NAME_LEN */
index 0cfa330..5e1f4b8 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 4a31d65..ed828eb 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 25c170c..3103ffa 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index dc4c9a6..9749b77 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 454be6a..930f8e5 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index debd06f..294cac0 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 27873bd..8f689d4 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index c2f3bc6..6bf1478 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 632910f..8b87c31 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 281f365..fe9d9cb 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 51689b6..7506903 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index ec0dd91..1a0a7f8 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 4c39db6..4b97ee1 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 2cf46c9..1b2fb35 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 5c946ee..f5385d9 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 28fa391..cb930aa 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 02b107e..713aa88 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 71cb626..858e388 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 07cdb78..1cdbb57 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 035a243..1f431da 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 34a1248..e600ba4 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index f41504e..741f39d 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 5eb528b..99ad719 100644 (file)
@@ -44,6 +44,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 04390d9..c18b275 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index ee5678c..8cace2c 100644 (file)
@@ -42,6 +42,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 9ae8fbc..8633925 100644 (file)
@@ -342,15 +342,13 @@ retry:
        if (dr == NULL)
                return ENOMEM;
 
+       if (zio && !(zio->io_flags & (ZIO_FLAG_IO_RETRY | ZIO_FLAG_TRYHARD)))
+                       bio_set_flags_failfast(bdev, &flags);
+
        dr->dr_zio = zio;
        dr->dr_rw = flags;
        block_size = vdev_bdev_block_size(bdev);
 
-#ifdef BIO_RW_FAILFAST
-       if (flags & (1 << BIO_RW_FAILFAST))
-               dr->dr_rw |= 1 << BIO_RW_FAILFAST;
-#endif /* BIO_RW_FAILFAST */
-
        /*
         * When the IO size exceeds the maximum bio size for the request
         * queue we are forced to break the IO in multiple bio's and wait
@@ -434,6 +432,7 @@ int
 vdev_disk_physio(struct block_device *bdev, caddr_t kbuf,
                 size_t size, uint64_t offset, int flags)
 {
+       bio_set_flags_failfast(bdev, &flags);
        return __vdev_disk_physio(bdev, NULL, kbuf, size, offset, flags);
 }
 
@@ -540,11 +539,6 @@ vdev_disk_io_start(zio_t *zio)
                return ZIO_PIPELINE_CONTINUE;
        }
 
-#ifdef BIO_RW_FAILFAST
-       if (zio->io_flags & (ZIO_FLAG_IO_RETRY | ZIO_FLAG_TRYHARD))
-               flags |= (1 << BIO_RW_FAILFAST);
-#endif /* BIO_RW_FAILFAST */
-
        error = __vdev_disk_physio(vd->vd_bdev, zio, zio->io_data,
                                   zio->io_size, zio->io_offset, flags);
        if (error) {
index cd9971b..2a1a450 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index d9ab1b2..1aa1306 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 7ff309b..4101feb 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 996d15c..a312c94 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index 7623e46..baa2088 100644 (file)
@@ -43,6 +43,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bdev-logical-size.m4 \
        $(top_srcdir)/config/kernel-bio-empty-barrier.m4 \
        $(top_srcdir)/config/kernel-bio-end-io-t-args.m4 \
+       $(top_srcdir)/config/kernel-bio-failfast.m4 \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
index ef8b4f9..4797a9b 100644 (file)
@@ -15,6 +15,9 @@
 /* bio_empy_barrier() is defined */
 #undef HAVE_BIO_EMPTY_BARRIER
 
+/* BIO_RW_FAILFAST_* are defined */
+#undef HAVE_BIO_RW_FAILFAST
+
 /* BIO_RW_SYNCIO is defined */
 #undef HAVE_BIO_RW_SYNCIO