aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_cdb.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-10-12 11:09:13 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-10-23 23:21:15 -0400
commitb937d27052e5759b1308782166fe47bc76e05b4d (patch)
treeeb5a99096bb695d208b5cacd27637c167e9bb8f5 /drivers/target/target_core_cdb.c
parent485fd0d1e3b8010b538bd0b209f3592acc825677 (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.c39
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)
1273void target_get_task_cdb(struct se_task *task, unsigned char *cdb) 1273void 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}
1283EXPORT_SYMBOL(target_get_task_cdb); 1316EXPORT_SYMBOL(target_get_task_cdb);