From 7e0974d6f4b296ed12012473f7c83c335a0a1488 Mon Sep 17 00:00:00 2001 From: Gleb Chesnokov Date: Wed, 15 Jun 2022 14:48:59 +0300 Subject: [PATCH] scst_vdisk: Port to Linux kernel v5.19 Support for the following block layer changes in the Linux Kernel v5.19: - 44abff2c0b97 ("block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD") - 70200574cc22 ("block: remove QUEUE_FLAG_DISCARD") --- scst/include/backport.h | 17 +++++++++++++++++ scst/src/dev_handlers/scst_vdisk.c | 9 ++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/scst/include/backport.h b/scst/include/backport.h index b5c9d921d..ef6932114 100644 --- a/scst/include/backport.h +++ b/scst/include/backport.h @@ -206,6 +206,23 @@ void blk_execute_rq_nowait_backport(struct request *rq, bool at_head) #define blk_execute_rq_nowait blk_execute_rq_nowait_backport #endif +/* */ + +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 19, 0) +/* + * See also commit 44abff2c0b97 ("block: decouple REQ_OP_SECURE_ERASE + * from REQ_OP_DISCARD") # v5.19. + */ +static inline +int blkdev_issue_discard_backport(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask) +{ + return blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, 0); +} + +#define blkdev_issue_discard blkdev_issue_discard_backport +#endif + /* */ /* * See also f2f2efb807d3 ("byteorder: Move {cpu_to_be32, be32_to_cpu}_array() diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index d15eb2438..f708849e1 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -562,8 +562,13 @@ static void vdisk_check_tp_support(struct scst_vdisk_dev *virt_dev) fd_open = true; if (virt_dev->blockio) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0) + virt_dev->dev_thin_provisioned = + !!bdev_max_discard_sectors(bdev); +#else virt_dev->dev_thin_provisioned = blk_queue_discard(bdev_get_queue(bdev)); +#endif } else { virt_dev->dev_thin_provisioned = (fd->f_op->fallocate != NULL); } @@ -581,7 +586,6 @@ check: if (virt_dev->thin_provisioned) PRINT_INFO("Auto enable thin provisioning for device " "%s", virt_dev->filename); - } if (virt_dev->thin_provisioned) { @@ -1811,8 +1815,7 @@ static int vdisk_unmap_range(struct scst_cmd *cmd, sector_t nr_sects = blocks << (cmd->dev->block_shift - 9); gfp_t gfp = cmd->cmd_gfp_mask; - err = blkdev_issue_discard(bdev, start_sector, nr_sects, gfp, - 0); + err = blkdev_issue_discard(bdev, start_sector, nr_sects, gfp); if (unlikely(err != 0)) { PRINT_ERROR("blkdev_issue_discard() for " "LBA %lld, blocks %lld failed: %d",