target/sbc: Remove sbc_check_valid_sectors()
A similar check is performed at the end of sbc_parse_cdb() and is now enforced if the SYNCHRONIZE CACHE command's backend supports ->execute_sync_cache(). (Add check_lba goto to avoid *_max_sectors checks - nab) Signed-off-by: Christophe Vu-Brugier <cvubrugier@yahoo.fr> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
parent
22c7aaa57e
commit
6ef31dc720
|
@ -176,24 +176,6 @@ static inline u32 sbc_get_size(struct se_cmd *cmd, u32 sectors)
|
|||
return cmd->se_dev->dev_attrib.block_size * sectors;
|
||||
}
|
||||
|
||||
static int sbc_check_valid_sectors(struct se_cmd *cmd)
|
||||
{
|
||||
struct se_device *dev = cmd->se_dev;
|
||||
unsigned long long end_lba;
|
||||
u32 sectors;
|
||||
|
||||
sectors = cmd->data_length / dev->dev_attrib.block_size;
|
||||
end_lba = dev->transport->get_blocks(dev) + 1;
|
||||
|
||||
if (cmd->t_task_lba + sectors > end_lba) {
|
||||
pr_err("target: lba %llu, sectors %u exceeds end lba %llu\n",
|
||||
cmd->t_task_lba, sectors, end_lba);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 transport_get_sectors_6(unsigned char *cdb)
|
||||
{
|
||||
/*
|
||||
|
@ -877,15 +859,6 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
|
|||
break;
|
||||
case SYNCHRONIZE_CACHE:
|
||||
case SYNCHRONIZE_CACHE_16:
|
||||
if (!ops->execute_sync_cache) {
|
||||
size = 0;
|
||||
cmd->execute_cmd = sbc_emulate_noop;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract LBA and range to be flushed for emulated SYNCHRONIZE_CACHE
|
||||
*/
|
||||
if (cdb[0] == SYNCHRONIZE_CACHE) {
|
||||
sectors = transport_get_sectors_10(cdb);
|
||||
cmd->t_task_lba = transport_lba_32(cdb);
|
||||
|
@ -893,18 +866,12 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
|
|||
sectors = transport_get_sectors_16(cdb);
|
||||
cmd->t_task_lba = transport_lba_64(cdb);
|
||||
}
|
||||
|
||||
size = sbc_get_size(cmd, sectors);
|
||||
|
||||
/*
|
||||
* Check to ensure that LBA + Range does not exceed past end of
|
||||
* device for IBLOCK and FILEIO ->do_sync_cache() backend calls
|
||||
*/
|
||||
if (cmd->t_task_lba || sectors) {
|
||||
if (sbc_check_valid_sectors(cmd) < 0)
|
||||
return TCM_ADDRESS_OUT_OF_RANGE;
|
||||
if (ops->execute_sync_cache) {
|
||||
cmd->execute_cmd = ops->execute_sync_cache;
|
||||
goto check_lba;
|
||||
}
|
||||
cmd->execute_cmd = ops->execute_sync_cache;
|
||||
size = 0;
|
||||
cmd->execute_cmd = sbc_emulate_noop;
|
||||
break;
|
||||
case UNMAP:
|
||||
if (!ops->execute_unmap)
|
||||
|
@ -988,7 +955,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
|
|||
dev->dev_attrib.hw_max_sectors);
|
||||
return TCM_INVALID_CDB_FIELD;
|
||||
}
|
||||
|
||||
check_lba:
|
||||
end_lba = dev->transport->get_blocks(dev) + 1;
|
||||
if (cmd->t_task_lba + sectors > end_lba) {
|
||||
pr_err("cmd exceeds last lba %llu "
|
||||
|
|
Loading…
Reference in New Issue
Block a user