From 3ed7a0271168e2af73f6a1c32858604bb70ec506 Mon Sep 17 00:00:00 2001 From: Giuseppe Di Natale Date: Mon, 5 Mar 2018 12:44:35 -0800 Subject: [PATCH] Linux 4.16 compat: get_disk_and_module() As of https://github.com/torvalds/linux/commit/fb6d47a, get_disk() is now get_disk_and_module(). Add a configure check to determine if we need to use get_disk_and_module(). Reviewed-by: loli10K Reviewed-by: Brian Behlendorf Signed-off-by: Giuseppe Di Natale Closes #7264 --- config/kernel-get-disk-and-module.m4 | 19 +++++++++++++++++++ config/kernel.m4 | 1 + include/linux/blkdev_compat.h | 8 ++++++++ module/zfs/zvol.c | 2 +- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 config/kernel-get-disk-and-module.m4 diff --git a/config/kernel-get-disk-and-module.m4 b/config/kernel-get-disk-and-module.m4 new file mode 100644 index 000000000000..2a51a5af7dc1 --- /dev/null +++ b/config/kernel-get-disk-and-module.m4 @@ -0,0 +1,19 @@ +dnl # +dnl # 4.16 API change +dnl # Verify if get_disk_and_module() symbol is available. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_GET_DISK_AND_MODULE], + [AC_MSG_CHECKING([whether get_disk_and_module() is available]) + ZFS_LINUX_TRY_COMPILE_SYMBOL([ + #include + ], [ + struct gendisk *disk = NULL; + (void) get_disk_and_module(disk); + ], [get_disk_and_module], [block/genhd.c], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_GET_DISK_AND_MODULE, + 1, [get_disk_and_module() is available]) + ], [ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index 3e499e447dba..419ed1a2c76f 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -40,6 +40,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_BLK_QUEUE_MAX_SEGMENTS ZFS_AC_KERNEL_BLK_QUEUE_HAVE_BIO_RW_UNPLUG ZFS_AC_KERNEL_BLK_QUEUE_HAVE_BLK_PLUG + ZFS_AC_KERNEL_GET_DISK_AND_MODULE ZFS_AC_KERNEL_GET_DISK_RO ZFS_AC_KERNEL_GET_GENDISK ZFS_AC_KERNEL_HAVE_BIO_SET_OP_ATTRS diff --git a/include/linux/blkdev_compat.h b/include/linux/blkdev_compat.h index c8a8e856dee5..4406493e4caa 100644 --- a/include/linux/blkdev_compat.h +++ b/include/linux/blkdev_compat.h @@ -139,6 +139,14 @@ blk_queue_set_read_ahead(struct request_queue *q, unsigned long ra_pages) #endif } +#ifndef HAVE_GET_DISK_AND_MODULE +static inline struct kobject * +get_disk_and_module(struct gendisk *disk) +{ + return (get_disk(disk)); +} +#endif + #ifndef HAVE_GET_DISK_RO static inline int get_disk_ro(struct gendisk *disk) diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index aac4942098ad..62176e1cfbbc 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1559,7 +1559,7 @@ zvol_probe(dev_t dev, int *part, void *arg) struct kobject *kobj; zv = zvol_find_by_dev(dev); - kobj = zv ? get_disk(zv->zv_disk) : NULL; + kobj = zv ? get_disk_and_module(zv->zv_disk) : NULL; ASSERT(zv == NULL || MUTEX_HELD(&zv->zv_state_lock)); if (zv) mutex_exit(&zv->zv_state_lock);