aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/kernel-genhd-flags.m458
-rw-r--r--config/kernel.m42
-rw-r--r--module/os/linux/zfs/zvol_os.c21
3 files changed, 68 insertions, 13 deletions
diff --git a/config/kernel-genhd-flags.m4 b/config/kernel-genhd-flags.m4
new file mode 100644
index 000000000..af6a8a086
--- /dev/null
+++ b/config/kernel-genhd-flags.m4
@@ -0,0 +1,58 @@
+dnl #
+dnl # 5.17 API change,
+dnl #
+dnl # GENHD_FL_EXT_DEVT flag removed
+dnl # GENHD_FL_NO_PART_SCAN renamed GENHD_FL_NO_PART
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SRC_GENHD_FLAGS], [
+
+ ZFS_LINUX_TEST_SRC([genhd_fl_ext_devt], [
+ #include <linux/blkdev.h>
+ ], [
+ int flags __attribute__ ((unused)) = GENHD_FL_EXT_DEVT;
+ ])
+
+ ZFS_LINUX_TEST_SRC([genhd_fl_no_part], [
+ #include <linux/blkdev.h>
+ ], [
+ int flags __attribute__ ((unused)) = GENHD_FL_NO_PART;
+ ])
+
+ ZFS_LINUX_TEST_SRC([genhd_fl_no_part_scan], [
+ #include <linux/blkdev.h>
+ ], [
+ int flags __attribute__ ((unused)) = GENHD_FL_NO_PART_SCAN;
+ ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_GENHD_FLAGS], [
+
+ AC_MSG_CHECKING([whether GENHD_FL_EXT_DEVT flag is available])
+ ZFS_LINUX_TEST_RESULT([genhd_fl_ext_devt], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(ZFS_GENHD_FL_EXT_DEVT, GENHD_FL_EXT_DEVT,
+ [GENHD_FL_EXT_DEVT flag is available])
+ ], [
+ AC_MSG_RESULT(no)
+ AC_DEFINE(ZFS_GENHD_FL_EXT_DEVT, 0,
+ [GENHD_FL_EXT_DEVT flag is not available])
+ ])
+
+ AC_MSG_CHECKING([whether GENHD_FL_NO_PART flag is available])
+ ZFS_LINUX_TEST_RESULT([genhd_fl_no_part], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(ZFS_GENHD_FL_NO_PART, GENHD_FL_NO_PART,
+ [GENHD_FL_NO_PART flag is available])
+ ], [
+ AC_MSG_RESULT(no)
+
+ AC_MSG_CHECKING([whether GENHD_FL_NO_PART_SCAN flag is available])
+ ZFS_LINUX_TEST_RESULT([genhd_fl_no_part_scan], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(ZFS_GENHD_FL_NO_PART, GENHD_FL_NO_PART_SCAN,
+ [GENHD_FL_NO_PART_SCAN flag is available])
+ ], [
+ ZFS_LINUX_TEST_ERROR([GENHD_FL_NO_PART|GENHD_FL_NO_PART_SCAN])
+ ])
+ ])
+])
diff --git a/config/kernel.m4 b/config/kernel.m4
index 7e546b58a..0ef7c7d0c 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -61,6 +61,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
ZFS_AC_KERNEL_SRC_BIO
ZFS_AC_KERNEL_SRC_BLKDEV
ZFS_AC_KERNEL_SRC_BLK_QUEUE
+ ZFS_AC_KERNEL_SRC_GENHD_FLAGS
ZFS_AC_KERNEL_SRC_REVALIDATE_DISK
ZFS_AC_KERNEL_SRC_GET_DISK_RO
ZFS_AC_KERNEL_SRC_GENERIC_READLINK_GLOBAL
@@ -172,6 +173,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
ZFS_AC_KERNEL_BIO
ZFS_AC_KERNEL_BLKDEV
ZFS_AC_KERNEL_BLK_QUEUE
+ ZFS_AC_KERNEL_GENHD_FLAGS
ZFS_AC_KERNEL_REVALIDATE_DISK
ZFS_AC_KERNEL_GET_DISK_RO
ZFS_AC_KERNEL_GENERIC_READLINK_GLOBAL
diff --git a/module/os/linux/zfs/zvol_os.c b/module/os/linux/zfs/zvol_os.c
index b1321df8d..5c509a06a 100644
--- a/module/os/linux/zfs/zvol_os.c
+++ b/module/os/linux/zfs/zvol_os.c
@@ -903,22 +903,17 @@ zvol_alloc(dev_t dev, const char *name)
zso->zvo_disk->major = zvol_major;
zso->zvo_disk->events = DISK_EVENT_MEDIA_CHANGE;
+ /*
+ * Setting ZFS_VOLMODE_DEV disables partitioning on ZVOL devices.
+ * This is accomplished by limiting the number of minors for the
+ * device to one and explicitly disabling partition scanning.
+ */
if (volmode == ZFS_VOLMODE_DEV) {
- /*
- * ZFS_VOLMODE_DEV disable partitioning on ZVOL devices: set
- * gendisk->minors = 1 as noted in include/linux/blkdev.h.
- * Also disable extended partition numbers (GENHD_FL_EXT_DEVT)
- * and suppresses partition scanning (GENHD_FL_NO_PART_SCAN)
- * setting gendisk->flags accordingly.
- */
zso->zvo_disk->minors = 1;
-#if defined(GENHD_FL_EXT_DEVT)
- zso->zvo_disk->flags &= ~GENHD_FL_EXT_DEVT;
-#endif
-#if defined(GENHD_FL_NO_PART_SCAN)
- zso->zvo_disk->flags |= GENHD_FL_NO_PART_SCAN;
-#endif
+ zso->zvo_disk->flags &= ~ZFS_GENHD_FL_EXT_DEVT;
+ zso->zvo_disk->flags |= ZFS_GENHD_FL_NO_PART;
}
+
zso->zvo_disk->first_minor = (dev & MINORMASK);
zso->zvo_disk->fops = &zvol_ops;
zso->zvo_disk->private_data = zv;