aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target/target_core_cdb.c
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2012-01-16 19:57:08 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2012-01-18 03:35:58 -0500
commit4949314c7283ea4f9ade182ca599583b89f7edd6 (patch)
treebbd2316996bc2f19c1b3a8c24f8591f12d2330fa /drivers/target/target_core_cdb.c
parente8904dc5008ef92f0f62391d6557f03f921eeb32 (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.c28
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
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
@@ -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
735out_unmap: 735out_unmap:
736 transport_kunmap_first_data_page(cmd); 736 transport_kunmap_data_sg(cmd);
737out: 737out:
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
1091end: 1091end:
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
1149err: 1149err:
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);