aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Grover <agrover@redhat.com>2011-07-20 15:13:28 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-07-22 05:37:48 -0400
commit05d1c7c0d0db4cc25548d9aadebb416888a82327 (patch)
tree290243526d188a7f6a683b0e13a63c7207471fa1
parente22a7f075226c51f3f71b922e9eeb4f99fac1475 (diff)
target: Make all control CDBs scatter-gather
Previously, some control CDBs did not allocate memory in pages for their data buffer, but just did a kmalloc. This patch makes all cdbs allocate pages. This has the benefit of streamlining some paths that had to behave differently when we used two allocation methods. The downside is that all accesses to the data buffer need to kmap it before use, and need to handle data in page-sized chunks if more than a page is needed for a given command's data buffer. Finally, note that cdbs with no data buffers are handled a little differently. Before, SCSI_NON_DATA_CDBs would not call get_mem at all (they'd be in the final else in transport_allocate_resources) but now these will make it into generic_get_mem, but just not allocate any buffers. Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/target_core_alua.c42
-rw-r--r--drivers/target/target_core_cdb.c69
-rw-r--r--drivers/target/target_core_device.c5
-rw-r--r--drivers/target/target_core_pr.c60
-rw-r--r--drivers/target/target_core_pscsi.c32
-rw-r--r--drivers/target/target_core_transport.c159
-rw-r--r--drivers/target/tcm_fc/tfc_cmd.c4
-rw-r--r--drivers/target/tcm_fc/tfc_io.c61
-rw-r--r--include/target/target_core_base.h5
-rw-r--r--include/target/target_core_transport.h6
10 files changed, 218 insertions, 225 deletions
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index 76d506fe99e0..dba412ff3718 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -65,10 +65,12 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd)
65 struct se_port *port; 65 struct se_port *port;
66 struct t10_alua_tg_pt_gp *tg_pt_gp; 66 struct t10_alua_tg_pt_gp *tg_pt_gp;
67 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; 67 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
68 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 68 unsigned char *buf;
69 u32 rd_len = 0, off = 4; /* Skip over RESERVED area to first 69 u32 rd_len = 0, off = 4; /* Skip over RESERVED area to first
70 Target port group descriptor */ 70 Target port group descriptor */
71 71
72 buf = transport_kmap_first_data_page(cmd);
73
72 spin_lock(&su_dev->t10_alua.tg_pt_gps_lock); 74 spin_lock(&su_dev->t10_alua.tg_pt_gps_lock);
73 list_for_each_entry(tg_pt_gp, &su_dev->t10_alua.tg_pt_gps_list, 75 list_for_each_entry(tg_pt_gp, &su_dev->t10_alua.tg_pt_gps_list,
74 tg_pt_gp_list) { 76 tg_pt_gp_list) {
@@ -141,6 +143,8 @@ int core_emulate_report_target_port_groups(struct se_cmd *cmd)
141 buf[2] = ((rd_len >> 8) & 0xff); 143 buf[2] = ((rd_len >> 8) & 0xff);
142 buf[3] = (rd_len & 0xff); 144 buf[3] = (rd_len & 0xff);
143 145
146 transport_kunmap_first_data_page(cmd);
147
144 return 0; 148 return 0;
145} 149}
146 150
@@ -157,14 +161,17 @@ int core_emulate_set_target_port_groups(struct se_cmd *cmd)
157 struct se_node_acl *nacl = cmd->se_sess->se_node_acl; 161 struct se_node_acl *nacl = cmd->se_sess->se_node_acl;
158 struct t10_alua_tg_pt_gp *tg_pt_gp = NULL, *l_tg_pt_gp; 162 struct t10_alua_tg_pt_gp *tg_pt_gp = NULL, *l_tg_pt_gp;
159 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem, *l_tg_pt_gp_mem; 163 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem, *l_tg_pt_gp_mem;
160 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 164 unsigned char *buf;
161 unsigned char *ptr = &buf[4]; /* Skip over RESERVED area in header */ 165 unsigned char *ptr;
162 u32 len = 4; /* Skip over RESERVED area in header */ 166 u32 len = 4; /* Skip over RESERVED area in header */
163 int alua_access_state, primary = 0, rc; 167 int alua_access_state, primary = 0, rc;
164 u16 tg_pt_id, rtpi; 168 u16 tg_pt_id, rtpi;
165 169
166 if (!(l_port)) 170 if (!(l_port))
167 return PYX_TRANSPORT_LU_COMM_FAILURE; 171 return PYX_TRANSPORT_LU_COMM_FAILURE;
172
173 buf = transport_kmap_first_data_page(cmd);
174
168 /* 175 /*
169 * Determine if explict ALUA via SET_TARGET_PORT_GROUPS is allowed 176 * Determine if explict ALUA via SET_TARGET_PORT_GROUPS is allowed
170 * for the local tg_pt_gp. 177 * for the local tg_pt_gp.
@@ -172,14 +179,16 @@ int core_emulate_set_target_port_groups(struct se_cmd *cmd)
172 l_tg_pt_gp_mem = l_port->sep_alua_tg_pt_gp_mem; 179 l_tg_pt_gp_mem = l_port->sep_alua_tg_pt_gp_mem;
173 if (!(l_tg_pt_gp_mem)) { 180 if (!(l_tg_pt_gp_mem)) {
174 printk(KERN_ERR "Unable to access l_port->sep_alua_tg_pt_gp_mem\n"); 181 printk(KERN_ERR "Unable to access l_port->sep_alua_tg_pt_gp_mem\n");
175 return PYX_TRANSPORT_UNKNOWN_SAM_OPCODE; 182 rc = PYX_TRANSPORT_UNKNOWN_SAM_OPCODE;
183 goto out;
176 } 184 }
177 spin_lock(&l_tg_pt_gp_mem->tg_pt_gp_mem_lock); 185 spin_lock(&l_tg_pt_gp_mem->tg_pt_gp_mem_lock);
178 l_tg_pt_gp = l_tg_pt_gp_mem->tg_pt_gp; 186 l_tg_pt_gp = l_tg_pt_gp_mem->tg_pt_gp;
179 if (!(l_tg_pt_gp)) { 187 if (!(l_tg_pt_gp)) {
180 spin_unlock(&l_tg_pt_gp_mem->tg_pt_gp_mem_lock); 188 spin_unlock(&l_tg_pt_gp_mem->tg_pt_gp_mem_lock);
181 printk(KERN_ERR "Unable to access *l_tg_pt_gp_mem->tg_pt_gp\n"); 189 printk(KERN_ERR "Unable to access *l_tg_pt_gp_mem->tg_pt_gp\n");
182 return PYX_TRANSPORT_UNKNOWN_SAM_OPCODE; 190 rc = PYX_TRANSPORT_UNKNOWN_SAM_OPCODE;
191 goto out;
183 } 192 }
184 rc = (l_tg_pt_gp->tg_pt_gp_alua_access_type & TPGS_EXPLICT_ALUA); 193 rc = (l_tg_pt_gp->tg_pt_gp_alua_access_type & TPGS_EXPLICT_ALUA);
185 spin_unlock(&l_tg_pt_gp_mem->tg_pt_gp_mem_lock); 194 spin_unlock(&l_tg_pt_gp_mem->tg_pt_gp_mem_lock);
@@ -187,9 +196,12 @@ int core_emulate_set_target_port_groups(struct se_cmd *cmd)
187 if (!(rc)) { 196 if (!(rc)) {
188 printk(KERN_INFO "Unable to process SET_TARGET_PORT_GROUPS" 197 printk(KERN_INFO "Unable to process SET_TARGET_PORT_GROUPS"
189 " while TPGS_EXPLICT_ALUA is disabled\n"); 198 " while TPGS_EXPLICT_ALUA is disabled\n");
190 return PYX_TRANSPORT_UNKNOWN_SAM_OPCODE; 199 rc = PYX_TRANSPORT_UNKNOWN_SAM_OPCODE;
200 goto out;
191 } 201 }
192 202
203 ptr = &buf[4]; /* Skip over RESERVED area in header */
204
193 while (len < cmd->data_length) { 205 while (len < cmd->data_length) {
194 alua_access_state = (ptr[0] & 0x0f); 206 alua_access_state = (ptr[0] & 0x0f);
195 /* 207 /*
@@ -209,7 +221,8 @@ int core_emulate_set_target_port_groups(struct se_cmd *cmd)
209 * REQUEST, and the additional sense code set to INVALID 221 * REQUEST, and the additional sense code set to INVALID
210 * FIELD IN PARAMETER LIST. 222 * FIELD IN PARAMETER LIST.
211 */ 223 */
212 return PYX_TRANSPORT_INVALID_PARAMETER_LIST; 224 rc = PYX_TRANSPORT_INVALID_PARAMETER_LIST;
225 goto out;
213 } 226 }
214 rc = -1; 227 rc = -1;
215 /* 228 /*
@@ -260,8 +273,10 @@ int core_emulate_set_target_port_groups(struct se_cmd *cmd)
260 * If not matching target port group ID can be located 273 * If not matching target port group ID can be located
261 * throw an exception with ASCQ: INVALID_PARAMETER_LIST 274 * throw an exception with ASCQ: INVALID_PARAMETER_LIST
262 */ 275 */
263 if (rc != 0) 276 if (rc != 0) {
264 return PYX_TRANSPORT_INVALID_PARAMETER_LIST; 277 rc = PYX_TRANSPORT_INVALID_PARAMETER_LIST;
278 goto out;
279 }
265 } else { 280 } else {
266 /* 281 /*
267 * Extact the RELATIVE TARGET PORT IDENTIFIER to identify 282 * Extact the RELATIVE TARGET PORT IDENTIFIER to identify
@@ -295,14 +310,19 @@ int core_emulate_set_target_port_groups(struct se_cmd *cmd)
295 * be located, throw an exception with ASCQ: 310 * be located, throw an exception with ASCQ:
296 * INVALID_PARAMETER_LIST 311 * INVALID_PARAMETER_LIST
297 */ 312 */
298 if (rc != 0) 313 if (rc != 0) {
299 return PYX_TRANSPORT_INVALID_PARAMETER_LIST; 314 rc = PYX_TRANSPORT_INVALID_PARAMETER_LIST;
315 goto out;
316 }
300 } 317 }
301 318
302 ptr += 4; 319 ptr += 4;
303 len += 4; 320 len += 4;
304 } 321 }
305 322
323out:
324 transport_kunmap_first_data_page(cmd);
325
306 return 0; 326 return 0;
307} 327}
308 328
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c
index 432253034de0..418282d926fa 100644
--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -66,7 +66,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
66{ 66{
67 struct se_lun *lun = cmd->se_lun; 67 struct se_lun *lun = cmd->se_lun;
68 struct se_device *dev = cmd->se_dev; 68 struct se_device *dev = cmd->se_dev;
69 unsigned char *buf = cmd->t_task_buf; 69 unsigned char *buf;
70 70
71 /* 71 /*
72 * Make sure we at least have 6 bytes of INQUIRY response 72 * Make sure we at least have 6 bytes of INQUIRY response
@@ -78,6 +78,8 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
78 return -EINVAL; 78 return -EINVAL;
79 } 79 }
80 80
81 buf = transport_kmap_first_data_page(cmd);
82
81 buf[0] = dev->transport->get_device_type(dev); 83 buf[0] = dev->transport->get_device_type(dev);
82 if (buf[0] == TYPE_TAPE) 84 if (buf[0] == TYPE_TAPE)
83 buf[1] = 0x80; 85 buf[1] = 0x80;
@@ -91,7 +93,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
91 93
92 if (cmd->data_length < 8) { 94 if (cmd->data_length < 8) {
93 buf[4] = 1; /* Set additional length to 1 */ 95 buf[4] = 1; /* Set additional length to 1 */
94 return 0; 96 goto out;
95 } 97 }
96 98
97 buf[7] = 0x32; /* Sync=1 and CmdQue=1 */ 99 buf[7] = 0x32; /* Sync=1 and CmdQue=1 */
@@ -102,7 +104,7 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
102 */ 104 */
103 if (cmd->data_length < 36) { 105 if (cmd->data_length < 36) {
104 buf[4] = 3; /* Set additional length to 3 */ 106 buf[4] = 3; /* Set additional length to 3 */
105 return 0; 107 goto out;
106 } 108 }
107 109
108 snprintf((unsigned char *)&buf[8], 8, "LIO-ORG"); 110 snprintf((unsigned char *)&buf[8], 8, "LIO-ORG");
@@ -111,6 +113,9 @@ target_emulate_inquiry_std(struct se_cmd *cmd)
111 snprintf((unsigned char *)&buf[32], 4, "%s", 113 snprintf((unsigned char *)&buf[32], 4, "%s",
112 &dev->se_sub_dev->t10_wwn.revision[0]); 114 &dev->se_sub_dev->t10_wwn.revision[0]);
113 buf[4] = 31; /* Set additional length to 31 */ 115 buf[4] = 31; /* Set additional length to 31 */
116
117out:
118 transport_kunmap_first_data_page(cmd);
114 return 0; 119 return 0;
115} 120}
116 121
@@ -647,9 +652,9 @@ static int
647target_emulate_inquiry(struct se_cmd *cmd) 652target_emulate_inquiry(struct se_cmd *cmd)
648{ 653{
649 struct se_device *dev = cmd->se_dev; 654 struct se_device *dev = cmd->se_dev;
650 unsigned char *buf = cmd->t_task_buf; 655 unsigned char *buf;
651 unsigned char *cdb = cmd->t_task_cdb; 656 unsigned char *cdb = cmd->t_task_cdb;
652 int p; 657 int p, ret;
653 658
654 if (!(cdb[1] & 0x1)) 659 if (!(cdb[1] & 0x1))
655 return target_emulate_inquiry_std(cmd); 660 return target_emulate_inquiry_std(cmd);
@@ -666,14 +671,20 @@ target_emulate_inquiry(struct se_cmd *cmd)
666 " too small for EVPD=1\n", cmd->data_length); 671 " too small for EVPD=1\n", cmd->data_length);
667 return -EINVAL; 672 return -EINVAL;
668 } 673 }
674
675 buf = transport_kmap_first_data_page(cmd);
676
669 buf[0] = dev->transport->get_device_type(dev); 677 buf[0] = dev->transport->get_device_type(dev);
670 678
671 for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) 679 for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p)
672 if (cdb[2] == evpd_handlers[p].page) { 680 if (cdb[2] == evpd_handlers[p].page) {
673 buf[1] = cdb[2]; 681 buf[1] = cdb[2];
674 return evpd_handlers[p].emulate(cmd, buf); 682 ret = evpd_handlers[p].emulate(cmd, buf);
683 transport_kunmap_first_data_page(cmd);
684 return ret;
675 } 685 }
676 686
687 transport_kunmap_first_data_page(cmd);
677 printk(KERN_ERR "Unknown VPD Code: 0x%02x\n", cdb[2]); 688 printk(KERN_ERR "Unknown VPD Code: 0x%02x\n", cdb[2]);
678 return -EINVAL; 689 return -EINVAL;
679} 690}
@@ -682,7 +693,7 @@ static int
682target_emulate_readcapacity(struct se_cmd *cmd) 693target_emulate_readcapacity(struct se_cmd *cmd)
683{ 694{
684 struct se_device *dev = cmd->se_dev; 695 struct se_device *dev = cmd->se_dev;
685 unsigned char *buf = cmd->t_task_buf; 696 unsigned char *buf;
686 unsigned long long blocks_long = dev->transport->get_blocks(dev); 697 unsigned long long blocks_long = dev->transport->get_blocks(dev);
687 u32 blocks; 698 u32 blocks;
688 699
@@ -691,6 +702,8 @@ target_emulate_readcapacity(struct se_cmd *cmd)
691 else 702 else
692 blocks = (u32)blocks_long; 703 blocks = (u32)blocks_long;
693 704
705 buf = transport_kmap_first_data_page(cmd);
706
694 buf[0] = (blocks >> 24) & 0xff; 707 buf[0] = (blocks >> 24) & 0xff;
695 buf[1] = (blocks >> 16) & 0xff; 708 buf[1] = (blocks >> 16) & 0xff;
696 buf[2] = (blocks >> 8) & 0xff; 709 buf[2] = (blocks >> 8) & 0xff;
@@ -705,6 +718,8 @@ target_emulate_readcapacity(struct se_cmd *cmd)
705 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) 718 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
706 put_unaligned_be32(0xFFFFFFFF, &buf[0]); 719 put_unaligned_be32(0xFFFFFFFF, &buf[0]);
707 720
721 transport_kunmap_first_data_page(cmd);
722
708 return 0; 723 return 0;
709} 724}
710 725
@@ -712,9 +727,11 @@ static int
712target_emulate_readcapacity_16(struct se_cmd *cmd) 727target_emulate_readcapacity_16(struct se_cmd *cmd)
713{ 728{
714 struct se_device *dev = cmd->se_dev; 729 struct se_device *dev = cmd->se_dev;
715 unsigned char *buf = cmd->t_task_buf; 730 unsigned char *buf;
716 unsigned long long blocks = dev->transport->get_blocks(dev); 731 unsigned long long blocks = dev->transport->get_blocks(dev);
717 732
733 buf = transport_kmap_first_data_page(cmd);
734
718 buf[0] = (blocks >> 56) & 0xff; 735 buf[0] = (blocks >> 56) & 0xff;
719 buf[1] = (blocks >> 48) & 0xff; 736 buf[1] = (blocks >> 48) & 0xff;
720 buf[2] = (blocks >> 40) & 0xff; 737 buf[2] = (blocks >> 40) & 0xff;
@@ -734,6 +751,8 @@ target_emulate_readcapacity_16(struct se_cmd *cmd)
734 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) 751 if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws)
735 buf[14] = 0x80; 752 buf[14] = 0x80;
736 753
754 transport_kunmap_first_data_page(cmd);
755
737 return 0; 756 return 0;
738} 757}
739 758
@@ -848,7 +867,7 @@ target_emulate_modesense(struct se_cmd *cmd, int ten)
848{ 867{
849 struct se_device *dev = cmd->se_dev; 868 struct se_device *dev = cmd->se_dev;
850 char *cdb = cmd->t_task_cdb; 869 char *cdb = cmd->t_task_cdb;
851 unsigned char *rbuf = cmd->t_task_buf; 870 unsigned char *rbuf;
852 int type = dev->transport->get_device_type(dev); 871 int type = dev->transport->get_device_type(dev);
853 int offset = (ten) ? 8 : 4; 872 int offset = (ten) ? 8 : 4;
854 int length = 0; 873 int length = 0;
@@ -911,7 +930,10 @@ target_emulate_modesense(struct se_cmd *cmd, int ten)
911 if ((offset + 1) > cmd->data_length) 930 if ((offset + 1) > cmd->data_length)
912 offset = cmd->data_length; 931 offset = cmd->data_length;
913 } 932 }
933
934 rbuf = transport_kmap_first_data_page(cmd);
914 memcpy(rbuf, buf, offset); 935 memcpy(rbuf, buf, offset);
936 transport_kunmap_first_data_page(cmd);
915 937
916 return 0; 938 return 0;
917} 939}
@@ -920,14 +942,18 @@ static int
920target_emulate_request_sense(struct se_cmd *cmd) 942target_emulate_request_sense(struct se_cmd *cmd)
921{ 943{
922 unsigned char *cdb = cmd->t_task_cdb; 944 unsigned char *cdb = cmd->t_task_cdb;
923 unsigned char *buf = cmd->t_task_buf; 945 unsigned char *buf;
924 u8 ua_asc = 0, ua_ascq = 0; 946 u8 ua_asc = 0, ua_ascq = 0;
947 int err = 0;
925 948
926 if (cdb[1] & 0x01) { 949 if (cdb[1] & 0x01) {
927 printk(KERN_ERR "REQUEST_SENSE description emulation not" 950 printk(KERN_ERR "REQUEST_SENSE description emulation not"
928 " supported\n"); 951 " supported\n");
929 return PYX_TRANSPORT_INVALID_CDB_FIELD; 952 return PYX_TRANSPORT_INVALID_CDB_FIELD;
930 } 953 }
954
955 buf = transport_kmap_first_data_page(cmd);
956
931 if (!(core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq))) { 957 if (!(core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq))) {
932 /* 958 /*
933 * CURRENT ERROR, UNIT ATTENTION 959 * CURRENT ERROR, UNIT ATTENTION
@@ -940,7 +966,8 @@ target_emulate_request_sense(struct se_cmd *cmd)
940 */ 966 */
941 if (cmd->data_length <= 18) { 967 if (cmd->data_length <= 18) {
942 buf[7] = 0x00; 968 buf[7] = 0x00;
943 return 0; 969 err = -EINVAL;
970 goto end;
944 } 971 }
945 /* 972 /*
946 * The Additional Sense Code (ASC) from the UNIT ATTENTION 973 * The Additional Sense Code (ASC) from the UNIT ATTENTION
@@ -960,7 +987,8 @@ target_emulate_request_sense(struct se_cmd *cmd)
960 */ 987 */
961 if (cmd->data_length <= 18) { 988 if (cmd->data_length <= 18) {
962 buf[7] = 0x00; 989 buf[7] = 0x00;
963 return 0; 990 err = -EINVAL;
991 goto end;
964 } 992 }
965 /* 993 /*
966 * NO ADDITIONAL SENSE INFORMATION 994 * NO ADDITIONAL SENSE INFORMATION
@@ -969,6 +997,9 @@ target_emulate_request_sense(struct se_cmd *cmd)
969 buf[7] = 0x0A; 997 buf[7] = 0x0A;
970 } 998 }
971 999
1000end:
1001 transport_kunmap_first_data_page(cmd);
1002
972 return 0; 1003 return 0;
973} 1004}
974 1005
@@ -981,11 +1012,11 @@ target_emulate_unmap(struct se_task *task)
981{ 1012{
982 struct se_cmd *cmd = task->task_se_cmd; 1013 struct se_cmd *cmd = task->task_se_cmd;
983 struct se_device *dev = cmd->se_dev; 1014 struct se_device *dev = cmd->se_dev;
984 unsigned char *buf = cmd->t_task_buf, *ptr = NULL; 1015 unsigned char *buf, *ptr = NULL;
985 unsigned char *cdb = &cmd->t_task_cdb[0]; 1016 unsigned char *cdb = &cmd->t_task_cdb[0];
986 sector_t lba; 1017 sector_t lba;
987 unsigned int size = cmd->data_length, range; 1018 unsigned int size = cmd->data_length, range;
988 int ret, offset; 1019 int ret = 0, offset;
989 unsigned short dl, bd_dl; 1020 unsigned short dl, bd_dl;
990 1021
991 /* First UNMAP block descriptor starts at 8 byte offset */ 1022 /* First UNMAP block descriptor starts at 8 byte offset */
@@ -993,6 +1024,9 @@ target_emulate_unmap(struct se_task *task)
993 size -= 8; 1024 size -= 8;
994 dl = get_unaligned_be16(&cdb[0]); 1025 dl = get_unaligned_be16(&cdb[0]);
995 bd_dl = get_unaligned_be16(&cdb[2]); 1026 bd_dl = get_unaligned_be16(&cdb[2]);
1027
1028 buf = transport_kmap_first_data_page(cmd);
1029
996 ptr = &buf[offset]; 1030 ptr = &buf[offset];
997 printk(KERN_INFO "UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" 1031 printk(KERN_INFO "UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu"
998 " ptr: %p\n", dev->transport->name, dl, bd_dl, size, ptr); 1032 " ptr: %p\n", dev->transport->name, dl, bd_dl, size, ptr);
@@ -1007,7 +1041,7 @@ target_emulate_unmap(struct se_task *task)
1007 if (ret < 0) { 1041 if (ret < 0) {
1008 printk(KERN_ERR "blkdev_issue_discard() failed: %d\n", 1042 printk(KERN_ERR "blkdev_issue_discard() failed: %d\n",
1009 ret); 1043 ret);
1010 return ret; 1044 goto err;
1011 } 1045 }
1012 1046
1013 ptr += 16; 1047 ptr += 16;
@@ -1016,7 +1050,10 @@ target_emulate_unmap(struct se_task *task)
1016 1050
1017 task->task_scsi_status = GOOD; 1051 task->task_scsi_status = GOOD;
1018 transport_complete_task(task, 1); 1052 transport_complete_task(task, 1);
1019 return 0; 1053err:
1054 transport_kunmap_first_data_page(cmd);
1055
1056 return ret;
1020} 1057}
1021 1058
1022/* 1059/*
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
index 440e6b69d47b..1185c3b76d47 100644
--- a/drivers/target/target_core_device.c
+++ b/drivers/target/target_core_device.c
@@ -657,7 +657,7 @@ int transport_core_report_lun_response(struct se_cmd *se_cmd)
657 struct se_lun *se_lun; 657 struct se_lun *se_lun;
658 struct se_session *se_sess = se_cmd->se_sess; 658 struct se_session *se_sess = se_cmd->se_sess;
659 struct se_task *se_task; 659 struct se_task *se_task;
660 unsigned char *buf = se_cmd->t_task_buf; 660 unsigned char *buf;
661 u32 cdb_offset = 0, lun_count = 0, offset = 8, i; 661 u32 cdb_offset = 0, lun_count = 0, offset = 8, i;
662 662
663 list_for_each_entry(se_task, &se_cmd->t_task_list, t_list) 663 list_for_each_entry(se_task, &se_cmd->t_task_list, t_list)
@@ -668,6 +668,8 @@ int transport_core_report_lun_response(struct se_cmd *se_cmd)
668 return PYX_TRANSPORT_LU_COMM_FAILURE; 668 return PYX_TRANSPORT_LU_COMM_FAILURE;
669 } 669 }
670 670
671 buf = transport_kmap_first_data_page(se_cmd);
672
671 /* 673 /*
672 * If no struct se_session pointer is present, this struct se_cmd is 674 * If no struct se_session pointer is present, this struct se_cmd is
673 * coming via a target_core_mod PASSTHROUGH op, and not through 675 * coming via a target_core_mod PASSTHROUGH op, and not through
@@ -704,6 +706,7 @@ int transport_core_report_lun_response(struct se_cmd *se_cmd)
704 * See SPC3 r07, page 159. 706 * See SPC3 r07, page 159.
705 */ 707 */
706done: 708done:
709 transport_kunmap_first_data_page(se_cmd);
707 lun_count *= 8; 710 lun_count *= 8;
708 buf[0] = ((lun_count >> 24) & 0xff); 711 buf[0] = ((lun_count >> 24) & 0xff);
709 buf[1] = ((lun_count >> 16) & 0xff); 712 buf[1] = ((lun_count >> 16) & 0xff);
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c
index 4fdede8da0c6..3342843f8619 100644
--- a/drivers/target/target_core_pr.c
+++ b/drivers/target/target_core_pr.c
@@ -1482,7 +1482,7 @@ static int core_scsi3_decode_spec_i_port(
1482 struct list_head tid_dest_list; 1482 struct list_head tid_dest_list;
1483 struct pr_transport_id_holder *tidh_new, *tidh, *tidh_tmp; 1483 struct pr_transport_id_holder *tidh_new, *tidh, *tidh_tmp;
1484 struct target_core_fabric_ops *tmp_tf_ops; 1484 struct target_core_fabric_ops *tmp_tf_ops;
1485 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 1485 unsigned char *buf;
1486 unsigned char *ptr, *i_str = NULL, proto_ident, tmp_proto_ident; 1486 unsigned char *ptr, *i_str = NULL, proto_ident, tmp_proto_ident;
1487 char *iport_ptr = NULL, dest_iport[64], i_buf[PR_REG_ISID_ID_LEN]; 1487 char *iport_ptr = NULL, dest_iport[64], i_buf[PR_REG_ISID_ID_LEN];
1488 u32 tpdl, tid_len = 0; 1488 u32 tpdl, tid_len = 0;
@@ -1524,6 +1524,8 @@ static int core_scsi3_decode_spec_i_port(
1524 */ 1524 */
1525 tidh_new->dest_local_nexus = 1; 1525 tidh_new->dest_local_nexus = 1;
1526 list_add_tail(&tidh_new->dest_list, &tid_dest_list); 1526 list_add_tail(&tidh_new->dest_list, &tid_dest_list);
1527
1528 buf = transport_kmap_first_data_page(cmd);
1527 /* 1529 /*
1528 * For a PERSISTENT RESERVE OUT specify initiator ports payload, 1530 * For a PERSISTENT RESERVE OUT specify initiator ports payload,
1529 * first extract TransportID Parameter Data Length, and make sure 1531 * first extract TransportID Parameter Data Length, and make sure
@@ -1760,6 +1762,9 @@ static int core_scsi3_decode_spec_i_port(
1760 tid_len = 0; 1762 tid_len = 0;
1761 1763
1762 } 1764 }
1765
1766 transport_kunmap_first_data_page(cmd);
1767
1763 /* 1768 /*
1764 * Go ahead and create a registrations from tid_dest_list for the 1769 * Go ahead and create a registrations from tid_dest_list for the
1765 * SPEC_I_PT provided TransportID for the *tidh referenced dest_node_acl 1770 * SPEC_I_PT provided TransportID for the *tidh referenced dest_node_acl
@@ -1806,6 +1811,7 @@ static int core_scsi3_decode_spec_i_port(
1806 1811
1807 return 0; 1812 return 0;
1808out: 1813out:
1814 transport_kunmap_first_data_page(cmd);
1809 /* 1815 /*
1810 * For the failure case, release everything from tid_dest_list 1816 * For the failure case, release everything from tid_dest_list
1811 * including *dest_pr_reg and the configfs dependances.. 1817 * including *dest_pr_reg and the configfs dependances..
@@ -3307,7 +3313,7 @@ static int core_scsi3_emulate_pro_register_and_move(
3307 struct target_core_fabric_ops *dest_tf_ops = NULL, *tf_ops; 3313 struct target_core_fabric_ops *dest_tf_ops = NULL, *tf_ops;
3308 struct t10_pr_registration *pr_reg, *pr_res_holder, *dest_pr_reg; 3314 struct t10_pr_registration *pr_reg, *pr_res_holder, *dest_pr_reg;
3309 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr; 3315 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
3310 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 3316 unsigned char *buf;
3311 unsigned char *initiator_str; 3317 unsigned char *initiator_str;
3312 char *iport_ptr = NULL, dest_iport[64], i_buf[PR_REG_ISID_ID_LEN]; 3318 char *iport_ptr = NULL, dest_iport[64], i_buf[PR_REG_ISID_ID_LEN];
3313 u32 tid_len, tmp_tid_len; 3319 u32 tid_len, tmp_tid_len;
@@ -3357,17 +3363,21 @@ static int core_scsi3_emulate_pro_register_and_move(
3357 core_scsi3_put_pr_reg(pr_reg); 3363 core_scsi3_put_pr_reg(pr_reg);
3358 return PYX_TRANSPORT_INVALID_PARAMETER_LIST; 3364 return PYX_TRANSPORT_INVALID_PARAMETER_LIST;
3359 } 3365 }
3366
3360 /* 3367 /*
3361 * Determine the Relative Target Port Identifier where the reservation 3368 * Determine the Relative Target Port Identifier where the reservation
3362 * will be moved to for the TransportID containing SCSI initiator WWN 3369 * will be moved to for the TransportID containing SCSI initiator WWN
3363 * information. 3370 * information.
3364 */ 3371 */
3372 buf = transport_kmap_first_data_page(cmd);
3365 rtpi = (buf[18] & 0xff) << 8; 3373 rtpi = (buf[18] & 0xff) << 8;
3366 rtpi |= buf[19] & 0xff; 3374 rtpi |= buf[19] & 0xff;
3367 tid_len = (buf[20] & 0xff) << 24; 3375 tid_len = (buf[20] & 0xff) << 24;
3368 tid_len |= (buf[21] & 0xff) << 16; 3376 tid_len |= (buf[21] & 0xff) << 16;
3369 tid_len |= (buf[22] & 0xff) << 8; 3377 tid_len |= (buf[22] & 0xff) << 8;
3370 tid_len |= buf[23] & 0xff; 3378 tid_len |= buf[23] & 0xff;
3379 transport_kunmap_first_data_page(cmd);
3380 buf = NULL;
3371 3381
3372 if ((tid_len + 24) != cmd->data_length) { 3382 if ((tid_len + 24) != cmd->data_length) {
3373 printk(KERN_ERR "SPC-3 PR: Illegal tid_len: %u + 24 byte header" 3383 printk(KERN_ERR "SPC-3 PR: Illegal tid_len: %u + 24 byte header"
@@ -3414,6 +3424,8 @@ static int core_scsi3_emulate_pro_register_and_move(
3414 core_scsi3_put_pr_reg(pr_reg); 3424 core_scsi3_put_pr_reg(pr_reg);
3415 return PYX_TRANSPORT_INVALID_PARAMETER_LIST; 3425 return PYX_TRANSPORT_INVALID_PARAMETER_LIST;
3416 } 3426 }
3427
3428 buf = transport_kmap_first_data_page(cmd);
3417 proto_ident = (buf[24] & 0x0f); 3429 proto_ident = (buf[24] & 0x0f);
3418#if 0 3430#if 0
3419 printk("SPC-3 PR REGISTER_AND_MOVE: Extracted Protocol Identifier:" 3431 printk("SPC-3 PR REGISTER_AND_MOVE: Extracted Protocol Identifier:"
@@ -3444,6 +3456,9 @@ static int core_scsi3_emulate_pro_register_and_move(
3444 goto out; 3456 goto out;
3445 } 3457 }
3446 3458
3459 transport_kunmap_first_data_page(cmd);
3460 buf = NULL;
3461
3447 printk(KERN_INFO "SPC-3 PR [%s] Extracted initiator %s identifier: %s" 3462 printk(KERN_INFO "SPC-3 PR [%s] Extracted initiator %s identifier: %s"
3448 " %s\n", dest_tf_ops->get_fabric_name(), (iport_ptr != NULL) ? 3463 " %s\n", dest_tf_ops->get_fabric_name(), (iport_ptr != NULL) ?
3449 "port" : "device", initiator_str, (iport_ptr != NULL) ? 3464 "port" : "device", initiator_str, (iport_ptr != NULL) ?
@@ -3696,9 +3711,13 @@ after_iport_check:
3696 " REGISTER_AND_MOVE\n"); 3711 " REGISTER_AND_MOVE\n");
3697 } 3712 }
3698 3713
3714 transport_kunmap_first_data_page(cmd);
3715
3699 core_scsi3_put_pr_reg(dest_pr_reg); 3716 core_scsi3_put_pr_reg(dest_pr_reg);
3700 return 0; 3717 return 0;
3701out: 3718out:
3719 if (buf)
3720 transport_kunmap_first_data_page(cmd);
3702 if (dest_se_deve) 3721 if (dest_se_deve)
3703 core_scsi3_lunacl_undepend_item(dest_se_deve); 3722 core_scsi3_lunacl_undepend_item(dest_se_deve);
3704 if (dest_node_acl) 3723 if (dest_node_acl)
@@ -3723,7 +3742,7 @@ static unsigned long long core_scsi3_extract_reservation_key(unsigned char *cdb)
3723 */ 3742 */
3724static int core_scsi3_emulate_pr_out(struct se_cmd *cmd, unsigned char *cdb) 3743static int core_scsi3_emulate_pr_out(struct se_cmd *cmd, unsigned char *cdb)
3725{ 3744{
3726 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 3745 unsigned char *buf;
3727 u64 res_key, sa_res_key; 3746 u64 res_key, sa_res_key;
3728 int sa, scope, type, aptpl; 3747 int sa, scope, type, aptpl;
3729 int spec_i_pt = 0, all_tg_pt = 0, unreg = 0; 3748 int spec_i_pt = 0, all_tg_pt = 0, unreg = 0;
@@ -3745,6 +3764,8 @@ static int core_scsi3_emulate_pr_out(struct se_cmd *cmd, unsigned char *cdb)
3745 sa = (cdb[1] & 0x1f); 3764 sa = (cdb[1] & 0x1f);
3746 scope = (cdb[2] & 0xf0); 3765 scope = (cdb[2] & 0xf0);
3747 type = (cdb[2] & 0x0f); 3766 type = (cdb[2] & 0x0f);
3767
3768 buf = transport_kmap_first_data_page(cmd);
3748 /* 3769 /*
3749 * From PERSISTENT_RESERVE_OUT parameter list (payload) 3770 * From PERSISTENT_RESERVE_OUT parameter list (payload)
3750 */ 3771 */
@@ -3762,6 +3783,9 @@ static int core_scsi3_emulate_pr_out(struct se_cmd *cmd, unsigned char *cdb)
3762 aptpl = (buf[17] & 0x01); 3783 aptpl = (buf[17] & 0x01);
3763 unreg = (buf[17] & 0x02); 3784 unreg = (buf[17] & 0x02);
3764 } 3785 }
3786 transport_kunmap_first_data_page(cmd);
3787 buf = NULL;
3788
3765 /* 3789 /*
3766 * SPEC_I_PT=1 is only valid for Service action: REGISTER 3790 * SPEC_I_PT=1 is only valid for Service action: REGISTER
3767 */ 3791 */
@@ -3830,7 +3854,7 @@ static int core_scsi3_pri_read_keys(struct se_cmd *cmd)
3830 struct se_device *se_dev = cmd->se_dev; 3854 struct se_device *se_dev = cmd->se_dev;
3831 struct se_subsystem_dev *su_dev = se_dev->se_sub_dev; 3855 struct se_subsystem_dev *su_dev = se_dev->se_sub_dev;
3832 struct t10_pr_registration *pr_reg; 3856 struct t10_pr_registration *pr_reg;
3833 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 3857 unsigned char *buf;
3834 u32 add_len = 0, off = 8; 3858 u32 add_len = 0, off = 8;
3835 3859
3836 if (cmd->data_length < 8) { 3860 if (cmd->data_length < 8) {
@@ -3839,6 +3863,7 @@ static int core_scsi3_pri_read_keys(struct se_cmd *cmd)
3839 return PYX_TRANSPORT_INVALID_CDB_FIELD; 3863 return PYX_TRANSPORT_INVALID_CDB_FIELD;
3840 } 3864 }
3841 3865
3866 buf = transport_kmap_first_data_page(cmd);
3842 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); 3867 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff);
3843 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); 3868 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff);
3844 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff); 3869 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff);
@@ -3872,6 +3897,8 @@ static int core_scsi3_pri_read_keys(struct se_cmd *cmd)
3872 buf[6] = ((add_len >> 8) & 0xff); 3897 buf[6] = ((add_len >> 8) & 0xff);
3873 buf[7] = (add_len & 0xff); 3898 buf[7] = (add_len & 0xff);
3874 3899
3900 transport_kunmap_first_data_page(cmd);
3901
3875 return 0; 3902 return 0;
3876} 3903}
3877 3904
@@ -3885,7 +3912,7 @@ static int core_scsi3_pri_read_reservation(struct se_cmd *cmd)
3885 struct se_device *se_dev = cmd->se_dev; 3912 struct se_device *se_dev = cmd->se_dev;
3886 struct se_subsystem_dev *su_dev = se_dev->se_sub_dev; 3913 struct se_subsystem_dev *su_dev = se_dev->se_sub_dev;
3887 struct t10_pr_registration *pr_reg; 3914 struct t10_pr_registration *pr_reg;
3888 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 3915 unsigned char *buf;
3889 u64 pr_res_key; 3916 u64 pr_res_key;
3890 u32 add_len = 16; /* Hardcoded to 16 when a reservation is held. */ 3917 u32 add_len = 16; /* Hardcoded to 16 when a reservation is held. */
3891 3918
@@ -3895,6 +3922,7 @@ static int core_scsi3_pri_read_reservation(struct se_cmd *cmd)
3895 return PYX_TRANSPORT_INVALID_CDB_FIELD; 3922 return PYX_TRANSPORT_INVALID_CDB_FIELD;
3896 } 3923 }
3897 3924
3925 buf = transport_kmap_first_data_page(cmd);
3898 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); 3926 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff);
3899 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); 3927 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff);
3900 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff); 3928 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff);
@@ -3911,10 +3939,9 @@ static int core_scsi3_pri_read_reservation(struct se_cmd *cmd)
3911 buf[6] = ((add_len >> 8) & 0xff); 3939 buf[6] = ((add_len >> 8) & 0xff);
3912 buf[7] = (add_len & 0xff); 3940 buf[7] = (add_len & 0xff);
3913 3941
3914 if (cmd->data_length < 22) { 3942 if (cmd->data_length < 22)
3915 spin_unlock(&se_dev->dev_reservation_lock); 3943 goto err;
3916 return 0; 3944
3917 }
3918 /* 3945 /*
3919 * Set the Reservation key. 3946 * Set the Reservation key.
3920 * 3947 *
@@ -3951,7 +3978,10 @@ static int core_scsi3_pri_read_reservation(struct se_cmd *cmd)
3951 buf[21] = (pr_reg->pr_res_scope & 0xf0) | 3978 buf[21] = (pr_reg->pr_res_scope & 0xf0) |
3952 (pr_reg->pr_res_type & 0x0f); 3979 (pr_reg->pr_res_type & 0x0f);
3953 } 3980 }
3981
3982err:
3954 spin_unlock(&se_dev->dev_reservation_lock); 3983 spin_unlock(&se_dev->dev_reservation_lock);
3984 transport_kunmap_first_data_page(cmd);
3955 3985
3956 return 0; 3986 return 0;
3957} 3987}
@@ -3965,7 +3995,7 @@ static int core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
3965{ 3995{
3966 struct se_device *dev = cmd->se_dev; 3996 struct se_device *dev = cmd->se_dev;
3967 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr; 3997 struct t10_reservation *pr_tmpl = &dev->se_sub_dev->t10_pr;
3968 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 3998 unsigned char *buf;
3969 u16 add_len = 8; /* Hardcoded to 8. */ 3999 u16 add_len = 8; /* Hardcoded to 8. */
3970 4000
3971 if (cmd->data_length < 6) { 4001 if (cmd->data_length < 6) {
@@ -3974,6 +4004,8 @@ static int core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
3974 return PYX_TRANSPORT_INVALID_CDB_FIELD; 4004 return PYX_TRANSPORT_INVALID_CDB_FIELD;
3975 } 4005 }
3976 4006
4007 buf = transport_kmap_first_data_page(cmd);
4008
3977 buf[0] = ((add_len << 8) & 0xff); 4009 buf[0] = ((add_len << 8) & 0xff);
3978 buf[1] = (add_len & 0xff); 4010 buf[1] = (add_len & 0xff);
3979 buf[2] |= 0x10; /* CRH: Compatible Reservation Hanlding bit. */ 4011 buf[2] |= 0x10; /* CRH: Compatible Reservation Hanlding bit. */
@@ -4004,6 +4036,8 @@ static int core_scsi3_pri_report_capabilities(struct se_cmd *cmd)
4004 buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */ 4036 buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */
4005 buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */ 4037 buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */
4006 4038
4039 transport_kunmap_first_data_page(cmd);
4040
4007 return 0; 4041 return 0;
4008} 4042}
4009 4043
@@ -4020,7 +4054,7 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd)
4020 struct se_portal_group *se_tpg; 4054 struct se_portal_group *se_tpg;
4021 struct t10_pr_registration *pr_reg, *pr_reg_tmp; 4055 struct t10_pr_registration *pr_reg, *pr_reg_tmp;
4022 struct t10_reservation *pr_tmpl = &se_dev->se_sub_dev->t10_pr; 4056 struct t10_reservation *pr_tmpl = &se_dev->se_sub_dev->t10_pr;
4023 unsigned char *buf = (unsigned char *)cmd->t_task_buf; 4057 unsigned char *buf;
4024 u32 add_desc_len = 0, add_len = 0, desc_len, exp_desc_len; 4058 u32 add_desc_len = 0, add_len = 0, desc_len, exp_desc_len;
4025 u32 off = 8; /* off into first Full Status descriptor */ 4059 u32 off = 8; /* off into first Full Status descriptor */
4026 int format_code = 0; 4060 int format_code = 0;
@@ -4031,6 +4065,8 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd)
4031 return PYX_TRANSPORT_INVALID_CDB_FIELD; 4065 return PYX_TRANSPORT_INVALID_CDB_FIELD;
4032 } 4066 }
4033 4067
4068 buf = transport_kmap_first_data_page(cmd);
4069
4034 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff); 4070 buf[0] = ((su_dev->t10_pr.pr_generation >> 24) & 0xff);
4035 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff); 4071 buf[1] = ((su_dev->t10_pr.pr_generation >> 16) & 0xff);
4036 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff); 4072 buf[2] = ((su_dev->t10_pr.pr_generation >> 8) & 0xff);
@@ -4150,6 +4186,8 @@ static int core_scsi3_pri_read_full_status(struct se_cmd *cmd)
4150 buf[6] = ((add_len >> 8) & 0xff); 4186 buf[6] = ((add_len >> 8) & 0xff);
4151 buf[7] = (add_len & 0xff); 4187 buf[7] = (add_len & 0xff);
4152 4188
4189 transport_kunmap_first_data_page(cmd);
4190
4153 return 0; 4191 return 0;
4154} 4192}
4155 4193
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c
index 3574c520a5f4..d9569242e3dc 100644
--- a/drivers/target/target_core_pscsi.c
+++ b/drivers/target/target_core_pscsi.c
@@ -695,7 +695,7 @@ static int pscsi_transport_complete(struct se_task *task)
695 695
696 if (task->task_se_cmd->se_deve->lun_flags & 696 if (task->task_se_cmd->se_deve->lun_flags &
697 TRANSPORT_LUNFLAGS_READ_ONLY) { 697 TRANSPORT_LUNFLAGS_READ_ONLY) {
698 unsigned char *buf = task->task_se_cmd->t_task_buf; 698 unsigned char *buf = transport_kmap_first_data_page(task->task_se_cmd);
699 699
700 if (cdb[0] == MODE_SENSE_10) { 700 if (cdb[0] == MODE_SENSE_10) {
701 if (!(buf[3] & 0x80)) 701 if (!(buf[3] & 0x80))
@@ -704,6 +704,8 @@ static int pscsi_transport_complete(struct se_task *task)
704 if (!(buf[2] & 0x80)) 704 if (!(buf[2] & 0x80))
705 buf[2] |= 0x80; 705 buf[2] |= 0x80;
706 } 706 }
707
708 transport_kunmap_first_data_page(task->task_se_cmd);
707 } 709 }
708 } 710 }
709after_mode_sense: 711after_mode_sense:
@@ -1246,33 +1248,6 @@ static int pscsi_map_task_SG(struct se_task *task)
1246 return 0; 1248 return 0;
1247} 1249}
1248 1250
1249/* pscsi_map_task_non_SG():
1250 *
1251 *
1252 */
1253static int pscsi_map_task_non_SG(struct se_task *task)
1254{
1255 struct se_cmd *cmd = task->task_se_cmd;
1256 struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1257 struct pscsi_dev_virt *pdv = task->se_dev->dev_ptr;
1258 int ret = 0;
1259
1260 if (pscsi_blk_get_request(task) < 0)
1261 return PYX_TRANSPORT_LU_COMM_FAILURE;
1262
1263 if (!task->task_size)
1264 return 0;
1265
1266 ret = blk_rq_map_kern(pdv->pdv_sd->request_queue,
1267 pt->pscsi_req, cmd->t_task_buf,
1268 task->task_size, GFP_KERNEL);
1269 if (ret < 0) {
1270 printk(KERN_ERR "PSCSI: blk_rq_map_kern() failed: %d\n", ret);
1271 return PYX_TRANSPORT_LU_COMM_FAILURE;
1272 }
1273 return 0;
1274}
1275
1276static int pscsi_CDB_none(struct se_task *task) 1251static int pscsi_CDB_none(struct se_task *task)
1277{ 1252{
1278 return pscsi_blk_get_request(task); 1253 return pscsi_blk_get_request(task);
@@ -1392,7 +1367,6 @@ static struct se_subsystem_api pscsi_template = {
1392 .owner = THIS_MODULE, 1367 .owner = THIS_MODULE,
1393 .transport_type = TRANSPORT_PLUGIN_PHBA_PDEV, 1368 .transport_type = TRANSPORT_PLUGIN_PHBA_PDEV,
1394 .cdb_none = pscsi_CDB_none, 1369 .cdb_none = pscsi_CDB_none,
1395 .map_task_non_SG = pscsi_map_task_non_SG,
1396 .map_task_SG = pscsi_map_task_SG, 1370 .map_task_SG = pscsi_map_task_SG,
1397 .attach_hba = pscsi_attach_hba, 1371 .attach_hba = pscsi_attach_hba,
1398 .detach_hba = pscsi_detach_hba, 1372 .detach_hba = pscsi_detach_hba,
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 056c4cb4736d..c681c812dd64 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -213,7 +213,7 @@ static u32 transport_allocate_tasks(struct se_cmd *cmd,
213 unsigned long long starting_lba, u32 sectors, 213 unsigned long long starting_lba, u32 sectors,
214 enum dma_data_direction data_direction, 214 enum dma_data_direction data_direction,
215 struct list_head *mem_list, int set_counts); 215 struct list_head *mem_list, int set_counts);
216static int transport_generic_get_mem(struct se_cmd *cmd, u32 length); 216static int transport_generic_get_mem(struct se_cmd *cmd);
217static int transport_generic_remove(struct se_cmd *cmd, 217static int transport_generic_remove(struct se_cmd *cmd,
218 int session_reinstatement); 218 int session_reinstatement);
219static int transport_cmd_get_valid_sectors(struct se_cmd *cmd); 219static int transport_cmd_get_valid_sectors(struct se_cmd *cmd);
@@ -2233,23 +2233,6 @@ static void transport_generic_request_timeout(struct se_cmd *cmd)
2233 transport_generic_remove(cmd, 0); 2233 transport_generic_remove(cmd, 0);
2234} 2234}
2235 2235
2236static int
2237transport_generic_allocate_buf(struct se_cmd *cmd, u32 data_length)
2238{
2239 unsigned char *buf;
2240
2241 buf = kzalloc(data_length, GFP_KERNEL);
2242 if (!(buf)) {
2243 printk(KERN_ERR "Unable to allocate memory for buffer\n");
2244 return -ENOMEM;
2245 }
2246
2247 cmd->t_tasks_se_num = 0;
2248 cmd->t_task_buf = buf;
2249
2250 return 0;
2251}
2252
2253static inline u32 transport_lba_21(unsigned char *cdb) 2236static inline u32 transport_lba_21(unsigned char *cdb)
2254{ 2237{
2255 return ((cdb[1] & 0x1f) << 16) | (cdb[2] << 8) | cdb[3]; 2238 return ((cdb[1] & 0x1f) << 16) | (cdb[2] << 8) | cdb[3];
@@ -2966,19 +2949,6 @@ static int transport_get_sense_data(struct se_cmd *cmd)
2966 return -1; 2949 return -1;
2967} 2950}
2968 2951
2969static int transport_allocate_resources(struct se_cmd *cmd)
2970{
2971 u32 length = cmd->data_length;
2972
2973 if ((cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) ||
2974 (cmd->se_cmd_flags & SCF_SCSI_CONTROL_SG_IO_CDB))
2975 return transport_generic_get_mem(cmd, length);
2976 else if (cmd->se_cmd_flags & SCF_SCSI_CONTROL_NONSG_IO_CDB)
2977 return transport_generic_allocate_buf(cmd, length);
2978 else
2979 return 0;
2980}
2981
2982static int 2952static int
2983transport_handle_reservation_conflict(struct se_cmd *cmd) 2953transport_handle_reservation_conflict(struct se_cmd *cmd)
2984{ 2954{
@@ -3265,7 +3235,7 @@ static int transport_generic_cmd_sequencer(
3265 /* GPCMD_SEND_KEY from multi media commands */ 3235 /* GPCMD_SEND_KEY from multi media commands */
3266 size = (cdb[8] << 8) + cdb[9]; 3236 size = (cdb[8] << 8) + cdb[9];
3267 } 3237 }
3268 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3238 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3269 break; 3239 break;
3270 case MODE_SELECT: 3240 case MODE_SELECT:
3271 size = cdb[4]; 3241 size = cdb[4];
@@ -3277,7 +3247,7 @@ static int transport_generic_cmd_sequencer(
3277 break; 3247 break;
3278 case MODE_SENSE: 3248 case MODE_SENSE:
3279 size = cdb[4]; 3249 size = cdb[4];
3280 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3250 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3281 break; 3251 break;
3282 case MODE_SENSE_10: 3252 case MODE_SENSE_10:
3283 case GPCMD_READ_BUFFER_CAPACITY: 3253 case GPCMD_READ_BUFFER_CAPACITY:
@@ -3285,11 +3255,11 @@ static int transport_generic_cmd_sequencer(
3285 case LOG_SELECT: 3255 case LOG_SELECT:
3286 case LOG_SENSE: 3256 case LOG_SENSE:
3287 size = (cdb[7] << 8) + cdb[8]; 3257 size = (cdb[7] << 8) + cdb[8];
3288 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3258 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3289 break; 3259 break;
3290 case READ_BLOCK_LIMITS: 3260 case READ_BLOCK_LIMITS:
3291 size = READ_BLOCK_LEN; 3261 size = READ_BLOCK_LEN;
3292 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3262 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3293 break; 3263 break;
3294 case GPCMD_GET_CONFIGURATION: 3264 case GPCMD_GET_CONFIGURATION:
3295 case GPCMD_READ_FORMAT_CAPACITIES: 3265 case GPCMD_READ_FORMAT_CAPACITIES:
@@ -3305,7 +3275,7 @@ static int transport_generic_cmd_sequencer(
3305 SPC3_PERSISTENT_RESERVATIONS) ? 3275 SPC3_PERSISTENT_RESERVATIONS) ?
3306 core_scsi3_emulate_pr : NULL; 3276 core_scsi3_emulate_pr : NULL;
3307 size = (cdb[7] << 8) + cdb[8]; 3277 size = (cdb[7] << 8) + cdb[8];
3308 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3278 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3309 break; 3279 break;
3310 case GPCMD_MECHANISM_STATUS: 3280 case GPCMD_MECHANISM_STATUS:
3311 case GPCMD_READ_DVD_STRUCTURE: 3281 case GPCMD_READ_DVD_STRUCTURE:
@@ -3314,7 +3284,7 @@ static int transport_generic_cmd_sequencer(
3314 break; 3284 break;
3315 case READ_POSITION: 3285 case READ_POSITION:
3316 size = READ_POSITION_LEN; 3286 size = READ_POSITION_LEN;
3317 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3287 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3318 break; 3288 break;
3319 case MAINTENANCE_OUT: 3289 case MAINTENANCE_OUT:
3320 if (dev->transport->get_device_type(dev) != TYPE_ROM) { 3290 if (dev->transport->get_device_type(dev) != TYPE_ROM) {
@@ -3336,7 +3306,7 @@ static int transport_generic_cmd_sequencer(
3336 /* GPCMD_REPORT_KEY from multi media commands */ 3306 /* GPCMD_REPORT_KEY from multi media commands */
3337 size = (cdb[8] << 8) + cdb[9]; 3307 size = (cdb[8] << 8) + cdb[9];
3338 } 3308 }
3339 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3309 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3340 break; 3310 break;
3341 case INQUIRY: 3311 case INQUIRY:
3342 size = (cdb[3] << 8) + cdb[4]; 3312 size = (cdb[3] << 8) + cdb[4];
@@ -3346,21 +3316,21 @@ static int transport_generic_cmd_sequencer(
3346 */ 3316 */
3347 if (cmd->se_dev->dev_task_attr_type == SAM_TASK_ATTR_EMULATED) 3317 if (cmd->se_dev->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
3348 cmd->sam_task_attr = MSG_HEAD_TAG; 3318 cmd->sam_task_attr = MSG_HEAD_TAG;
3349 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3319 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3350 break; 3320 break;
3351 case READ_BUFFER: 3321 case READ_BUFFER:
3352 size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8]; 3322 size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
3353 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3323 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3354 break; 3324 break;
3355 case READ_CAPACITY: 3325 case READ_CAPACITY:
3356 size = READ_CAP_LEN; 3326 size = READ_CAP_LEN;
3357 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3327 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3358 break; 3328 break;
3359 case READ_MEDIA_SERIAL_NUMBER: 3329 case READ_MEDIA_SERIAL_NUMBER:
3360 case SECURITY_PROTOCOL_IN: 3330 case SECURITY_PROTOCOL_IN:
3361 case SECURITY_PROTOCOL_OUT: 3331 case SECURITY_PROTOCOL_OUT:
3362 size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9]; 3332 size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
3363 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3333 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3364 break; 3334 break;
3365 case SERVICE_ACTION_IN: 3335 case SERVICE_ACTION_IN:
3366 case ACCESS_CONTROL_IN: 3336 case ACCESS_CONTROL_IN:
@@ -3371,36 +3341,36 @@ static int transport_generic_cmd_sequencer(
3371 case WRITE_ATTRIBUTE: 3341 case WRITE_ATTRIBUTE:
3372 size = (cdb[10] << 24) | (cdb[11] << 16) | 3342 size = (cdb[10] << 24) | (cdb[11] << 16) |
3373 (cdb[12] << 8) | cdb[13]; 3343 (cdb[12] << 8) | cdb[13];
3374 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3344 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3375 break; 3345 break;
3376 case RECEIVE_DIAGNOSTIC: 3346 case RECEIVE_DIAGNOSTIC:
3377 case SEND_DIAGNOSTIC: 3347 case SEND_DIAGNOSTIC:
3378 size = (cdb[3] << 8) | cdb[4]; 3348 size = (cdb[3] << 8) | cdb[4];
3379 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3349 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3380 break; 3350 break;
3381/* #warning FIXME: Figure out correct GPCMD_READ_CD blocksize. */ 3351/* #warning FIXME: Figure out correct GPCMD_READ_CD blocksize. */
3382#if 0 3352#if 0
3383 case GPCMD_READ_CD: 3353 case GPCMD_READ_CD:
3384 sectors = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8]; 3354 sectors = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
3385 size = (2336 * sectors); 3355 size = (2336 * sectors);
3386 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3356 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3387 break; 3357 break;
3388#endif 3358#endif
3389 case READ_TOC: 3359 case READ_TOC:
3390 size = cdb[8]; 3360 size = cdb[8];
3391 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3361 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3392 break; 3362 break;
3393 case REQUEST_SENSE: 3363 case REQUEST_SENSE:
3394 size = cdb[4]; 3364 size = cdb[4];
3395 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3365 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3396 break; 3366 break;
3397 case READ_ELEMENT_STATUS: 3367 case READ_ELEMENT_STATUS:
3398 size = 65536 * cdb[7] + 256 * cdb[8] + cdb[9]; 3368 size = 65536 * cdb[7] + 256 * cdb[8] + cdb[9];
3399 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3369 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3400 break; 3370 break;
3401 case WRITE_BUFFER: 3371 case WRITE_BUFFER:
3402 size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8]; 3372 size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
3403 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3373 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3404 break; 3374 break;
3405 case RESERVE: 3375 case RESERVE:
3406 case RESERVE_10: 3376 case RESERVE_10:
@@ -3480,7 +3450,7 @@ static int transport_generic_cmd_sequencer(
3480 break; 3450 break;
3481 case UNMAP: 3451 case UNMAP:
3482 size = get_unaligned_be16(&cdb[7]); 3452 size = get_unaligned_be16(&cdb[7]);
3483 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3453 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3484 break; 3454 break;
3485 case WRITE_SAME_16: 3455 case WRITE_SAME_16:
3486 sectors = transport_get_sectors_16(cdb, cmd, &sector_ret); 3456 sectors = transport_get_sectors_16(cdb, cmd, &sector_ret);
@@ -3547,7 +3517,7 @@ static int transport_generic_cmd_sequencer(
3547 */ 3517 */
3548 if (cmd->se_dev->dev_task_attr_type == SAM_TASK_ATTR_EMULATED) 3518 if (cmd->se_dev->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
3549 cmd->sam_task_attr = MSG_HEAD_TAG; 3519 cmd->sam_task_attr = MSG_HEAD_TAG;
3550 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB; 3520 cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
3551 break; 3521 break;
3552 default: 3522 default:
3553 printk(KERN_WARNING "TARGET_CORE[%s]: Unsupported SCSI Opcode" 3523 printk(KERN_WARNING "TARGET_CORE[%s]: Unsupported SCSI Opcode"
@@ -3804,16 +3774,6 @@ static void transport_generic_complete_ok(struct se_cmd *cmd)
3804 cmd->data_length; 3774 cmd->data_length;
3805 } 3775 }
3806 spin_unlock(&cmd->se_lun->lun_sep_lock); 3776 spin_unlock(&cmd->se_lun->lun_sep_lock);
3807 /*
3808 * If enabled by TCM fabric module pre-registered SGL
3809 * memory, perform the memcpy() from the TCM internal
3810 * contiguous buffer back to the original SGL.
3811 */
3812 if (cmd->se_cmd_flags & SCF_PASSTHROUGH_CONTIG_TO_SG)
3813 sg_copy_from_buffer(cmd->t_task_pt_sgl,
3814 cmd->t_task_pt_sgl_num,
3815 cmd->t_task_buf,
3816 cmd->data_length);
3817 3777
3818 ret = cmd->se_tfo->queue_data_in(cmd); 3778 ret = cmd->se_tfo->queue_data_in(cmd);
3819 if (ret == -EAGAIN) 3779 if (ret == -EAGAIN)
@@ -3899,12 +3859,6 @@ static inline void transport_free_pages(struct se_cmd *cmd)
3899 if (cmd->se_dev->transport->do_se_mem_map) 3859 if (cmd->se_dev->transport->do_se_mem_map)
3900 free_page = 0; 3860 free_page = 0;
3901 3861
3902 if (cmd->t_task_buf) {
3903 kfree(cmd->t_task_buf);
3904 cmd->t_task_buf = NULL;
3905 return;
3906 }
3907
3908 list_for_each_entry_safe(se_mem, se_mem_tmp, 3862 list_for_each_entry_safe(se_mem, se_mem_tmp,
3909 &cmd->t_mem_list, se_list) { 3863 &cmd->t_mem_list, se_list) {
3910 /* 3864 /*
@@ -4068,25 +4022,6 @@ int transport_generic_map_mem_to_cmd(
4068 cmd->t_tasks_se_bidi_num = ret; 4022 cmd->t_tasks_se_bidi_num = ret;
4069 } 4023 }
4070 cmd->se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC; 4024 cmd->se_cmd_flags |= SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC;
4071
4072 } else if (cmd->se_cmd_flags & SCF_SCSI_CONTROL_NONSG_IO_CDB) {
4073 if (sgl_bidi || sgl_bidi_count) {
4074 printk(KERN_ERR "BIDI-Commands not supported using "
4075 "SCF_SCSI_CONTROL_NONSG_IO_CDB\n");
4076 return -ENOSYS;
4077 }
4078 /*
4079 * For incoming CDBs using a contiguous buffer internal with TCM,
4080 * save the passed struct scatterlist memory. After TCM storage object
4081 * processing has completed for this struct se_cmd, TCM core will call
4082 * transport_memcpy_[write,read]_contig() as necessary from
4083 * transport_generic_complete_ok() and transport_write_pending() in order
4084 * to copy the TCM buffer to/from the original passed *mem in SGL ->
4085 * struct scatterlist format.
4086 */
4087 cmd->se_cmd_flags |= SCF_PASSTHROUGH_CONTIG_TO_SG;
4088 cmd->t_task_pt_sgl = sgl;
4089 cmd->t_task_pt_sgl_num = sgl_count;
4090 } 4025 }
4091 4026
4092 return 0; 4027 return 0;
@@ -4184,10 +4119,41 @@ static int transport_new_cmd_obj(struct se_cmd *cmd)
4184 return 0; 4119 return 0;
4185} 4120}
4186 4121
4122void *transport_kmap_first_data_page(struct se_cmd *cmd)
4123{
4124 struct se_mem *se_mem;
4125
4126 BUG_ON(list_empty(&cmd->t_mem_list));
4127
4128 se_mem = list_first_entry(&cmd->t_mem_list, struct se_mem, se_list);
4129
4130 /*
4131 * 1st se_mem should point to a page, and we shouldn't need more than
4132 * that for this cmd
4133 */
4134 BUG_ON(cmd->data_length > PAGE_SIZE);
4135
4136 return kmap(se_mem->se_page);
4137}
4138EXPORT_SYMBOL(transport_kmap_first_data_page);
4139
4140void transport_kunmap_first_data_page(struct se_cmd *cmd)
4141{
4142 struct se_mem *se_mem;
4143
4144 BUG_ON(list_empty(&cmd->t_mem_list));
4145
4146 se_mem = list_first_entry(&cmd->t_mem_list, struct se_mem, se_list);
4147
4148 kunmap(se_mem->se_page);
4149}
4150EXPORT_SYMBOL(transport_kunmap_first_data_page);
4151
4187static int 4152static int
4188transport_generic_get_mem(struct se_cmd *cmd, u32 length) 4153transport_generic_get_mem(struct se_cmd *cmd)
4189{ 4154{
4190 struct se_mem *se_mem; 4155 struct se_mem *se_mem;
4156 int length = cmd->data_length;
4191 4157
4192 /* 4158 /*
4193 * If the device uses memory mapping this is enough. 4159 * If the device uses memory mapping this is enough.
@@ -4195,6 +4161,7 @@ transport_generic_get_mem(struct se_cmd *cmd, u32 length)
4195 if (cmd->se_dev->transport->do_se_mem_map) 4161 if (cmd->se_dev->transport->do_se_mem_map)
4196 return 0; 4162 return 0;
4197 4163
4164 /* Even cmds with length 0 will get here, btw */
4198 while (length) { 4165 while (length) {
4199 se_mem = kmem_cache_zalloc(se_mem_cache, GFP_KERNEL); 4166 se_mem = kmem_cache_zalloc(se_mem_cache, GFP_KERNEL);
4200 if (!(se_mem)) { 4167 if (!(se_mem)) {
@@ -4851,10 +4818,6 @@ transport_map_control_cmd_to_task(struct se_cmd *cmd)
4851 if (dev->transport->map_task_SG) 4818 if (dev->transport->map_task_SG)
4852 return dev->transport->map_task_SG(task); 4819 return dev->transport->map_task_SG(task);
4853 return 0; 4820 return 0;
4854 } else if (cmd->se_cmd_flags & SCF_SCSI_CONTROL_NONSG_IO_CDB) {
4855 if (dev->transport->map_task_non_SG)
4856 return dev->transport->map_task_non_SG(task);
4857 return 0;
4858 } else if (cmd->se_cmd_flags & SCF_SCSI_NON_DATA_CDB) { 4821 } else if (cmd->se_cmd_flags & SCF_SCSI_NON_DATA_CDB) {
4859 if (dev->transport->cdb_none) 4822 if (dev->transport->cdb_none)
4860 return dev->transport->cdb_none(task); 4823 return dev->transport->cdb_none(task);
@@ -4887,7 +4850,7 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
4887 * cmd->t_mem_list of struct se_mem->se_page 4850 * cmd->t_mem_list of struct se_mem->se_page
4888 */ 4851 */
4889 if (!(cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) { 4852 if (!(cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) {
4890 ret = transport_allocate_resources(cmd); 4853 ret = transport_generic_get_mem(cmd);
4891 if (ret < 0) 4854 if (ret < 0)
4892 return ret; 4855 return ret;
4893 } 4856 }
@@ -5029,17 +4992,7 @@ static int transport_generic_write_pending(struct se_cmd *cmd)
5029 cmd->transport_qf_callback = NULL; 4992 cmd->transport_qf_callback = NULL;
5030 return 0; 4993 return 0;
5031 } 4994 }
5032 /* 4995
5033 * For the TCM control CDBs using a contiguous buffer, do the memcpy
5034 * from the passed Linux/SCSI struct scatterlist located at
5035 * se_cmd->t_task_pt_sgl to the contiguous buffer at
5036 * se_cmd->t_task_buf.
5037 */
5038 if (cmd->se_cmd_flags & SCF_PASSTHROUGH_CONTIG_TO_SG)
5039 sg_copy_to_buffer(cmd->t_task_pt_sgl,
5040 cmd->t_task_pt_sgl_num,
5041 cmd->t_task_buf,
5042 cmd->data_length);
5043 /* 4996 /*
5044 * Clear the se_cmd for WRITE_PENDING status in order to set 4997 * Clear the se_cmd for WRITE_PENDING status in order to set
5045 * cmd->t_transport_active=0 so that transport_generic_handle_data 4998 * cmd->t_transport_active=0 so that transport_generic_handle_data
diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c
index a00951c80324..1017f56bbbcc 100644
--- a/drivers/target/tcm_fc/tfc_cmd.c
+++ b/drivers/target/tcm_fc/tfc_cmd.c
@@ -71,9 +71,9 @@ void ft_dump_cmd(struct ft_cmd *cmd, const char *caller)
71 caller, cmd, cmd->cdb); 71 caller, cmd, cmd->cdb);
72 printk(KERN_INFO "%s: cmd %p lun %d\n", caller, cmd, cmd->lun); 72 printk(KERN_INFO "%s: cmd %p lun %d\n", caller, cmd, cmd->lun);
73 73
74 printk(KERN_INFO "%s: cmd %p se_num %u buf %p len %u se_cmd_flags <0x%x>\n", 74 printk(KERN_INFO "%s: cmd %p se_num %u len %u se_cmd_flags <0x%x>\n",
75 caller, cmd, se_cmd->t_tasks_se_num, 75 caller, cmd, se_cmd->t_tasks_se_num,
76 se_cmd->t_task_buf, se_cmd->data_length, se_cmd->se_cmd_flags); 76 se_cmd->data_length, se_cmd->se_cmd_flags);
77 77
78 list_for_each_entry(mem, &se_cmd->t_mem_list, se_list) 78 list_for_each_entry(mem, &se_cmd->t_mem_list, se_list)
79 printk(KERN_INFO "%s: cmd %p mem %p page %p " 79 printk(KERN_INFO "%s: cmd %p mem %p page %p "
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c
index 8560182f0dad..837660728563 100644
--- a/drivers/target/tcm_fc/tfc_io.c
+++ b/drivers/target/tcm_fc/tfc_io.c
@@ -92,19 +92,15 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
92 remaining = se_cmd->data_length; 92 remaining = se_cmd->data_length;
93 93
94 /* 94 /*
95 * Setup to use first mem list entry if any. 95 * Setup to use first mem list entry, unless no data.
96 */ 96 */
97 if (se_cmd->t_tasks_se_num) { 97 BUG_ON(remaining && list_empty(&se_cmd->t_mem_list));
98 if (remaining) {
98 mem = list_first_entry(&se_cmd->t_mem_list, 99 mem = list_first_entry(&se_cmd->t_mem_list,
99 struct se_mem, se_list); 100 struct se_mem, se_list);
100 mem_len = mem->se_len; 101 mem_len = mem->se_len;
101 mem_off = mem->se_off; 102 mem_off = mem->se_off;
102 page = mem->se_page; 103 page = mem->se_page;
103 } else {
104 mem = NULL;
105 mem_len = remaining;
106 mem_off = 0;
107 page = NULL;
108 } 104 }
109 105
110 /* no scatter/gather in skb for odd word length due to fc_seq_send() */ 106 /* no scatter/gather in skb for odd word length due to fc_seq_send() */
@@ -145,18 +141,7 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
145 tlen = min(mem_len, frame_len); 141 tlen = min(mem_len, frame_len);
146 142
147 if (use_sg) { 143 if (use_sg) {
148 if (!mem) { 144 off_in_page = mem_off;
149 BUG_ON(!se_cmd->t_task_buf);
150 page_addr = se_cmd->t_task_buf + mem_off;
151 /*
152 * In this case, offset is 'offset_in_page' of
153 * (t_task_buf + mem_off) instead of 'mem_off'.
154 */
155 off_in_page = offset_in_page(page_addr);
156 page = virt_to_page(page_addr);
157 tlen = min(tlen, PAGE_SIZE - off_in_page);
158 } else
159 off_in_page = mem_off;
160 BUG_ON(!page); 145 BUG_ON(!page);
161 get_page(page); 146 get_page(page);
162 skb_fill_page_desc(fp_skb(fp), 147 skb_fill_page_desc(fp_skb(fp),
@@ -166,7 +151,7 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
166 fp_skb(fp)->data_len += tlen; 151 fp_skb(fp)->data_len += tlen;
167 fp_skb(fp)->truesize += 152 fp_skb(fp)->truesize +=
168 PAGE_SIZE << compound_order(page); 153 PAGE_SIZE << compound_order(page);
169 } else if (mem) { 154 } else {
170 BUG_ON(!page); 155 BUG_ON(!page);
171 from = kmap_atomic(page + (mem_off >> PAGE_SHIFT), 156 from = kmap_atomic(page + (mem_off >> PAGE_SHIFT),
172 KM_SOFTIRQ0); 157 KM_SOFTIRQ0);
@@ -177,10 +162,6 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
177 memcpy(to, from, tlen); 162 memcpy(to, from, tlen);
178 kunmap_atomic(page_addr, KM_SOFTIRQ0); 163 kunmap_atomic(page_addr, KM_SOFTIRQ0);
179 to += tlen; 164 to += tlen;
180 } else {
181 from = se_cmd->t_task_buf + mem_off;
182 memcpy(to, from, tlen);
183 to += tlen;
184 } 165 }
185 166
186 mem_off += tlen; 167 mem_off += tlen;
@@ -305,19 +286,15 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp)
305 frame_len = se_cmd->data_length - rel_off; 286 frame_len = se_cmd->data_length - rel_off;
306 287
307 /* 288 /*
308 * Setup to use first mem list entry if any. 289 * Setup to use first mem list entry, unless no data.
309 */ 290 */
310 if (se_cmd->t_tasks_se_num) { 291 BUG_ON(frame_len && list_empty(&se_cmd->t_mem_list));
292 if (frame_len) {
311 mem = list_first_entry(&se_cmd->t_mem_list, 293 mem = list_first_entry(&se_cmd->t_mem_list,
312 struct se_mem, se_list); 294 struct se_mem, se_list);
313 mem_len = mem->se_len; 295 mem_len = mem->se_len;
314 mem_off = mem->se_off; 296 mem_off = mem->se_off;
315 page = mem->se_page; 297 page = mem->se_page;
316 } else {
317 mem = NULL;
318 page = NULL;
319 mem_off = 0;
320 mem_len = frame_len;
321 } 298 }
322 299
323 while (frame_len) { 300 while (frame_len) {
@@ -340,19 +317,15 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp)
340 317
341 tlen = min(mem_len, frame_len); 318 tlen = min(mem_len, frame_len);
342 319
343 if (mem) { 320 to = kmap_atomic(page + (mem_off >> PAGE_SHIFT),
344 to = kmap_atomic(page + (mem_off >> PAGE_SHIFT), 321 KM_SOFTIRQ0);
345 KM_SOFTIRQ0); 322 page_addr = to;
346 page_addr = to; 323 to += mem_off & ~PAGE_MASK;
347 to += mem_off & ~PAGE_MASK; 324 tlen = min(tlen, (size_t)(PAGE_SIZE -
348 tlen = min(tlen, (size_t)(PAGE_SIZE - 325 (mem_off & ~PAGE_MASK)));
349 (mem_off & ~PAGE_MASK))); 326 memcpy(to, from, tlen);
350 memcpy(to, from, tlen); 327 kunmap_atomic(page_addr, KM_SOFTIRQ0);
351 kunmap_atomic(page_addr, KM_SOFTIRQ0); 328
352 } else {
353 to = se_cmd->t_task_buf + mem_off;
354 memcpy(to, from, tlen);
355 }
356 from += tlen; 329 from += tlen;
357 frame_len -= tlen; 330 frame_len -= tlen;
358 mem_off += tlen; 331 mem_off += tlen;
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 81deb399bf6a..f67ca98394d3 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -109,7 +109,6 @@ enum se_cmd_flags_table {
109 SCF_EMULATED_TASK_SENSE = 0x00000004, 109 SCF_EMULATED_TASK_SENSE = 0x00000004,
110 SCF_SCSI_DATA_SG_IO_CDB = 0x00000008, 110 SCF_SCSI_DATA_SG_IO_CDB = 0x00000008,
111 SCF_SCSI_CONTROL_SG_IO_CDB = 0x00000010, 111 SCF_SCSI_CONTROL_SG_IO_CDB = 0x00000010,
112 SCF_SCSI_CONTROL_NONSG_IO_CDB = 0x00000020,
113 SCF_SCSI_NON_DATA_CDB = 0x00000040, 112 SCF_SCSI_NON_DATA_CDB = 0x00000040,
114 SCF_SCSI_CDB_EXCEPTION = 0x00000080, 113 SCF_SCSI_CDB_EXCEPTION = 0x00000080,
115 SCF_SCSI_RESERVATION_CONFLICT = 0x00000100, 114 SCF_SCSI_RESERVATION_CONFLICT = 0x00000100,
@@ -123,7 +122,6 @@ enum se_cmd_flags_table {
123 SCF_ALUA_NON_OPTIMIZED = 0x00040000, 122 SCF_ALUA_NON_OPTIMIZED = 0x00040000,
124 SCF_DELAYED_CMD_FROM_SAM_ATTR = 0x00080000, 123 SCF_DELAYED_CMD_FROM_SAM_ATTR = 0x00080000,
125 SCF_UNUSED = 0x00100000, 124 SCF_UNUSED = 0x00100000,
126 SCF_PASSTHROUGH_CONTIG_TO_SG = 0x00200000,
127 SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00400000, 125 SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00400000,
128 SCF_EMULATE_CDB_ASYNC = 0x01000000, 126 SCF_EMULATE_CDB_ASYNC = 0x01000000,
129 SCF_EMULATE_QUEUE_FULL = 0x02000000, 127 SCF_EMULATE_QUEUE_FULL = 0x02000000,
@@ -516,8 +514,7 @@ struct se_cmd {
516 struct completion transport_lun_fe_stop_comp; 514 struct completion transport_lun_fe_stop_comp;
517 struct completion transport_lun_stop_comp; 515 struct completion transport_lun_stop_comp;
518 struct scatterlist *t_tasks_sg_chained; 516 struct scatterlist *t_tasks_sg_chained;
519 struct scatterlist t_tasks_sg_bounce; 517
520 void *t_task_buf;
521 /* 518 /*
522 * Used for pre-registered fabric SGL passthrough WRITE and READ 519 * Used for pre-registered fabric SGL passthrough WRITE and READ
523 * with the special SCF_PASSTHROUGH_CONTIG_TO_SG case for TCM_Loop 520 * with the special SCF_PASSTHROUGH_CONTIG_TO_SG case for TCM_Loop
diff --git a/include/target/target_core_transport.h b/include/target/target_core_transport.h
index b27ce1af698b..123df9238c68 100644
--- a/include/target/target_core_transport.h
+++ b/include/target/target_core_transport.h
@@ -165,6 +165,8 @@ extern void transport_init_se_cmd(struct se_cmd *,
165 struct target_core_fabric_ops *, 165 struct target_core_fabric_ops *,
166 struct se_session *, u32, int, int, 166 struct se_session *, u32, int, int,
167 unsigned char *); 167 unsigned char *);
168void *transport_kmap_first_data_page(struct se_cmd *cmd);
169void transport_kunmap_first_data_page(struct se_cmd *cmd);
168extern void transport_free_se_cmd(struct se_cmd *); 170extern void transport_free_se_cmd(struct se_cmd *);
169extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *); 171extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *);
170extern int transport_generic_handle_cdb(struct se_cmd *); 172extern int transport_generic_handle_cdb(struct se_cmd *);
@@ -237,10 +239,6 @@ struct se_subsystem_api {
237 */ 239 */
238 int (*cdb_none)(struct se_task *); 240 int (*cdb_none)(struct se_task *);
239 /* 241 /*
240 * For SCF_SCSI_CONTROL_NONSG_IO_CDB
241 */
242 int (*map_task_non_SG)(struct se_task *);
243 /*
244 * For SCF_SCSI_DATA_SG_IO_CDB and SCF_SCSI_CONTROL_SG_IO_CDB 242 * For SCF_SCSI_DATA_SG_IO_CDB and SCF_SCSI_CONTROL_SG_IO_CDB
245 */ 243 */
246 int (*map_task_SG)(struct se_task *); 244 int (*map_task_SG)(struct se_task *);