Linux 2.6.36 compat, use REQ_FAILFAST_MASK
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 10 Nov 2010 22:40:38 +0000 (14:40 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 11 Nov 2010 00:59:49 +0000 (16:59 -0800)
As of linux-2.6.36 the BIO_RW_FAILFAST and REQ_FAILFAST flags
have been unified under the REQ_* names.  These flags always had
to be kept in-sync so this is a nice step forward, unfortunately
it means we need to be careful to only use the new unified flags
when the BIO_RW_* flags are not defined.  Additional autoconf
checks were added for this and if it is ever unclear which method
to use no flags are set.  This is safe but may result in longer
delays before a disk is failed.

Perferred interface for setting FAILFAST on a bio:
  2.6.12-2.6.27: BIO_RW_FAILFAST
  2.6.28-2.6.35: BIO_RW_FAILFAST_{DEV|TRANSPORT|DRIVER}
  2.6.36-2.6.xx: REQ_FAILFAST_{DEV|TRANSPORT|DRIVER}

config/kernel-bio-failfast.m4
config/kernel.m4
configure
include/sys/blkdev.h
zfs_config.h.in

index acc6575..c45175b 100644 (file)
@@ -1,9 +1,26 @@
 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 # Preferred interface for setting FAILFAST on a bio:
+dnl #   2.6.12-2.6.27: BIO_RW_FAILFAST
+dnl #   2.6.28-2.6.35: BIO_RW_FAILFAST_{DEV|TRANSPORT|DRIVER}
+dnl #   2.6.36-2.6.xx: REQ_FAILFAST_{DEV|TRANSPORT|DRIVER}
 dnl #
 AC_DEFUN([ZFS_AC_KERNEL_BIO_FAILFAST], [
+       AC_MSG_CHECKING([whether BIO_RW_FAILFAST is defined])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/bio.h>
+       ],[
+               int flags;
+               flags = (1 << BIO_RW_FAILFAST);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_BIO_RW_FAILFAST, 1,
+                         [BIO_RW_FAILFAST is defined])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_BIO_FAILFAST_DTD], [
        AC_MSG_CHECKING([whether BIO_RW_FAILFAST_* are defined])
        ZFS_LINUX_TRY_COMPILE([
                #include <linux/bio.h>
@@ -14,9 +31,25 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_FAILFAST], [
                         (1 << BIO_RW_FAILFAST_DRIVER));
        ],[
                AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_BIO_RW_FAILFAST, 1,
+               AC_DEFINE(HAVE_BIO_RW_FAILFAST_DTD, 1,
                          [BIO_RW_FAILFAST_* are defined])
        ],[
                AC_MSG_RESULT(no)
        ])
 ])
+
+AC_DEFUN([ZFS_AC_KERNEL_REQ_FAILFAST_MASK], [
+       AC_MSG_CHECKING([whether REQ_FAILFAST_MASK is defined])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/bio.h>
+       ],[
+               int flags;
+               flags = REQ_FAILFAST_MASK;
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_BIO_REQ_FAILFAST_MASK, 1,
+                         [REQ_FAILFAST_MASK is defined])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index 517af39..c732840 100644 (file)
@@ -13,6 +13,8 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_BDEV_LOGICAL_BLOCK_SIZE
        ZFS_AC_KERNEL_BIO_EMPTY_BARRIER
        ZFS_AC_KERNEL_BIO_FAILFAST
+       ZFS_AC_KERNEL_BIO_FAILFAST_DTD
+       ZFS_AC_KERNEL_REQ_FAILFAST_MASK
        ZFS_AC_KERNEL_BIO_END_IO_T_ARGS
        ZFS_AC_KERNEL_BIO_RW_SYNCIO
        ZFS_AC_KERNEL_BLK_END_REQUEST
index 328be65..58b2953 100755 (executable)
--- a/configure
+++ b/configure
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether BIO_RW_FAILFAST is defined" >&5
+$as_echo_n "checking whether BIO_RW_FAILFAST is 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);
+
+  ;
+  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_RW_FAILFAST_* are defined" >&5
 $as_echo_n "checking whether BIO_RW_FAILFAST_* are defined... " >&6; }
 
@@ -12661,7 +12727,73 @@ _ACEOF
 $as_echo "yes" >&6; }
 
 cat >>confdefs.h <<\_ACEOF
-#define HAVE_BIO_RW_FAILFAST 1
+#define HAVE_BIO_RW_FAILFAST_DTD 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 REQ_FAILFAST_MASK is defined" >&5
+$as_echo_n "checking whether REQ_FAILFAST_MASK is 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 = REQ_FAILFAST_MASK;
+
+  ;
+  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_REQ_FAILFAST_MASK 1
 _ACEOF
 
 
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether BIO_RW_FAILFAST is defined" >&5
+$as_echo_n "checking whether BIO_RW_FAILFAST is 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);
+
+  ;
+  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_RW_FAILFAST_* are defined" >&5
 $as_echo_n "checking whether BIO_RW_FAILFAST_* are defined... " >&6; }
 
@@ -15732,7 +15930,73 @@ _ACEOF
 $as_echo "yes" >&6; }
 
 cat >>confdefs.h <<\_ACEOF
-#define HAVE_BIO_RW_FAILFAST 1
+#define HAVE_BIO_RW_FAILFAST_DTD 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 REQ_FAILFAST_MASK is defined" >&5
+$as_echo_n "checking whether REQ_FAILFAST_MASK is 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 = REQ_FAILFAST_MASK;
+
+  ;
+  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_REQ_FAILFAST_MASK 1
 _ACEOF
 
 
index 7102890..3dc0fd2 100644 (file)
@@ -205,17 +205,16 @@ struct req_iterator {
 static inline void
 bio_set_flags_failfast(struct block_device *bdev, int *flags)
 {
-#ifdef HAVE_BIO_RW_FAILFAST
+#ifdef CONFIG_BUG
        /*
-        * Disable BIO_RW_FAILFAST_* for loopback devices because of
-        * the following incorrect BUG_ON() in loop_make_request().
+        * Disable 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;
@@ -225,13 +224,25 @@ bio_set_flags_failfast(struct block_device *bdev, int *flags)
                return;
 #endif /* BLOCK_EXT_MAJOR */
 #endif /* CONFIG_BUG */
+
+#ifdef HAVE_BIO_RW_FAILFAST_DTD
+       /* BIO_RW_FAILFAST_* preferred interface from 2.6.28 - 2.6.35 */
        *flags |=
            ((1 << BIO_RW_FAILFAST_DEV) |
             (1 << BIO_RW_FAILFAST_TRANSPORT) |
             (1 << BIO_RW_FAILFAST_DRIVER));
-#else /* !HAVE_BIO_RW_FAILFAST */
+#else
+# ifdef HAVE_BIO_RW_FAILFAST
+       /* BIO_RW_FAILFAST preferred interface from 2.6.12 - 2.6.27 */
        *flags |= (1 << BIO_RW_FAILFAST);
-#endif /* HAVE_BIO_RW_FAILFAST */
+# else
+#  ifdef HAVE_REQ_FAILFAST_MASK
+       /* REQ_FAILFAST_* preferred interface from 2.6.36 - 2.6.xx,
+        * the BIO_* and REQ_* flags were unified under REQ_* flags. */
+       *flags |= REQ_FAILFAST_MASK;
+#  endif /* HAVE_REQ_FAILFAST_MASK */
+# endif /* HAVE_BIO_RW_FAILFAST */
+#endif /* HAVE_BIO_RW_FAILFAST_DTD */
 }
 
 #ifndef DISK_NAME_LEN
index 4797a9b..f666d45 100644 (file)
 /* bio_empy_barrier() is defined */
 #undef HAVE_BIO_EMPTY_BARRIER
 
-/* BIO_RW_FAILFAST_* are defined */
+/* REQ_FAILFAST_MASK is defined */
+#undef HAVE_BIO_REQ_FAILFAST_MASK
+
+/* BIO_RW_FAILFAST is defined */
 #undef HAVE_BIO_RW_FAILFAST
 
+/* BIO_RW_FAILFAST_* are defined */
+#undef HAVE_BIO_RW_FAILFAST_DTD
+
 /* BIO_RW_SYNCIO is defined */
 #undef HAVE_BIO_RW_SYNCIO