aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_cdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/target/target_core_cdb.c')
-rw-r--r--drivers/target/target_core_cdb.c51
1 files changed, 26 insertions, 25 deletions
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c
index 2f2235edefff..f3d71fa88a28 100644
--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -83,7 +83,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
83 return -EINVAL; 83 return -EINVAL;
84 } 84 }
85 85
86 buf = transport_kmap_first_data_page(cmd); 86 buf = transport_kmap_data_sg(cmd);
87 87
88 if (dev == tpg->tpg_virt_lun0.lun_se_dev) { 88 if (dev == tpg->tpg_virt_lun0.lun_se_dev) {
89 buf[0] = 0x3f; /* Not connected */ 89 buf[0] = 0x3f; /* Not connected */
@@ -134,7 +134,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
134 buf[4] = 31; /* Set additional length to 31 */ 134 buf[4] = 31; /* Set additional length to 31 */
135 135
136out: 136out:
137 transport_kunmap_first_data_page(cmd); 137 transport_kunmap_data_sg(cmd);
138 return 0; 138 return 0;
139} 139}
140 140
@@ -698,6 +698,13 @@ int target_emulate_inquiry(struct se_task *task)
698 int p, ret; 698 int p, ret;
699 699
700 if (!(cdb[1] & 0x1)) { 700 if (!(cdb[1] & 0x1)) {
701 if (cdb[2]) {
702 pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n",
703 cdb[2]);
704 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
705 return -EINVAL;
706 }
707
701 ret = target_emulate_inquiry_std(cmd); 708 ret = target_emulate_inquiry_std(cmd);
702 goto out; 709 goto out;
703 } 710 }
@@ -716,7 +723,7 @@ int target_emulate_inquiry(struct se_task *task)
716 return -EINVAL; 723 return -EINVAL;
717 } 724 }
718 725
719 buf = transport_kmap_first_data_page(cmd); 726 buf = transport_kmap_data_sg(cmd);
720 727
721 buf[0] = dev->transport->get_device_type(dev); 728 buf[0] = dev->transport->get_device_type(dev);
722 729
@@ -729,11 +736,11 @@ int target_emulate_inquiry(struct se_task *task)
729 } 736 }
730 737
731 pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]); 738 pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]);
732 cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; 739 cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
733 ret = -EINVAL; 740 ret = -EINVAL;
734 741
735out_unmap: 742out_unmap:
736 transport_kunmap_first_data_page(cmd); 743 transport_kunmap_data_sg(cmd);
737out: 744out:
738 if (!ret) { 745 if (!ret) {
739 task->task_scsi_status = GOOD; 746 task->task_scsi_status = GOOD;
@@ -755,7 +762,7 @@ int target_emulate_readcapacity(struct se_task *task)
755 else 762 else
756 blocks = (u32)blocks_long; 763 blocks = (u32)blocks_long;
757 764
758 buf = transport_kmap_first_data_page(cmd); 765 buf = transport_kmap_data_sg(cmd);
759 766
760 buf[0] = (blocks >> 24) & 0xff; 767 buf[0] = (blocks >> 24) & 0xff;
761 buf[1] = (blocks >> 16) & 0xff; 768 buf[1] = (blocks >> 16) & 0xff;
@@ -771,7 +778,7 @@ int target_emulate_readcapacity(struct se_task *task)
771 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) 778 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
772 put_unaligned_be32(0xFFFFFFFF, &buf[0]); 779 put_unaligned_be32(0xFFFFFFFF, &buf[0]);
773 780
774 transport_kunmap_first_data_page(cmd); 781 transport_kunmap_data_sg(cmd);
775 782
776 task->task_scsi_status = GOOD; 783 task->task_scsi_status = GOOD;
777 transport_complete_task(task, 1); 784 transport_complete_task(task, 1);
@@ -785,7 +792,7 @@ int target_emulate_readcapacity_16(struct se_task *task)
785 unsigned char *buf; 792 unsigned char *buf;
786 unsigned long long blocks = dev->transport->get_blocks(dev); 793 unsigned long long blocks = dev->transport->get_blocks(dev);
787 794
788 buf = transport_kmap_first_data_page(cmd); 795 buf = transport_kmap_data_sg(cmd);
789 796
790 buf[0] = (blocks >> 56) & 0xff; 797 buf[0] = (blocks >> 56) & 0xff;
791 buf[1] = (blocks >> 48) & 0xff; 798 buf[1] = (blocks >> 48) & 0xff;
@@ -806,7 +813,7 @@ int target_emulate_readcapacity_16(struct se_task *task)
806 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) 813 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
807 buf[14] = 0x80; 814 buf[14] = 0x80;
808 815
809 transport_kunmap_first_data_page(cmd); 816 transport_kunmap_data_sg(cmd);
810 817
811 task->task_scsi_status = GOOD; 818 task->task_scsi_status = GOOD;
812 transport_complete_task(task, 1); 819 transport_complete_task(task, 1);
@@ -1019,9 +1026,9 @@ int target_emulate_modesense(struct se_task *task)
1019 offset = cmd->data_length; 1026 offset = cmd->data_length;
1020 } 1027 }
1021 1028
1022 rbuf = transport_kmap_first_data_page(cmd); 1029 rbuf = transport_kmap_data_sg(cmd);
1023 memcpy(rbuf, buf, offset); 1030 memcpy(rbuf, buf, offset);
1024 transport_kunmap_first_data_page(cmd); 1031 transport_kunmap_data_sg(cmd);
1025 1032
1026 task->task_scsi_status = GOOD; 1033 task->task_scsi_status = GOOD;
1027 transport_complete_task(task, 1); 1034 transport_complete_task(task, 1);
@@ -1043,7 +1050,7 @@ int target_emulate_request_sense(struct se_task *task)
1043 return -ENOSYS; 1050 return -ENOSYS;
1044 } 1051 }
1045 1052
1046 buf = transport_kmap_first_data_page(cmd); 1053 buf = transport_kmap_data_sg(cmd);
1047 1054
1048 if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { 1055 if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) {
1049 /* 1056 /*
@@ -1051,11 +1058,8 @@ int target_emulate_request_sense(struct se_task *task)
1051 */ 1058 */
1052 buf[0] = 0x70; 1059 buf[0] = 0x70;
1053 buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; 1060 buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION;
1054 /* 1061
1055 * Make sure request data length is enough for additional 1062 if (cmd->data_length < 18) {
1056 * sense data.
1057 */
1058 if (cmd->data_length <= 18) {
1059 buf[7] = 0x00; 1063 buf[7] = 0x00;
1060 err = -EINVAL; 1064 err = -EINVAL;
1061 goto end; 1065 goto end;
@@ -1072,11 +1076,8 @@ int target_emulate_request_sense(struct se_task *task)
1072 */ 1076 */
1073 buf[0] = 0x70; 1077 buf[0] = 0x70;
1074 buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE; 1078 buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE;
1075 /* 1079
1076 * Make sure request data length is enough for additional 1080 if (cmd->data_length < 18) {
1077 * sense data.
1078 */
1079 if (cmd->data_length <= 18) {
1080 buf[7] = 0x00; 1081 buf[7] = 0x00;
1081 err = -EINVAL; 1082 err = -EINVAL;
1082 goto end; 1083 goto end;
@@ -1089,7 +1090,7 @@ int target_emulate_request_sense(struct se_task *task)
1089 } 1090 }
1090 1091
1091end: 1092end:
1092 transport_kunmap_first_data_page(cmd); 1093 transport_kunmap_data_sg(cmd);
1093 task->task_scsi_status = GOOD; 1094 task->task_scsi_status = GOOD;
1094 transport_complete_task(task, 1); 1095 transport_complete_task(task, 1);
1095 return 0; 1096 return 0;
@@ -1123,7 +1124,7 @@ int target_emulate_unmap(struct se_task *task)
1123 dl = get_unaligned_be16(&cdb[0]); 1124 dl = get_unaligned_be16(&cdb[0]);
1124 bd_dl = get_unaligned_be16(&cdb[2]); 1125 bd_dl = get_unaligned_be16(&cdb[2]);
1125 1126
1126 buf = transport_kmap_first_data_page(cmd); 1127 buf = transport_kmap_data_sg(cmd);
1127 1128
1128 ptr = &buf[offset]; 1129 ptr = &buf[offset];
1129 pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" 1130 pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu"
@@ -1147,7 +1148,7 @@ int target_emulate_unmap(struct se_task *task)
1147 } 1148 }
1148 1149
1149err: 1150err:
1150 transport_kunmap_first_data_page(cmd); 1151 transport_kunmap_data_sg(cmd);
1151 if (!ret) { 1152 if (!ret) {
1152 task->task_scsi_status = GOOD; 1153 task->task_scsi_status = GOOD;
1153 transport_complete_task(task, 1); 1154 transport_complete_task(task, 1);