From 0f564ddcf06a7388ee20217e7083a6a7992e7bef Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Wed, 19 Feb 2014 03:45:48 +0000 Subject: [PATCH] Fix incorrect start and length calculation for issuing block discard requests Block layer always expects start and length in 512 byte blocks, so they should be corrected for non-512b SCST devices. Original patch from Ken Raeburn git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@5291 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/dev_handlers/scst_vdisk.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 4a1854c1c..aeecbfb8a 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -2143,21 +2143,23 @@ static int vdisk_unmap_range(struct scst_cmd *cmd, (unsigned long long)start_lba, (unsigned long long)blocks); if (virt_dev->blockio) { + sector_t start_sector = start_lba << (cmd->dev->block_shift - 9); + sector_t nr_sects = blocks << (cmd->dev->block_shift - 9); #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 27) struct inode *inode = fd->f_dentry->d_inode; gfp_t gfp = cmd->cmd_gfp_mask; #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 31) - err = blkdev_issue_discard(inode->i_bdev, start_lba, blocks, gfp); + err = blkdev_issue_discard(inode->i_bdev, start_sector, nr_sects, gfp); #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35) \ && !(LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 34) \ && defined(CONFIG_SUSE_KERNEL)) - err = blkdev_issue_discard(inode->i_bdev, start_lba, blocks, + err = blkdev_issue_discard(inode->i_bdev, start_sector, nr_sects, gfp, DISCARD_FL_WAIT); #elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 37) - err = blkdev_issue_discard(inode->i_bdev, start_lba, blocks, + err = blkdev_issue_discard(inode->i_bdev, start_sector, nr_sects, gfp, BLKDEV_IFL_WAIT); #else - err = blkdev_issue_discard(inode->i_bdev, start_lba, blocks, gfp, 0); + err = blkdev_issue_discard(inode->i_bdev, start_sector, nr_sects, gfp, 0); #endif if (unlikely(err != 0)) { PRINT_ERROR("blkdev_issue_discard() for "