target: remove the ->transport_split_cdb callback in se_cmd
[linux-2.6-block.git] / drivers / target / target_core_cdb.c
index fb0b6308038ba803e98d4b0411bcf3ed45ca591e..575cf7216f529b4b18d35f9e4cf39e1c134aea28 100644 (file)
@@ -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);