Linux 5.19 compat: bdev_max_discard_sectors()

Linux 5.19 commit torvalds/linux@70200574cc removed the
blk_queue_discard() helper function.  The preferred interface
is to now use the bdev_max_discard_sectors() function to check
for discard support.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #13515
This commit is contained in:
Brian Behlendorf 2022-05-27 17:51:55 +00:00
parent 5f264996f4
commit 5e4aedaca7
5 changed files with 51 additions and 6 deletions

View File

@ -74,6 +74,8 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_UPDATE_READAHEAD], [
AC_DEFINE(HAVE_BLK_QUEUE_UPDATE_READAHEAD, 1, AC_DEFINE(HAVE_BLK_QUEUE_UPDATE_READAHEAD, 1,
[blk_queue_update_readahead() exists]) [blk_queue_update_readahead() exists])
],[ ],[
AC_MSG_RESULT(no)
AC_MSG_CHECKING([whether disk_update_readahead() exists]) AC_MSG_CHECKING([whether disk_update_readahead() exists])
ZFS_LINUX_TEST_RESULT([disk_update_readahead], [ ZFS_LINUX_TEST_RESULT([disk_update_readahead], [
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
@ -86,10 +88,19 @@ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_UPDATE_READAHEAD], [
]) ])
dnl # dnl #
dnl # 2.6.32 API, dnl # 5.19: bdev_max_discard_sectors() available
dnl # blk_queue_discard() dnl # 2.6.32: blk_queue_discard() available
dnl # dnl #
AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISCARD], [ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISCARD], [
ZFS_LINUX_TEST_SRC([bdev_max_discard_sectors], [
#include <linux/blkdev.h>
],[
struct block_device *bdev __attribute__ ((unused)) = NULL;
unsigned int error __attribute__ ((unused));
error = bdev_max_discard_sectors(bdev);
])
ZFS_LINUX_TEST_SRC([blk_queue_discard], [ ZFS_LINUX_TEST_SRC([blk_queue_discard], [
#include <linux/blkdev.h> #include <linux/blkdev.h>
],[ ],[
@ -102,13 +113,24 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLK_QUEUE_DISCARD], [
]) ])
AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_DISCARD], [ AC_DEFUN([ZFS_AC_KERNEL_BLK_QUEUE_DISCARD], [
AC_MSG_CHECKING([whether bdev_max_discard_sectors() is available])
ZFS_LINUX_TEST_RESULT([bdev_max_discard_sectors], [
AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_BDEV_MAX_DISCARD_SECTORS, 1,
[bdev_max_discard_sectors() is available])
],[
AC_MSG_RESULT(no)
AC_MSG_CHECKING([whether blk_queue_discard() is available]) AC_MSG_CHECKING([whether blk_queue_discard() is available])
ZFS_LINUX_TEST_RESULT([blk_queue_discard], [ ZFS_LINUX_TEST_RESULT([blk_queue_discard], [
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
AC_DEFINE(HAVE_BLK_QUEUE_DISCARD, 1,
[blk_queue_discard() is available])
],[ ],[
ZFS_LINUX_TEST_ERROR([blk_queue_discard]) ZFS_LINUX_TEST_ERROR([blk_queue_discard])
]) ])
]) ])
])
dnl # dnl #
dnl # 4.8 API, dnl # 4.8 API,

View File

@ -134,6 +134,8 @@ AC_DEFUN([ZFS_AC_KERNEL_VFS_IOV_ITER], [
AC_DEFINE(HAVE_IOV_ITER_FAULT_IN_READABLE, 1, AC_DEFINE(HAVE_IOV_ITER_FAULT_IN_READABLE, 1,
[iov_iter_fault_in_readable() is available]) [iov_iter_fault_in_readable() is available])
],[ ],[
AC_MSG_RESULT(no)
AC_MSG_CHECKING([whether fault_in_iov_iter_readable() is available]) AC_MSG_CHECKING([whether fault_in_iov_iter_readable() is available])
ZFS_LINUX_TEST_RESULT([fault_in_iov_iter_readable], [ ZFS_LINUX_TEST_RESULT([fault_in_iov_iter_readable], [
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)

View File

@ -494,6 +494,25 @@ blk_queue_discard_granularity(struct request_queue *q, unsigned int dg)
q->limits.discard_granularity = dg; q->limits.discard_granularity = dg;
} }
/*
* 5.19 API,
* bdev_max_discard_sectors()
*
* 2.6.32 API,
* blk_queue_discard()
*/
static inline boolean_t
bdev_discard_supported(struct block_device *bdev)
{
#if defined(HAVE_BDEV_MAX_DISCARD_SECTORS)
return (!!bdev_max_discard_sectors(bdev));
#elif defined(HAVE_BLK_QUEUE_DISCARD)
return (!!blk_queue_discard(bdev_get_queue(bdev)));
#else
#error "Unsupported kernel"
#endif
}
/* /*
* 4.8 API, * 4.8 API,
* blk_queue_secure_erase() * blk_queue_secure_erase()

View File

@ -316,7 +316,7 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
v->vdev_nowritecache = B_FALSE; v->vdev_nowritecache = B_FALSE;
/* Set when device reports it supports TRIM. */ /* Set when device reports it supports TRIM. */
v->vdev_has_trim = !!blk_queue_discard(q); v->vdev_has_trim = bdev_discard_supported(vd->vd_bdev);
/* Set when device reports it supports secure TRIM. */ /* Set when device reports it supports secure TRIM. */
v->vdev_has_securetrim = !!blk_queue_discard_secure(q); v->vdev_has_securetrim = !!blk_queue_discard_secure(q);

View File

@ -1053,7 +1053,9 @@ zvol_os_create_minor(const char *name)
(zvol_max_discard_blocks * zv->zv_volblocksize) >> 9); (zvol_max_discard_blocks * zv->zv_volblocksize) >> 9);
blk_queue_discard_granularity(zv->zv_zso->zvo_queue, blk_queue_discard_granularity(zv->zv_zso->zvo_queue,
zv->zv_volblocksize); zv->zv_volblocksize);
#ifdef QUEUE_FLAG_DISCARD
blk_queue_flag_set(QUEUE_FLAG_DISCARD, zv->zv_zso->zvo_queue); blk_queue_flag_set(QUEUE_FLAG_DISCARD, zv->zv_zso->zvo_queue);
#endif
#ifdef QUEUE_FLAG_NONROT #ifdef QUEUE_FLAG_NONROT
blk_queue_flag_set(QUEUE_FLAG_NONROT, zv->zv_zso->zvo_queue); blk_queue_flag_set(QUEUE_FLAG_NONROT, zv->zv_zso->zvo_queue);
#endif #endif