Linux 4.7 compat: replace blk_queue_flush with blk_queue_write_cache
Signed-off-by: Chunwei Chen <david.chen@osnexus.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Issue #4665
This commit is contained in:
parent
55b8857346
commit
1aff4bb235
|
@ -22,25 +22,64 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_FLUSH], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_BLK_QUEUE_FLUSH, 1,
|
AC_DEFINE(HAVE_BLK_QUEUE_FLUSH, 1,
|
||||||
[blk_queue_flush() is available])
|
[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_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([
|
ZFS_LINUX_TRY_COMPILE([
|
||||||
#include <linux/module.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
|
|
||||||
MODULE_LICENSE("$ZFS_META_LICENSE");
|
|
||||||
],[
|
],[
|
||||||
struct request_queue *q = NULL;
|
struct request_queue *q = NULL;
|
||||||
(void) blk_queue_flush(q, REQ_FLUSH);
|
blk_queue_write_cache(q, true, true);
|
||||||
],[
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
],[
|
],[
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_BLK_QUEUE_FLUSH_GPL_ONLY, 1,
|
AC_DEFINE(HAVE_BLK_QUEUE_WRITE_CACHE, 1,
|
||||||
[blk_queue_flush() is GPL-only])
|
[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"
|
EXTRA_KCFLAGS="$tmp_flags"
|
||||||
])
|
])
|
||||||
|
|
|
@ -52,6 +52,33 @@ __blk_queue_flush(struct request_queue *q, unsigned int flags)
|
||||||
q->flush_flags = flags & (REQ_FLUSH | REQ_FUA);
|
q->flush_flags = flags & (REQ_FLUSH | REQ_FUA);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_BLK_QUEUE_FLUSH && HAVE_BLK_QUEUE_FLUSH_GPL_ONLY */
|
#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
|
* Most of the blk_* macros were removed in 2.6.36. Ostensibly this was
|
||||||
* done to improve readability and allow easier grepping. However, from
|
* done to improve readability and allow easier grepping. However, from
|
||||||
|
|
|
@ -1235,7 +1235,9 @@ zvol_alloc(dev_t dev, const char *name)
|
||||||
|
|
||||||
blk_queue_make_request(zv->zv_queue, zvol_request);
|
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);
|
blk_queue_flush(zv->zv_queue, VDEV_REQ_FLUSH | VDEV_REQ_FUA);
|
||||||
#else
|
#else
|
||||||
blk_queue_ordered(zv->zv_queue, QUEUE_ORDERED_DRAIN, NULL);
|
blk_queue_ordered(zv->zv_queue, QUEUE_ORDERED_DRAIN, NULL);
|
||||||
|
|
Loading…
Reference in New Issue