From 363e1b5a05149dd824fc4308e88cc2a5a374c0de Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Tue, 15 May 2012 18:38:35 +0000 Subject: [PATCH] scst_vdisk: Avoid that invalid data is returned for VPD page 0xb0 if vdev_blockio_get_unmap_params() fails. git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@4301 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/dev_handlers/scst_vdisk.c | 34 +++++++++++++----------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 41d4f9a0c..4aa9fc269 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -2282,31 +2282,27 @@ static enum compl_status_e vdisk_exec_inquiry(struct vdisk_cmd_params *p) max_transfer, 512*1024 / dev->block_size), &buf[12]); if (virt_dev->thin_provisioned) { + uint32_t gran = 1, align = 0, max_lba = 1; + /* MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT is UNLIMITED */ put_unaligned_be32(0xFFFFFFFF, &buf[24]); if (virt_dev->blockio) { - /* - * OPTIMAL UNMAP GRANULARITY, ALIGNMENT - * and MAXIMUM UNMAP LBA COUNT - */ - uint32_t gran, align, max_lba; vdev_blockio_get_unmap_params(virt_dev, &gran, &align, &max_lba); - put_unaligned_be32(max_lba, &buf[20]); - put_unaligned_be32(gran, &buf[28]); - if (align != 0) { - put_unaligned_be32(align, - &buf[32]); - buf[32] |= 0x80; - } } else { - /* MAXIMUM UNMAP LBA COUNT */ - put_unaligned_be32( - min_t(loff_t, 0xFFFFFFFF, - virt_dev->file_size >> dev->block_shift), - &buf[20]); - /* OPTIMAL UNMAP GRANULARITY */ - put_unaligned_be32(1, &buf[28]); + max_lba = min_t(loff_t, 0xFFFFFFFFU, + virt_dev->file_size >> + dev->block_shift); + } + /* + * MAXIMUM UNMAP LBA COUNT, OPTIMAL UNMAP + * GRANULARITY and ALIGNMENT + */ + put_unaligned_be32(max_lba, &buf[20]); + put_unaligned_be32(gran, &buf[28]); + if (align != 0) { + put_unaligned_be32(align, &buf[32]); + buf[32] |= 0x80; } } resp_len = buf[3] + 4;