diff options
Diffstat (limited to 'drivers/target/target_core_cdb.c')
-rw-r--r-- | drivers/target/target_core_cdb.c | 51 |
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 | ||
136 | out: | 136 | out: |
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 | ||
735 | out_unmap: | 742 | out_unmap: |
736 | transport_kunmap_first_data_page(cmd); | 743 | transport_kunmap_data_sg(cmd); |
737 | out: | 744 | out: |
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 | ||
1091 | end: | 1092 | end: |
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 | ||
1149 | err: | 1150 | err: |
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); |