diff options
author | Christophe Vu-Brugier <cvubrugier@yahoo.fr> | 2014-06-10 11:53:21 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-06-11 14:52:40 -0400 |
commit | 6ef31dc720cff4dc6a67ccb8c73c56dbf2ea6a08 (patch) | |
tree | f1f7fe44b3de9d64dea919ff3bea774cd0760c58 /drivers/target/target_core_sbc.c | |
parent | 22c7aaa57e80853b4904a46c18f97db0036a3b97 (diff) |
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>
Diffstat (limited to 'drivers/target/target_core_sbc.c')
-rw-r--r-- | drivers/target/target_core_sbc.c | 45 |
1 files changed, 6 insertions, 39 deletions
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index e0229592ec55..7675d2aaa0f7 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -176,24 +176,6 @@ static inline u32 sbc_get_size(struct se_cmd *cmd, u32 sectors) | |||
176 | return cmd->se_dev->dev_attrib.block_size * sectors; | 176 | return cmd->se_dev->dev_attrib.block_size * sectors; |
177 | } | 177 | } |
178 | 178 | ||
179 | static int sbc_check_valid_sectors(struct se_cmd *cmd) | ||
180 | { | ||
181 | struct se_device *dev = cmd->se_dev; | ||
182 | unsigned long long end_lba; | ||
183 | u32 sectors; | ||
184 | |||
185 | sectors = cmd->data_length / dev->dev_attrib.block_size; | ||
186 | end_lba = dev->transport->get_blocks(dev) + 1; | ||
187 | |||
188 | if (cmd->t_task_lba + sectors > end_lba) { | ||
189 | pr_err("target: lba %llu, sectors %u exceeds end lba %llu\n", | ||
190 | cmd->t_task_lba, sectors, end_lba); | ||
191 | return -EINVAL; | ||
192 | } | ||
193 | |||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | static inline u32 transport_get_sectors_6(unsigned char *cdb) | 179 | static inline u32 transport_get_sectors_6(unsigned char *cdb) |
198 | { | 180 | { |
199 | /* | 181 | /* |
@@ -877,15 +859,6 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) | |||
877 | break; | 859 | break; |
878 | case SYNCHRONIZE_CACHE: | 860 | case SYNCHRONIZE_CACHE: |
879 | case SYNCHRONIZE_CACHE_16: | 861 | case SYNCHRONIZE_CACHE_16: |
880 | if (!ops->execute_sync_cache) { | ||
881 | size = 0; | ||
882 | cmd->execute_cmd = sbc_emulate_noop; | ||
883 | break; | ||
884 | } | ||
885 | |||
886 | /* | ||
887 | * Extract LBA and range to be flushed for emulated SYNCHRONIZE_CACHE | ||
888 | */ | ||
889 | if (cdb[0] == SYNCHRONIZE_CACHE) { | 862 | if (cdb[0] == SYNCHRONIZE_CACHE) { |
890 | sectors = transport_get_sectors_10(cdb); | 863 | sectors = transport_get_sectors_10(cdb); |
891 | cmd->t_task_lba = transport_lba_32(cdb); | 864 | cmd->t_task_lba = transport_lba_32(cdb); |
@@ -893,18 +866,12 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) | |||
893 | sectors = transport_get_sectors_16(cdb); | 866 | sectors = transport_get_sectors_16(cdb); |
894 | cmd->t_task_lba = transport_lba_64(cdb); | 867 | cmd->t_task_lba = transport_lba_64(cdb); |
895 | } | 868 | } |
896 | 869 | if (ops->execute_sync_cache) { | |
897 | size = sbc_get_size(cmd, sectors); | 870 | cmd->execute_cmd = ops->execute_sync_cache; |
898 | 871 | goto check_lba; | |
899 | /* | ||
900 | * Check to ensure that LBA + Range does not exceed past end of | ||
901 | * device for IBLOCK and FILEIO ->do_sync_cache() backend calls | ||
902 | */ | ||
903 | if (cmd->t_task_lba || sectors) { | ||
904 | if (sbc_check_valid_sectors(cmd) < 0) | ||
905 | return TCM_ADDRESS_OUT_OF_RANGE; | ||
906 | } | 872 | } |
907 | cmd->execute_cmd = ops->execute_sync_cache; | 873 | size = 0; |
874 | cmd->execute_cmd = sbc_emulate_noop; | ||
908 | break; | 875 | break; |
909 | case UNMAP: | 876 | case UNMAP: |
910 | if (!ops->execute_unmap) | 877 | if (!ops->execute_unmap) |
@@ -988,7 +955,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops) | |||
988 | dev->dev_attrib.hw_max_sectors); | 955 | dev->dev_attrib.hw_max_sectors); |
989 | return TCM_INVALID_CDB_FIELD; | 956 | return TCM_INVALID_CDB_FIELD; |
990 | } | 957 | } |
991 | 958 | check_lba: | |
992 | end_lba = dev->transport->get_blocks(dev) + 1; | 959 | end_lba = dev->transport->get_blocks(dev) + 1; |
993 | if (cmd->t_task_lba + sectors > end_lba) { | 960 | if (cmd->t_task_lba + sectors > end_lba) { |
994 | pr_err("cmd exceeds last lba %llu " | 961 | pr_err("cmd exceeds last lba %llu " |