diff --git a/config/kernel-get-disk-and-module.m4 b/config/kernel-get-disk-and-module.m4 new file mode 100644 index 000000000..2a51a5af7 --- /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 a1bbbc2de..acd7f9618 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 c8a8e856d..4406493e4 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 b0622c2ba..d37e9e70a 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1589,7 +1589,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);