diff options
author | Andy Grover <agrover@redhat.com> | 2012-01-16 19:57:08 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-01-18 03:35:58 -0500 |
commit | 4949314c7283ea4f9ade182ca599583b89f7edd6 (patch) | |
tree | bbd2316996bc2f19c1b3a8c24f8591f12d2330fa /drivers/target/target_core_cdb.c | |
parent | e8904dc5008ef92f0f62391d6557f03f921eeb32 (diff) |
target: Allow control CDBs with data > 1 page
We need to handle >1 page control cdbs, so extend the code to do a vmap
if bigger than 1 page. It seems like kmap() is still preferable if just
a page, fewer TLB shootdowns(?), so keep using that when possible.
Rename function pair for their new scope.
Signed-off-by: Andy Grover <agrover@redhat.com>
Cc: <stable@vger.kernel.org>
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 | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c index 2f2235edeff..07a3025d062 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 | ||
@@ -716,7 +716,7 @@ int target_emulate_inquiry(struct se_task *task) | |||
716 | return -EINVAL; | 716 | return -EINVAL; |
717 | } | 717 | } |
718 | 718 | ||
719 | buf = transport_kmap_first_data_page(cmd); | 719 | buf = transport_kmap_data_sg(cmd); |
720 | 720 | ||
721 | buf[0] = dev->transport->get_device_type(dev); | 721 | buf[0] = dev->transport->get_device_type(dev); |
722 | 722 | ||
@@ -733,7 +733,7 @@ int target_emulate_inquiry(struct se_task *task) | |||
733 | ret = -EINVAL; | 733 | ret = -EINVAL; |
734 | 734 | ||
735 | out_unmap: | 735 | out_unmap: |
736 | transport_kunmap_first_data_page(cmd); | 736 | transport_kunmap_data_sg(cmd); |
737 | out: | 737 | out: |
738 | if (!ret) { | 738 | if (!ret) { |
739 | task->task_scsi_status = GOOD; | 739 | task->task_scsi_status = GOOD; |
@@ -755,7 +755,7 @@ int target_emulate_readcapacity(struct se_task *task) | |||
755 | else | 755 | else |
756 | blocks = (u32)blocks_long; | 756 | blocks = (u32)blocks_long; |
757 | 757 | ||
758 | buf = transport_kmap_first_data_page(cmd); | 758 | buf = transport_kmap_data_sg(cmd); |
759 | 759 | ||
760 | buf[0] = (blocks >> 24) & 0xff; | 760 | buf[0] = (blocks >> 24) & 0xff; |
761 | buf[1] = (blocks >> 16) & 0xff; | 761 | buf[1] = (blocks >> 16) & 0xff; |
@@ -771,7 +771,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) | 771 | 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]); | 772 | put_unaligned_be32(0xFFFFFFFF, &buf[0]); |
773 | 773 | ||
774 | transport_kunmap_first_data_page(cmd); | 774 | transport_kunmap_data_sg(cmd); |
775 | 775 | ||
776 | task->task_scsi_status = GOOD; | 776 | task->task_scsi_status = GOOD; |
777 | transport_complete_task(task, 1); | 777 | transport_complete_task(task, 1); |
@@ -785,7 +785,7 @@ int target_emulate_readcapacity_16(struct se_task *task) | |||
785 | unsigned char *buf; | 785 | unsigned char *buf; |
786 | unsigned long long blocks = dev->transport->get_blocks(dev); | 786 | unsigned long long blocks = dev->transport->get_blocks(dev); |
787 | 787 | ||
788 | buf = transport_kmap_first_data_page(cmd); | 788 | buf = transport_kmap_data_sg(cmd); |
789 | 789 | ||
790 | buf[0] = (blocks >> 56) & 0xff; | 790 | buf[0] = (blocks >> 56) & 0xff; |
791 | buf[1] = (blocks >> 48) & 0xff; | 791 | buf[1] = (blocks >> 48) & 0xff; |
@@ -806,7 +806,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) | 806 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) |
807 | buf[14] = 0x80; | 807 | buf[14] = 0x80; |
808 | 808 | ||
809 | transport_kunmap_first_data_page(cmd); | 809 | transport_kunmap_data_sg(cmd); |
810 | 810 | ||
811 | task->task_scsi_status = GOOD; | 811 | task->task_scsi_status = GOOD; |
812 | transport_complete_task(task, 1); | 812 | transport_complete_task(task, 1); |
@@ -1019,9 +1019,9 @@ int target_emulate_modesense(struct se_task *task) | |||
1019 | offset = cmd->data_length; | 1019 | offset = cmd->data_length; |
1020 | } | 1020 | } |
1021 | 1021 | ||
1022 | rbuf = transport_kmap_first_data_page(cmd); | 1022 | rbuf = transport_kmap_data_sg(cmd); |
1023 | memcpy(rbuf, buf, offset); | 1023 | memcpy(rbuf, buf, offset); |
1024 | transport_kunmap_first_data_page(cmd); | 1024 | transport_kunmap_data_sg(cmd); |
1025 | 1025 | ||
1026 | task->task_scsi_status = GOOD; | 1026 | task->task_scsi_status = GOOD; |
1027 | transport_complete_task(task, 1); | 1027 | transport_complete_task(task, 1); |
@@ -1043,7 +1043,7 @@ int target_emulate_request_sense(struct se_task *task) | |||
1043 | return -ENOSYS; | 1043 | return -ENOSYS; |
1044 | } | 1044 | } |
1045 | 1045 | ||
1046 | buf = transport_kmap_first_data_page(cmd); | 1046 | buf = transport_kmap_data_sg(cmd); |
1047 | 1047 | ||
1048 | if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { | 1048 | if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { |
1049 | /* | 1049 | /* |
@@ -1089,7 +1089,7 @@ int target_emulate_request_sense(struct se_task *task) | |||
1089 | } | 1089 | } |
1090 | 1090 | ||
1091 | end: | 1091 | end: |
1092 | transport_kunmap_first_data_page(cmd); | 1092 | transport_kunmap_data_sg(cmd); |
1093 | task->task_scsi_status = GOOD; | 1093 | task->task_scsi_status = GOOD; |
1094 | transport_complete_task(task, 1); | 1094 | transport_complete_task(task, 1); |
1095 | return 0; | 1095 | return 0; |
@@ -1123,7 +1123,7 @@ int target_emulate_unmap(struct se_task *task) | |||
1123 | dl = get_unaligned_be16(&cdb[0]); | 1123 | dl = get_unaligned_be16(&cdb[0]); |
1124 | bd_dl = get_unaligned_be16(&cdb[2]); | 1124 | bd_dl = get_unaligned_be16(&cdb[2]); |
1125 | 1125 | ||
1126 | buf = transport_kmap_first_data_page(cmd); | 1126 | buf = transport_kmap_data_sg(cmd); |
1127 | 1127 | ||
1128 | ptr = &buf[offset]; | 1128 | ptr = &buf[offset]; |
1129 | pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" | 1129 | pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" |
@@ -1147,7 +1147,7 @@ int target_emulate_unmap(struct se_task *task) | |||
1147 | } | 1147 | } |
1148 | 1148 | ||
1149 | err: | 1149 | err: |
1150 | transport_kunmap_first_data_page(cmd); | 1150 | transport_kunmap_data_sg(cmd); |
1151 | if (!ret) { | 1151 | if (!ret) { |
1152 | task->task_scsi_status = GOOD; | 1152 | task->task_scsi_status = GOOD; |
1153 | transport_complete_task(task, 1); | 1153 | transport_complete_task(task, 1); |