aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/kernel-blk-queue.m444
-rw-r--r--include/os/linux/kernel/linux/blkdev_compat.h17
-rw-r--r--module/os/linux/zfs/vdev_disk.c6
3 files changed, 43 insertions, 24 deletions
diff --git a/config/kernel-blk-queue.m4 b/config/kernel-blk-queue.m4
index c6021de2e..6f42b9812 100644
--- a/config/kernel-blk-queue.m4
+++ b/config/kernel-blk-queue.m4
@@ -133,13 +133,20 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_DISCARD], [
])
dnl #
-dnl # 4.8 API,
-dnl # blk_queue_secure_erase()
-dnl #
-dnl # 2.6.36 - 4.7 API,
-dnl # blk_queue_secdiscard()
+dnl # 5.19: bdev_max_secure_erase_sectors() available
+dnl # 4.8: blk_queue_secure_erase() available
+dnl # 2.6.36: blk_queue_secdiscard() available
dnl #
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_SECURE_ERASE], [
+ ZFS_LINUX_TEST_SRC([bdev_max_secure_erase_sectors], [
+ #include <linux/blkdev.h>
+ ],[
+ struct block_device *bdev __attribute__ ((unused)) = NULL;
+ unsigned int error __attribute__ ((unused));
+
+ error = bdev_max_secure_erase_sectors(bdev);
+ ])
+
ZFS_LINUX_TEST_SRC([blk_queue_secure_erase], [
#include <linux/blkdev.h>
],[
@@ -162,21 +169,30 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_SECURE_ERASE], [
])
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_SECURE_ERASE], [
- AC_MSG_CHECKING([whether blk_queue_secure_erase() is available])
- ZFS_LINUX_TEST_RESULT([blk_queue_secure_erase], [
+ AC_MSG_CHECKING([whether bdev_max_secure_erase_sectors() is available])
+ ZFS_LINUX_TEST_RESULT([bdev_max_secure_erase_sectors], [
AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_BLK_QUEUE_SECURE_ERASE, 1,
- [blk_queue_secure_erase() is available])
+ AC_DEFINE(HAVE_BDEV_MAX_SECURE_ERASE_SECTORS, 1,
+ [bdev_max_secure_erase_sectors() is available])
],[
AC_MSG_RESULT(no)
- AC_MSG_CHECKING([whether blk_queue_secdiscard() is available])
- ZFS_LINUX_TEST_RESULT([blk_queue_secdiscard], [
+ AC_MSG_CHECKING([whether blk_queue_secure_erase() is available])
+ ZFS_LINUX_TEST_RESULT([blk_queue_secure_erase], [
AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_BLK_QUEUE_SECDISCARD, 1,
- [blk_queue_secdiscard() is available])
+ AC_DEFINE(HAVE_BLK_QUEUE_SECURE_ERASE, 1,
+ [blk_queue_secure_erase() is available])
],[
- ZFS_LINUX_TEST_ERROR([blk_queue_secure_erase])
+ AC_MSG_RESULT(no)
+
+ AC_MSG_CHECKING([whether blk_queue_secdiscard() is available])
+ ZFS_LINUX_TEST_RESULT([blk_queue_secdiscard], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_BLK_QUEUE_SECDISCARD, 1,
+ [blk_queue_secdiscard() is available])
+ ],[
+ ZFS_LINUX_TEST_ERROR([blk_queue_secure_erase])
+ ])
])
])
])
diff --git a/include/os/linux/kernel/linux/blkdev_compat.h b/include/os/linux/kernel/linux/blkdev_compat.h
index 084d48c87..da188b4ea 100644
--- a/include/os/linux/kernel/linux/blkdev_compat.h
+++ b/include/os/linux/kernel/linux/blkdev_compat.h
@@ -514,21 +514,26 @@ bdev_discard_supported(struct block_device *bdev)
}
/*
+ * 5.19 API,
+ * bdev_max_secure_erase_sectors()
+ *
* 4.8 API,
* blk_queue_secure_erase()
*
* 2.6.36 - 4.7 API,
* blk_queue_secdiscard()
*/
-static inline int
-blk_queue_discard_secure(struct request_queue *q)
+static inline boolean_t
+bdev_secure_discard_supported(struct block_device *bdev)
{
-#if defined(HAVE_BLK_QUEUE_SECURE_ERASE)
- return (blk_queue_secure_erase(q));
+#if defined(HAVE_BDEV_MAX_SECURE_ERASE_SECTORS)
+ return (!!bdev_max_secure_erase_sectors(bdev));
+#elif defined(HAVE_BLK_QUEUE_SECURE_ERASE)
+ return (!!blk_queue_secure_erase(bdev_get_queue(bdev)));
#elif defined(HAVE_BLK_QUEUE_SECDISCARD)
- return (blk_queue_secdiscard(q));
+ return (!!blk_queue_secdiscard(bdev_get_queue(bdev)));
#else
- return (0);
+#error "Unsupported kernel"
#endif
}
diff --git a/module/os/linux/zfs/vdev_disk.c b/module/os/linux/zfs/vdev_disk.c
index 90930b83f..5d87e9211 100644
--- a/module/os/linux/zfs/vdev_disk.c
+++ b/module/os/linux/zfs/vdev_disk.c
@@ -304,8 +304,6 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
rw_exit(&vd->vd_lock);
}
- struct request_queue *q = bdev_get_queue(vd->vd_bdev);
-
/* Determine the physical block size */
int physical_block_size = bdev_physical_block_size(vd->vd_bdev);
@@ -319,10 +317,10 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
v->vdev_has_trim = bdev_discard_supported(vd->vd_bdev);
/* Set when device reports it supports secure TRIM. */
- v->vdev_has_securetrim = !!blk_queue_discard_secure(q);
+ v->vdev_has_securetrim = bdev_secure_discard_supported(vd->vd_bdev);
/* Inform the ZIO pipeline that we are non-rotational */
- v->vdev_nonrot = blk_queue_nonrot(q);
+ v->vdev_nonrot = blk_queue_nonrot(bdev_get_queue(vd->vd_bdev));
/* Physical volume size in bytes for the partition */
*psize = bdev_capacity(vd->vd_bdev);