Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6ef31dc7 authored by Christophe Vu-Brugier's avatar Christophe Vu-Brugier Committed by Nicholas Bellinger
Browse files

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: default avatarChristophe Vu-Brugier <cvubrugier@yahoo.fr>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 22c7aaa5
Loading
Loading
Loading
Loading
+6 −39
Original line number Original line Diff line number Diff line
@@ -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;
	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)
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;
		break;
	case SYNCHRONIZE_CACHE:
	case SYNCHRONIZE_CACHE:
	case SYNCHRONIZE_CACHE_16:
	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) {
		if (cdb[0] == SYNCHRONIZE_CACHE) {
			sectors = transport_get_sectors_10(cdb);
			sectors = transport_get_sectors_10(cdb);
			cmd->t_task_lba = transport_lba_32(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);
			sectors = transport_get_sectors_16(cdb);
			cmd->t_task_lba = transport_lba_64(cdb);
			cmd->t_task_lba = transport_lba_64(cdb);
		}
		}

		if (ops->execute_sync_cache) {
		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;
		}
			cmd->execute_cmd = ops->execute_sync_cache;
			cmd->execute_cmd = ops->execute_sync_cache;
			goto check_lba;
		}
		size = 0;
		cmd->execute_cmd = sbc_emulate_noop;
		break;
		break;
	case UNMAP:
	case UNMAP:
		if (!ops->execute_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);
				dev->dev_attrib.hw_max_sectors);
			return TCM_INVALID_CDB_FIELD;
			return TCM_INVALID_CDB_FIELD;
		}
		}

check_lba:
		end_lba = dev->transport->get_blocks(dev) + 1;
		end_lba = dev->transport->get_blocks(dev) + 1;
		if (cmd->t_task_lba + sectors > end_lba) {
		if (cmd->t_task_lba + sectors > end_lba) {
			pr_err("cmd exceeds last lba %llu "
			pr_err("cmd exceeds last lba %llu "