diff options
author | Christoph Hellwig <hch@infradead.org> | 2011-10-12 11:09:13 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-10-23 23:21:15 -0400 |
commit | b937d27052e5759b1308782166fe47bc76e05b4d (patch) | |
tree | eb5a99096bb695d208b5cacd27637c167e9bb8f5 /drivers/target/target_core_cdb.c | |
parent | 485fd0d1e3b8010b538bd0b209f3592acc825677 (diff) |
target: remove the ->transport_split_cdb callback in se_cmd
Add a switch statement implementing the CDB LBA/len update directly
in target_get_task_cdb and remove the old ->transport_split_cdb
callback and all its implementations.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target/target_core_cdb.c')
-rw-r--r-- | drivers/target/target_core_cdb.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c index fb0b6308038b..575cf7216f52 100644 --- a/drivers/target/target_core_cdb.c +++ b/drivers/target/target_core_cdb.c | |||
@@ -1273,11 +1273,44 @@ transport_emulate_control_cdb(struct se_task *task) | |||
1273 | void target_get_task_cdb(struct se_task *task, unsigned char *cdb) | 1273 | void target_get_task_cdb(struct se_task *task, unsigned char *cdb) |
1274 | { | 1274 | { |
1275 | struct se_cmd *cmd = task->task_se_cmd; | 1275 | struct se_cmd *cmd = task->task_se_cmd; |
1276 | unsigned int cdb_len = scsi_command_size(cmd->t_task_cdb); | ||
1276 | 1277 | ||
1277 | memcpy(cdb, cmd->t_task_cdb, scsi_command_size(cmd->t_task_cdb)); | 1278 | memcpy(cdb, cmd->t_task_cdb, cdb_len); |
1278 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) { | 1279 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) { |
1279 | cmd->transport_split_cdb(task->task_lba, task->task_sectors, | 1280 | unsigned long long lba = task->task_lba; |
1280 | cdb); | 1281 | u32 sectors = task->task_sectors; |
1282 | |||
1283 | switch (cdb_len) { | ||
1284 | case 6: | ||
1285 | /* 21-bit LBA and 8-bit sectors */ | ||
1286 | cdb[1] = (lba >> 16) & 0x1f; | ||
1287 | cdb[2] = (lba >> 8) & 0xff; | ||
1288 | cdb[3] = lba & 0xff; | ||
1289 | cdb[4] = sectors & 0xff; | ||
1290 | break; | ||
1291 | case 10: | ||
1292 | /* 32-bit LBA and 16-bit sectors */ | ||
1293 | put_unaligned_be32(lba, &cdb[2]); | ||
1294 | put_unaligned_be16(sectors, &cdb[7]); | ||
1295 | break; | ||
1296 | case 12: | ||
1297 | /* 32-bit LBA and 32-bit sectors */ | ||
1298 | put_unaligned_be32(lba, &cdb[2]); | ||
1299 | put_unaligned_be32(sectors, &cdb[6]); | ||
1300 | break; | ||
1301 | case 16: | ||
1302 | /* 64-bit LBA and 32-bit sectors */ | ||
1303 | put_unaligned_be64(lba, &cdb[2]); | ||
1304 | put_unaligned_be32(sectors, &cdb[10]); | ||
1305 | break; | ||
1306 | case 32: | ||
1307 | /* 64-bit LBA and 32-bit sectors, extended CDB */ | ||
1308 | put_unaligned_be64(lba, &cdb[12]); | ||
1309 | put_unaligned_be32(sectors, &cdb[28]); | ||
1310 | break; | ||
1311 | default: | ||
1312 | BUG(); | ||
1313 | } | ||
1281 | } | 1314 | } |
1282 | } | 1315 | } |
1283 | EXPORT_SYMBOL(target_get_task_cdb); | 1316 | EXPORT_SYMBOL(target_get_task_cdb); |