aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_sbc.c
diff options
context:
space:
mode:
authorChristophe Vu-Brugier <cvubrugier@yahoo.fr>2014-06-10 11:53:21 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2014-06-11 14:52:40 -0400
commit6ef31dc720cff4dc6a67ccb8c73c56dbf2ea6a08 (patch)
treef1f7fe44b3de9d64dea919ff3bea774cd0760c58 /drivers/target/target_core_sbc.c
parent22c7aaa57e80853b4904a46c18f97db0036a3b97 (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.c45
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
179static 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
197static inline u32 transport_get_sectors_6(unsigned char *cdb) 179static 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 958check_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 "