diff --git a/config/kernel-blk-queue-flags.m4 b/config/kernel-blk-queue-flags.m4 new file mode 100644 index 000000000..b570245c7 --- /dev/null +++ b/config/kernel-blk-queue-flags.m4 @@ -0,0 +1,38 @@ +dnl # +dnl # API change +dnl # https://github.com/torvalds/linux/commit/8814ce8 +dnl # Introduction of blk_queue_flag_set and blk_queue_flag_clear +dnl # + +AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_FLAG_SET], [ + AC_MSG_CHECKING([whether blk_queue_flag_set() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include + #include + ],[ + struct request_queue *q = NULL; + blk_queue_flag_set(0, q); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_BLK_QUEUE_FLAG_SET, 1, [blk_queue_flag_set() exists]) + ],[ + AC_MSG_RESULT(no) + ]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_FLAG_CLEAR], [ + AC_MSG_CHECKING([whether blk_queue_flag_clear() exists]) + ZFS_LINUX_TRY_COMPILE([ + #include + #include + ],[ + struct request_queue *q = NULL; + blk_queue_flag_clear(0, q); + ],[ + + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_BLK_QUEUE_FLAG_CLEAR, 1, [blk_queue_flag_clear() exists]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index 1887b178c..59065ca08 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -36,6 +36,8 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_BIO_RW_BARRIER ZFS_AC_KERNEL_BIO_RW_DISCARD ZFS_AC_KERNEL_BLK_QUEUE_BDI + ZFS_AC_KERNEL_BLK_QUEUE_FLAG_CLEAR + ZFS_AC_KERNEL_BLK_QUEUE_FLAG_SET ZFS_AC_KERNEL_BLK_QUEUE_FLUSH ZFS_AC_KERNEL_BLK_QUEUE_MAX_HW_SECTORS ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS diff --git a/include/linux/blkdev_compat.h b/include/linux/blkdev_compat.h index 4406493e4..d7af1d89d 100644 --- a/include/linux/blkdev_compat.h +++ b/include/linux/blkdev_compat.h @@ -37,6 +37,22 @@ typedef unsigned __bitwise__ fmode_t; #endif /* HAVE_FMODE_T */ +#ifndef HAVE_BLK_QUEUE_FLAG_SET +static inline void +blk_queue_flag_set(unsigned int flag, struct request_queue *q) +{ + queue_flag_set_unlocked(flag, q); +} +#endif + +#ifndef HAVE_BLK_QUEUE_FLAG_CLEAR +static inline void +blk_queue_flag_clear(unsigned int flag, struct request_queue *q) +{ + queue_flag_clear_unlocked(flag, q); +} +#endif + /* * 4.7 - 4.x API, * The blk_queue_write_cache() interface has replaced blk_queue_flush() diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index d37e9e70a..97b2e4d78 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1696,7 +1696,7 @@ zvol_alloc(dev_t dev, const char *name) blk_queue_set_read_ahead(zv->zv_queue, 1); /* Disable write merging in favor of the ZIO pipeline. */ - queue_flag_set_unlocked(QUEUE_FLAG_NOMERGES, zv->zv_queue); + blk_queue_flag_set(QUEUE_FLAG_NOMERGES, zv->zv_queue); zv->zv_disk = alloc_disk(ZVOL_MINORS); if (zv->zv_disk == NULL) @@ -1847,12 +1847,12 @@ zvol_create_minor_impl(const char *name) blk_queue_max_discard_sectors(zv->zv_queue, (zvol_max_discard_blocks * zv->zv_volblocksize) >> 9); blk_queue_discard_granularity(zv->zv_queue, zv->zv_volblocksize); - queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, zv->zv_queue); + blk_queue_flag_set(QUEUE_FLAG_DISCARD, zv->zv_queue); #ifdef QUEUE_FLAG_NONROT - queue_flag_set_unlocked(QUEUE_FLAG_NONROT, zv->zv_queue); + blk_queue_flag_set(QUEUE_FLAG_NONROT, zv->zv_queue); #endif #ifdef QUEUE_FLAG_ADD_RANDOM - queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, zv->zv_queue); + blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, zv->zv_queue); #endif if (spa_writeable(dmu_objset_spa(os))) {