diff options
author | Christoph Hellwig <hch@infradead.org> | 2011-10-12 11:09:13 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-10-24 03:21:15 +0000 |
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) void target_get_task_cdb(struct se_task *task, unsigned char *cdb) { struct se_cmd *cmd = task->task_se_cmd; + unsigned int cdb_len = scsi_command_size(cmd->t_task_cdb); - memcpy(cdb, cmd->t_task_cdb, scsi_command_size(cmd->t_task_cdb)); + memcpy(cdb, cmd->t_task_cdb, cdb_len); if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) { - cmd->transport_split_cdb(task->task_lba, task->task_sectors, - cdb); + unsigned long long lba = task->task_lba; + u32 sectors = task->task_sectors; + + switch (cdb_len) { + case 6: + /* 21-bit LBA and 8-bit sectors */ + cdb[1] = (lba >> 16) & 0x1f; + cdb[2] = (lba >> 8) & 0xff; + cdb[3] = lba & 0xff; + cdb[4] = sectors & 0xff; + break; + case 10: + /* 32-bit LBA and 16-bit sectors */ + put_unaligned_be32(lba, &cdb[2]); + put_unaligned_be16(sectors, &cdb[7]); + break; + case 12: + /* 32-bit LBA and 32-bit sectors */ + put_unaligned_be32(lba, &cdb[2]); + put_unaligned_be32(sectors, &cdb[6]); + break; + case 16: + /* 64-bit LBA and 32-bit sectors */ + put_unaligned_be64(lba, &cdb[2]); + put_unaligned_be32(sectors, &cdb[10]); + break; + case 32: + /* 64-bit LBA and 32-bit sectors, extended CDB */ + put_unaligned_be64(lba, &cdb[12]); + put_unaligned_be32(sectors, &cdb[28]); + break; + default: + BUG(); + } } } EXPORT_SYMBOL(target_get_task_cdb); |