]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix synchronicity for ZVOLs.
authorEtienne Dechamps <etienne.dechamps@ovh.net>
Mon, 5 Sep 2011 09:11:38 +0000 (11:11 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 8 Feb 2012 00:23:06 +0000 (16:23 -0800)
zvol_write() assumes that the write request must be written to stable storage
if rq_is_sync() is true. Unfortunately, this assumption is incorrect. Indeed,
"sync" does *not* mean what we think it means in the context of the Linux
block layer. This is well explained in linux/fs.h:

    WRITE:       A normal async write. Device will be plugged.
    WRITE_SYNC:  Synchronous write. Identical to WRITE, but passes down
                 the hint that someone will be waiting on this IO
                 shortly.
    WRITE_FLUSH: Like WRITE_SYNC but with preceding cache flush.
    WRITE_FUA:   Like WRITE_SYNC but data is guaranteed to be on
                 non-volatile media on completion.

In other words, SYNC does not *mean* that the write must be on stable storage
on completion. It just means that someone is waiting on us to complete the
write request. Thus triggering a ZIL commit for each SYNC write request on a
ZVOL is unnecessary and harmful for performance. To make matters worse, ZVOL
users have no way to express that they actually want data to be written to
stable storage, which means the ZIL is broken for ZVOLs.

The request for stable storage is expressed by the FUA flag, so we must
commit the ZIL after the write if the FUA flag is set. In addition, we must
commit the ZIL before the write if the FLUSH flag is set.

Also, we must inform the block layer that we actually support FLUSH and FUA.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
60 files changed:
Makefile.in
cmd/Makefile.in
cmd/mount_zfs/Makefile.in
cmd/sas_switch_id/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
cmd/zvol_id/Makefile.in
config/kernel-blk-queue-flush.m4 [new file with mode: 0644]
config/kernel.m4
configure
dracut/90zfs/Makefile.in
dracut/Makefile.in
etc/Makefile.in
etc/init.d/Makefile.in
etc/zfs/Makefile.in
include/Makefile.in
include/linux/Makefile.in
include/linux/blkdev_compat.h
include/sys/Makefile.in
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/libshare/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/zvol.c
scripts/Makefile.in
scripts/zpios-profile/Makefile.in
scripts/zpios-test/Makefile.in
scripts/zpool-config/Makefile.in
scripts/zpool-layout/Makefile.in
udev/Makefile.in
udev/rules.d/Makefile.in
zfs_config.h.in

index 8b28ec0314cac0a8a14453ca6138424cfff4cbb2..ba3734234f90a9587a8545a29c6fc075e110d7f8 100644 (file)
@@ -72,6 +72,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index c57b7d4fe3300402eeed9da418c7fe0e027063b1..ba5360941fa4a9130e9c487723af4579d8c6802c 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 1ed8e1be50278adea1fe8e0a6a98eab6265d7c0a..94e31600458a5473d5d62862f308c455b89494ae 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index ebe9fb00a93d6dc75dde89d56dc37da6206fd9cd..09826f2c9e4cd75cc201cfbab986054abbd0b239 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index eb3d70f4851ea2cb420b3b83afd73012e62cd832..7dd5dfc5f9c1d574b9a5de8f7cf9b8b04509f925 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 3e8b26020ecbee6b20350c7449860acdfda530a0..54f63c75f509dad4bdcd1ef87c821b497f36128e 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index d8a8d6e43204426bd8d35466fd39dd1a24cf70e6..59d67f0962e3a7a003eccfb476c5494cb17900cb 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 7103c01a8b3d0727824c4278f9fed316d2d7e453..f357559f31d4787e1e1ea1814aee308c4277d681 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 2d025b6c49f92d28d0b6ed4c178c18883630aac8..cb15fee8e144040f77b80a7102a150fb7de04dd2 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 509d9177efe3826fff119cb74506ced1791b5470..a6277ef81d85fc020cefadf4c082183489c74d56 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 9ff60f07fee43671e469701d7af6fb807b40a5ac..12f21e51bbbb9723aeb48c71266ea452ceeccdc3 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index fb8979172ab0f04b22046fe1735cdbacb869283a..85fdde0324a11720924534253ca244dd0207c02c 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 83fc24f71b52f8203cbe7275676840fef0e58cb6..2c22c80dc02932dacbf6443c794828240588721a 100644 (file)
@@ -52,6 +52,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
diff --git a/config/kernel-blk-queue-flush.m4 b/config/kernel-blk-queue-flush.m4
new file mode 100644 (file)
index 0000000..06561ed
--- /dev/null
@@ -0,0 +1,46 @@
+dnl #
+dnl # 2.6.36 API change
+dnl # In 2.6.36 kernels the blk_queue_ordered() interface has been
+dnl # replaced by the simpler blk_queue_flush().  However, while the
+dnl # old interface was available to all the new one is GPL-only.
+dnl # Thus in addition to detecting if this function is available
+dnl # we determine if it is GPL-only.  If the GPL-only interface is
+dnl # there we implement our own compatibility function, otherwise
+dnl # we use the function.  The hope is that long term this function
+dnl # will be opened up.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_FLUSH], [
+       AC_MSG_CHECKING([whether blk_queue_flush() is available])
+       tmp_flags="$EXTRA_KCFLAGS"
+       EXTRA_KCFLAGS="-Wno-unused-but-set-variable"
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/blkdev.h>
+       ],[
+               struct request_queue *q = NULL;
+               (void) blk_queue_flush(q, REQ_FLUSH);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_BLK_QUEUE_FLUSH, 1,
+                         [blk_queue_flush() is available])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+
+       AC_MSG_CHECKING([whether blk_queue_flush() is GPL-only])
+       ZFS_LINUX_TRY_COMPILE([
+               #include <linux/module.h>
+               #include <linux/blkdev.h>
+
+               MODULE_LICENSE("CDDL");
+       ],[
+               struct request_queue *q = NULL;
+               (void) blk_queue_flush(q, REQ_FLUSH);
+       ],[
+               AC_MSG_RESULT(no)
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_BLK_QUEUE_FLUSH_GPL_ONLY, 1,
+                         [blk_queue_flush() is GPL-only])
+       ])
+       EXTRA_KCFLAGS="$tmp_flags"
+])
index 10a2cdbcff184da251e51f4a7ca881a363020ab7..a2a819c9b5ddeabb6d6b2375b4f949f2c712e3ab 100644 (file)
@@ -21,6 +21,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_BIO_RW_SYNCIO
        ZFS_AC_KERNEL_REQ_SYNC
        ZFS_AC_KERNEL_BLK_END_REQUEST
+       ZFS_AC_KERNEL_BLK_QUEUE_FLUSH
        ZFS_AC_KERNEL_BLK_FETCH_REQUEST
        ZFS_AC_KERNEL_BLK_REQUEUE_REQUEST
        ZFS_AC_KERNEL_BLK_RQ_BYTES
index e5004b57ace2584ce19746dac76b5d1da436a828..dd3a6f9a02568194dd3b2815b6f1fe5af777382f 100755 (executable)
--- a/configure
+++ b/configure
@@ -13667,6 +13667,143 @@ _ACEOF
 
 
 
+fi
+
+       rm -Rf build
+
+
+       EXTRA_KCFLAGS="$tmp_flags"
+
+
+       { $as_echo "$as_me:$LINENO: checking whether blk_queue_flush() is available" >&5
+$as_echo_n "checking whether blk_queue_flush() is available... " >&6; }
+       tmp_flags="$EXTRA_KCFLAGS"
+       EXTRA_KCFLAGS="-Wno-unused-but-set-variable"
+
+
+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/blkdev.h>
+
+int
+main (void)
+{
+
+               struct request_queue *q = NULL;
+               (void) blk_queue_flush(q, REQ_FLUSH);
+
+  ;
+  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_BLK_QUEUE_FLUSH 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 blk_queue_flush() is GPL-only" >&5
+$as_echo_n "checking whether blk_queue_flush() is GPL-only... " >&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/module.h>
+               #include <linux/blkdev.h>
+
+               MODULE_LICENSE("CDDL");
+
+int
+main (void)
+{
+
+               struct request_queue *q = NULL;
+               (void) blk_queue_flush(q, REQ_FLUSH);
+
+  ;
+  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: no" >&5
+$as_echo "no" >&6; }
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BLK_QUEUE_FLUSH_GPL_ONLY 1
+_ACEOF
+
+
+
+
 fi
 
        rm -Rf build
@@ -18863,6 +19000,143 @@ _ACEOF
 
 
 
+fi
+
+       rm -Rf build
+
+
+       EXTRA_KCFLAGS="$tmp_flags"
+
+
+       { $as_echo "$as_me:$LINENO: checking whether blk_queue_flush() is available" >&5
+$as_echo_n "checking whether blk_queue_flush() is available... " >&6; }
+       tmp_flags="$EXTRA_KCFLAGS"
+       EXTRA_KCFLAGS="-Wno-unused-but-set-variable"
+
+
+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/blkdev.h>
+
+int
+main (void)
+{
+
+               struct request_queue *q = NULL;
+               (void) blk_queue_flush(q, REQ_FLUSH);
+
+  ;
+  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_BLK_QUEUE_FLUSH 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 blk_queue_flush() is GPL-only" >&5
+$as_echo_n "checking whether blk_queue_flush() is GPL-only... " >&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/module.h>
+               #include <linux/blkdev.h>
+
+               MODULE_LICENSE("CDDL");
+
+int
+main (void)
+{
+
+               struct request_queue *q = NULL;
+               (void) blk_queue_flush(q, REQ_FLUSH);
+
+  ;
+  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: no" >&5
+$as_echo "no" >&6; }
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BLK_QUEUE_FLUSH_GPL_ONLY 1
+_ACEOF
+
+
+
+
 fi
 
        rm -Rf build
index c2dbb209eef68486a2ec27c6e750d6611f5c9894..77439a04523e927fc2a19022d8f16c8c524bde12 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 098321a94b689de05dcef7ec305d6f91002d8398..e1bfd5a0c6b1b770bfbe8a05ba7c1d5f31595f4b 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index f3c4db46c12ef21248391d01645d6538f1db2f19..8af2d9abdd258539ced2827a88d831e98524df06 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 0f733545cb26a5a524c626b664efb7c300ef9792..3baf4c07e0f8dd306b72ddebb2f8df9c5cd02e74 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 1773e378934add2511863a503e52ffcc084e6f86..0c7e35de8eb7538f7f80324c75af9f1f5e94f428 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index f079cde7cf5b2c6f4ba7ff17185121ac821ae71c..c9e8a839ce173c4e730763a5872862d51fc4e8fd 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index a50f24d5de5724876a849eb1ec2058a74435897a..815d0897a31376943f70de1b9f804d5d646a7e92 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 0a7c985d8ad58fcdf5598a5b2d9ee2506e32c287..3707fad082b76d6705ad44d7de833d16c3f870b0 100644 (file)
@@ -132,6 +132,23 @@ blk_end_request_x(struct request *req, int error, unsigned int nr_bytes)
 # endif /* HAVE_BLK_END_REQUEST_GPL_ONLY */
 #endif /* HAVE_BLK_END_REQUEST */
 
+/*
+ * 2.6.36 API change,
+ * The blk_queue_flush() interface has replaced blk_queue_ordered()
+ * interface.  However, while the old interface was available to all the
+ * new one is GPL-only.   Thus if the GPL-only version is detected we
+ * implement our own trivial helper compatibility funcion.   The hope is
+ * that long term this function will be opened up.
+ */
+#if defined(HAVE_BLK_QUEUE_FLUSH) && defined(HAVE_BLK_QUEUE_FLUSH_GPL_ONLY)
+#define blk_queue_flush __blk_queue_flush
+static inline void
+__blk_queue_flush(struct request_queue *q, unsigned int flags)
+{
+       q->flush_flags = flags & (REQ_FLUSH | REQ_FUA);
+}
+#endif /* HAVE_BLK_QUEUE_FLUSH && HAVE_BLK_QUEUE_FLUSH_GPL_ONLY */
+
 #ifndef HAVE_BLK_RQ_POS
 static inline sector_t
 blk_rq_pos(struct request *req)
@@ -345,11 +362,19 @@ bio_set_flags_failfast(struct block_device *bdev, int *flags)
  * allow richer semantics to be expressed to the block layer.  It is
  * the block layers responsibility to choose the correct way to
  * implement these semantics.
+ *
+ * The existence of these flags implies that REQ_FLUSH an REQ_FUA are
+ * defined.  Thus we can safely define VDEV_REQ_FLUSH and VDEV_REQ_FUA
+ * compatibility macros.
  */
 #ifdef WRITE_FLUSH_FUA
 # define VDEV_WRITE_FLUSH_FUA          WRITE_FLUSH_FUA
+# define VDEV_REQ_FLUSH                        REQ_FLUSH
+# define VDEV_REQ_FUA                  REQ_FUA
 #else
 # define VDEV_WRITE_FLUSH_FUA          WRITE_BARRIER
+# define VDEV_REQ_FLUSH                        REQ_HARDBARRIER
+# define VDEV_REQ_FUA                  REQ_HARDBARRIER
 #endif
 
 /*
index 1404894cd19077df4305eebb3abd3bee4700e6c0..93742b0883b45e52d837c4b07e69c4db426a6c4d 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 889bab15bdf980827d9d7ccfe1c822aba7a6ba8e..f3bfcd303498e7a265adcff5f81d3141931c957c 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 0d7f619172210f23526d2cd62d9b90eb687876db..8e87ecb8934f56ba7d80da3e66f718b594f55bcf 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index cad07acf1f95a3255084ad79e032a19269d64201..dee6403ab9abd494af73b9cc30e47ac5c884b064 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 45180aedea0c0df8683a60cb8014a17620608f07..3f8a9b4aa6416c03b80efe524ca2f394a497c207 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 7dc892e52d95df089957320271f0421092c58afa..361e74dda5656f791cbaa616fc6d3a57007e4d57 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index c8417cdf6455d21b0247a1afb8c18bc1945fca52..92865fd2254eae7d85159b79f7b5849c11de24ba 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index b2e8e22dc0f20882af84b61029dfb8ba9477c472..95d09ac7cea06928df0335117d76e5bf325dc857 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 665f0596eca3338b2aa9fc90afef4af75936954c..23550232f1a032b30a03add5b0a46d8ab97f9c8a 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index dbfffab0112d1cf09cfb66c212614929156d86fc..4db8c3553fbc6354233887e4573043ab12c0412e 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index ba6db6d05c2ac09cb9fd5646bf42c8d656ecc81a..f838c910122db7339c3782e7ac70ee2162338679 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 92a12c56ef107d6246832ac15d1588d691a9bf58..4d8e4502c49efbdd8abbe29f71065b9cad223bf7 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 227f87b1f6d0c4f981c798257ae9460779a17999..9edbecf39010725063114de67c0b57ca4483b8c4 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index ed4b369d1f8007e4aa97ef78f1241d76536b83b9..c04faa5fce3f0b151a977d605e3b1f0c19240e6b 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 148f2bf282f8022dbba12bf43832a97fe1370c5f..eeccf56a0f9d8784d00fb7965d5f758c7e2c5e48 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 5d6d54d9a4ffcdb774a099b9078eb71e186a1e88..246f71995a72428081ca7632eea6b625c0f945a2 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 9614d176d5b5886452f9e0039697d8af12c21912..d70ce70342b79e8ab5d56b97fa27d415a1e7c55c 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 058d095a6da44072f344a0e4efdde5ecf8ae2e51..201b17977f1cfa7e2f7a20da0dbe1114024cdaf8 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index f758147faf94566551c4d7d575259b4b338fe893..bbbd4596a7621697faecccf3c75eb071c983b3cc 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 217582b2fd92e189e91385eca057235bbef9da7d..9a58c51068265068d89858c8bfda64955b75c158 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 8c1f290bb58aa4913221ae35c0c67ead20aaf538..94d0d27c8b81fe5e19272dfdd793e109ad10de6c 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 3ee6bb9b14ffcd7a4ee05bdbb57ac1066890d69e..53f8be1472d04c458ec079f3a6702c57f271a26c 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 2134294eea18353e0b3269140d08d72ba5cbc989..c0fc9dc1590643dd8db94629d146dc4b7c121120 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 78bc72c4961a9f9a1d71b30bce6ade0f41b8184d..45384f82e789701941f239daeee6fae4b513f02f 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 8f7d10d672ec26e9ab33d6e335d7cc5da0c5a63a..238e0b3369c64fe7684c32ab2f9338f0a991cf4f 100644 (file)
@@ -51,6 +51,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index b06cb37f74757fb3aad69c8afe97490301b6f1e6..7e507176c874c9e9c20217ecdf495295b3cb3731 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index debc9e51380a8d22678884e75eba096ee39c05eb..11e3549b08a57ed01b8aa394fc5e5f24d9bcaaaf 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 9dda04077e7d0073dddcb2ce6c63b5160d261974..0aaa268faa2a4793f59fd5013ad5560943a24090 100644 (file)
@@ -534,6 +534,17 @@ zvol_write(void *arg)
        dmu_tx_t *tx;
        rl_t *rl;
 
+       if (req->cmd_flags & VDEV_REQ_FLUSH)
+               zil_commit(zv->zv_zilog, ZVOL_OBJ);
+
+       /*
+        * Some requests are just for flush and nothing else.
+        */
+       if (size == 0) {
+               blk_end_request(req, 0, size);
+               return;
+       }
+
        rl = zfs_range_lock(&zv->zv_znode, offset, size, RL_WRITER);
 
        tx = dmu_tx_create(zv->zv_objset);
@@ -550,12 +561,14 @@ zvol_write(void *arg)
 
        error = dmu_write_req(zv->zv_objset, ZVOL_OBJ, req, tx);
        if (error == 0)
-               zvol_log_write(zv, tx, offset, size, rq_is_sync(req));
+               zvol_log_write(zv, tx, offset, size,
+                   req->cmd_flags & VDEV_REQ_FUA);
 
        dmu_tx_commit(tx);
        zfs_range_unlock(rl);
 
-       if (rq_is_sync(req) || zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)
+       if ((req->cmd_flags & VDEV_REQ_FUA) ||
+           zv->zv_objset->os_sync == ZFS_SYNC_ALWAYS)
                zil_commit(zv->zv_zilog, ZVOL_OBJ);
 
        blk_end_request(req, -error, size);
@@ -578,6 +591,11 @@ zvol_read(void *arg)
        int error;
        rl_t *rl;
 
+       if (size == 0) {
+               blk_end_request(req, 0, size);
+               return;
+       }
+
        rl = zfs_range_lock(&zv->zv_znode, offset, size, RL_READER);
 
        error = dmu_read_req(zv->zv_objset, ZVOL_OBJ, req);
@@ -627,7 +645,7 @@ zvol_request(struct request_queue *q)
        while ((req = blk_fetch_request(q)) != NULL) {
                size = blk_rq_bytes(req);
 
-               if (blk_rq_pos(req) + blk_rq_sectors(req) >
+               if (size != 0 && blk_rq_pos(req) + blk_rq_sectors(req) >
                    get_capacity(zv->zv_disk)) {
                        printk(KERN_INFO
                               "%s: bad access: block=%llu, count=%lu\n",
@@ -1062,6 +1080,12 @@ zvol_alloc(dev_t dev, const char *name)
        if (zv->zv_queue == NULL)
                goto out_kmem;
 
+#ifdef HAVE_BLK_QUEUE_FLUSH
+       blk_queue_flush(zv->zv_queue, VDEV_REQ_FLUSH | VDEV_REQ_FUA);
+#else
+       blk_queue_ordered(zv->zv_queue, QUEUE_ORDERED_DRAIN, NULL);
+#endif /* HAVE_BLK_QUEUE_FLUSH */
+
        zv->zv_disk = alloc_disk(ZVOL_MINORS);
        if (zv->zv_disk == NULL)
                goto out_queue;
index 4e61705f57afc39cbca76372a70bb0e4f4aa059f..e762912feab940db7d609b4e53f12f75e005fe77 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 6acead732a899ad49080999691f99274908c7a80..538416193d92683064656d359fa53688476a1370 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 2a814d9bb207dec9effb6b959d74bb415c00f2a4..ec5f01e72a3a265f55ca0f9db083addbdc46234a 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 8c3dc4e46e193b099ce97eaf648e3d345da0593c..f60ecf891d69c937e100ad23580c8768abeea9dd 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index fc4c27548952dae521b83a4e5c5e52267ba3203f..61b1b06bc1b6d8d5b50cc338099640d2a226df9f 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 1884df2d15e1ee8feac048cd475cc98c0dc01a2a..498fb7360d423743d5f4512574d760158894f352 100644 (file)
@@ -49,6 +49,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index 57f406f555d1a05c4cad5c3944b49cd8488a5db2..473ae0b66fb3e31aa172366461195fa7a6986684 100644 (file)
@@ -50,6 +50,7 @@ am__aclocal_m4_deps =  \
        $(top_srcdir)/config/kernel-bio-rw-syncio.m4 \
        $(top_srcdir)/config/kernel-blk-end-request.m4 \
        $(top_srcdir)/config/kernel-blk-fetch-request.m4 \
+       $(top_srcdir)/config/kernel-blk-queue-flush.m4 \
        $(top_srcdir)/config/kernel-blk-requeue-request.m4 \
        $(top_srcdir)/config/kernel-blk-rq-bytes.m4 \
        $(top_srcdir)/config/kernel-blk-rq-pos.m4 \
index f64a3024264139b706f7cc801e1b31b909a13fd1..b14be650468f1bf9c92874c7d4dc8b075944c1d2 100644 (file)
 /* blk_fetch_request() is available */
 #undef HAVE_BLK_FETCH_REQUEST
 
+/* blk_queue_flush() is available */
+#undef HAVE_BLK_QUEUE_FLUSH
+
+/* blk_queue_flush() is GPL-only */
+#undef HAVE_BLK_QUEUE_FLUSH_GPL_ONLY
+
 /* blk_requeue_request() is available */
 #undef HAVE_BLK_REQUEUE_REQUEST