]> granicus.if.org Git - zfs/commitdiff
Linux 4.7 compat: replace blk_queue_flush with blk_queue_write_cache
authorChunwei Chen <david.chen@osnexus.com>
Wed, 18 May 2016 20:45:39 +0000 (13:45 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 20 May 2016 18:08:55 +0000 (11:08 -0700)
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #4665

config/kernel-blk-queue-flush.m4
include/linux/blkdev_compat.h
module/zfs/zvol.c

index bb74ea1c59459a34ebfc9947373f9f234502ed8d..1baab83a4e8cda01d14ea7e23d56f54986dd9230 100644 (file)
@@ -22,25 +22,64 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_FLUSH], [
                AC_MSG_RESULT(yes)
                AC_DEFINE(HAVE_BLK_QUEUE_FLUSH, 1,
                          [blk_queue_flush() is available])
+
+               AC_MSG_CHECKING([whether blk_queue_flush() is GPL-only])
+               ZFS_LINUX_TRY_COMPILE([
+                       #include <linux/module.h>
+                       #include <linux/blkdev.h>
+
+                       MODULE_LICENSE("$ZFS_META_LICENSE");
+               ],[
+                       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])
+               ])
        ],[
                AC_MSG_RESULT(no)
        ])
 
-       AC_MSG_CHECKING([whether blk_queue_flush() is GPL-only])
+       dnl #
+       dnl # 4.7 API change
+       dnl # Replace blk_queue_flush with blk_queue_write_cache
+       dnl #
+       AC_MSG_CHECKING([whether blk_queue_write_cache() exists])
        ZFS_LINUX_TRY_COMPILE([
-               #include <linux/module.h>
+               #include <linux/kernel.h>
                #include <linux/blkdev.h>
 
-               MODULE_LICENSE("$ZFS_META_LICENSE");
        ],[
                struct request_queue *q = NULL;
-               (void) blk_queue_flush(q, REQ_FLUSH);
-       ],[
-               AC_MSG_RESULT(no)
+               blk_queue_write_cache(q, true, true);
        ],[
                AC_MSG_RESULT(yes)
-               AC_DEFINE(HAVE_BLK_QUEUE_FLUSH_GPL_ONLY, 1,
-                         [blk_queue_flush() is GPL-only])
+               AC_DEFINE(HAVE_BLK_QUEUE_WRITE_CACHE, 1,
+                       [blk_queue_write_cache() exists])
+
+               AC_MSG_CHECKING([whether blk_queue_write_cache() is GPL-only])
+               ZFS_LINUX_TRY_COMPILE([
+                       #include <linux/kernel.h>
+                       #include <linux/module.h>
+                       #include <linux/blkdev.h>
+
+                       MODULE_LICENSE("$ZFS_META_LICENSE");
+               ],[
+                       struct request_queue *q = NULL;
+                       blk_queue_write_cache(q, true, true);
+               ],[
+                       AC_MSG_RESULT(no)
+               ],[
+                       AC_MSG_RESULT(yes)
+                       AC_DEFINE(HAVE_BLK_QUEUE_WRITE_CACHE_GPL_ONLY, 1,
+                                 [blk_queue_write_cache() is GPL-only])
+               ])
+       ],[
+               AC_MSG_RESULT(no)
        ])
+
        EXTRA_KCFLAGS="$tmp_flags"
 ])
index 0cb07207e44e49c8f29604bf4e3763e51624d77b..42b474b15f02b2aa51a3711cc82f0e1c16331842 100644 (file)
@@ -52,6 +52,33 @@ __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 */
+
+/*
+ * 4.7 API change,
+ * The blk_queue_write_cache() interface has replaced blk_queue_flush()
+ * interface.  However, while the new interface is GPL-only. Thus if the
+ * GPL-only version is detected we implement our own trivial helper
+ * compatibility funcion.
+ */
+#if defined(HAVE_BLK_QUEUE_WRITE_CACHE) && \
+       defined(HAVE_BLK_QUEUE_WRITE_CACHE_GPL_ONLY)
+#define        blk_queue_write_cache __blk_queue_write_cache
+static inline void
+__blk_queue_write_cache(struct request_queue *q, bool wc, bool fua)
+{
+       spin_lock_irq(q->queue_lock);
+       if (wc)
+               queue_flag_set(QUEUE_FLAG_WC, q);
+       else
+               queue_flag_clear(QUEUE_FLAG_WC, q);
+       if (fua)
+               queue_flag_set(QUEUE_FLAG_FUA, q);
+       else
+               queue_flag_clear(QUEUE_FLAG_FUA, q);
+       spin_unlock_irq(q->queue_lock);
+}
+#endif
+
 /*
  * Most of the blk_* macros were removed in 2.6.36.  Ostensibly this was
  * done to improve readability and allow easier grepping.  However, from
index be6aea87958620f78a0e1f068a633e277e6a411c..9c89493edfcf2d92cb87eb25afe70f8e88cb5a63 100644 (file)
@@ -1291,7 +1291,9 @@ zvol_alloc(dev_t dev, const char *name)
 
        blk_queue_make_request(zv->zv_queue, zvol_request);
 
-#ifdef HAVE_BLK_QUEUE_FLUSH
+#ifdef HAVE_BLK_QUEUE_WRITE_CACHE
+       blk_queue_write_cache(zv->zv_queue, B_TRUE, B_TRUE);
+#elif defined(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);