diff options
author | Christoph Hellwig <hch@infradead.org> | 2012-05-20 11:59:15 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-07-16 20:27:45 -0400 |
commit | 1fd032ee10d2816c947f5d5b9abda95e728f0a8f (patch) | |
tree | 2a76ad6b466160127dd41ba1d2f6fdb54f412bf2 /drivers/target | |
parent | d6e0175cf3f9737a760482d185bb73566bcc9331 (diff) |
target: move code for CDB emulation
Move the existing code in target_core_cdb.c into the files for the command
sets that the emulations implement.
(roland + nab: Squash patch: Fix range calculation in WRITE SAME emulation
when num blocks == 0s)
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/Makefile | 1 | ||||
-rw-r--r-- | drivers/target/target_core_cdb.c | 1130 | ||||
-rw-r--r-- | drivers/target/target_core_internal.h | 12 | ||||
-rw-r--r-- | drivers/target/target_core_pscsi.c | 465 | ||||
-rw-r--r-- | drivers/target/target_core_sbc.c | 239 | ||||
-rw-r--r-- | drivers/target/target_core_spc.c | 916 | ||||
-rw-r--r-- | drivers/target/target_core_transport.c | 47 |
7 files changed, 1152 insertions, 1658 deletions
diff --git a/drivers/target/Makefile b/drivers/target/Makefile index 50b887b349c0..9fdcb561422f 100644 --- a/drivers/target/Makefile +++ b/drivers/target/Makefile | |||
@@ -9,7 +9,6 @@ target_core_mod-y := target_core_configfs.o \ | |||
9 | target_core_tmr.o \ | 9 | target_core_tmr.o \ |
10 | target_core_tpg.o \ | 10 | target_core_tpg.o \ |
11 | target_core_transport.o \ | 11 | target_core_transport.o \ |
12 | target_core_cdb.o \ | ||
13 | target_core_sbc.o \ | 12 | target_core_sbc.o \ |
14 | target_core_spc.o \ | 13 | target_core_spc.o \ |
15 | target_core_ua.o \ | 14 | target_core_ua.o \ |
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c deleted file mode 100644 index 664f6e775d0e..000000000000 --- a/drivers/target/target_core_cdb.c +++ /dev/null | |||
@@ -1,1130 +0,0 @@ | |||
1 | /* | ||
2 | * CDB emulation for non-READ/WRITE commands. | ||
3 | * | ||
4 | * Copyright (c) 2002, 2003, 2004, 2005 PyX Technologies, Inc. | ||
5 | * Copyright (c) 2005, 2006, 2007 SBE, Inc. | ||
6 | * Copyright (c) 2007-2010 Rising Tide Systems | ||
7 | * Copyright (c) 2008-2010 Linux-iSCSI.org | ||
8 | * | ||
9 | * Nicholas A. Bellinger <nab@kernel.org> | ||
10 | * | ||
11 | * This program is free software; you can redistribute it and/or modify | ||
12 | * it under the terms of the GNU General Public License as published by | ||
13 | * the Free Software Foundation; either version 2 of the License, or | ||
14 | * (at your option) any later version. | ||
15 | * | ||
16 | * This program is distributed in the hope that it will be useful, | ||
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | * GNU General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; if not, write to the Free Software | ||
23 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <asm/unaligned.h> | ||
29 | #include <scsi/scsi.h> | ||
30 | |||
31 | #include <target/target_core_base.h> | ||
32 | #include <target/target_core_backend.h> | ||
33 | #include <target/target_core_fabric.h> | ||
34 | |||
35 | #include "target_core_internal.h" | ||
36 | #include "target_core_ua.h" | ||
37 | |||
38 | static void | ||
39 | target_fill_alua_data(struct se_port *port, unsigned char *buf) | ||
40 | { | ||
41 | struct t10_alua_tg_pt_gp *tg_pt_gp; | ||
42 | struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; | ||
43 | |||
44 | /* | ||
45 | * Set SCCS for MAINTENANCE_IN + REPORT_TARGET_PORT_GROUPS. | ||
46 | */ | ||
47 | buf[5] = 0x80; | ||
48 | |||
49 | /* | ||
50 | * Set TPGS field for explict and/or implict ALUA access type | ||
51 | * and opteration. | ||
52 | * | ||
53 | * See spc4r17 section 6.4.2 Table 135 | ||
54 | */ | ||
55 | if (!port) | ||
56 | return; | ||
57 | tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem; | ||
58 | if (!tg_pt_gp_mem) | ||
59 | return; | ||
60 | |||
61 | spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
62 | tg_pt_gp = tg_pt_gp_mem->tg_pt_gp; | ||
63 | if (tg_pt_gp) | ||
64 | buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type; | ||
65 | spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
66 | } | ||
67 | |||
68 | static int | ||
69 | target_emulate_inquiry_std(struct se_cmd *cmd, char *buf) | ||
70 | { | ||
71 | struct se_lun *lun = cmd->se_lun; | ||
72 | struct se_device *dev = cmd->se_dev; | ||
73 | |||
74 | /* Set RMB (removable media) for tape devices */ | ||
75 | if (dev->transport->get_device_type(dev) == TYPE_TAPE) | ||
76 | buf[1] = 0x80; | ||
77 | |||
78 | buf[2] = dev->transport->get_device_rev(dev); | ||
79 | |||
80 | /* | ||
81 | * NORMACA and HISUP = 0, RESPONSE DATA FORMAT = 2 | ||
82 | * | ||
83 | * SPC4 says: | ||
84 | * A RESPONSE DATA FORMAT field set to 2h indicates that the | ||
85 | * standard INQUIRY data is in the format defined in this | ||
86 | * standard. Response data format values less than 2h are | ||
87 | * obsolete. Response data format values greater than 2h are | ||
88 | * reserved. | ||
89 | */ | ||
90 | buf[3] = 2; | ||
91 | |||
92 | /* | ||
93 | * Enable SCCS and TPGS fields for Emulated ALUA | ||
94 | */ | ||
95 | if (dev->se_sub_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) | ||
96 | target_fill_alua_data(lun->lun_sep, buf); | ||
97 | |||
98 | buf[7] = 0x2; /* CmdQue=1 */ | ||
99 | |||
100 | snprintf(&buf[8], 8, "LIO-ORG"); | ||
101 | snprintf(&buf[16], 16, "%s", dev->se_sub_dev->t10_wwn.model); | ||
102 | snprintf(&buf[32], 4, "%s", dev->se_sub_dev->t10_wwn.revision); | ||
103 | buf[4] = 31; /* Set additional length to 31 */ | ||
104 | |||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | /* unit serial number */ | ||
109 | static int | ||
110 | target_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf) | ||
111 | { | ||
112 | struct se_device *dev = cmd->se_dev; | ||
113 | u16 len = 0; | ||
114 | |||
115 | if (dev->se_sub_dev->su_dev_flags & | ||
116 | SDF_EMULATED_VPD_UNIT_SERIAL) { | ||
117 | u32 unit_serial_len; | ||
118 | |||
119 | unit_serial_len = strlen(dev->se_sub_dev->t10_wwn.unit_serial); | ||
120 | unit_serial_len++; /* For NULL Terminator */ | ||
121 | |||
122 | len += sprintf(&buf[4], "%s", | ||
123 | dev->se_sub_dev->t10_wwn.unit_serial); | ||
124 | len++; /* Extra Byte for NULL Terminator */ | ||
125 | buf[3] = len; | ||
126 | } | ||
127 | return 0; | ||
128 | } | ||
129 | |||
130 | static void | ||
131 | target_parse_naa_6h_vendor_specific(struct se_device *dev, unsigned char *buf) | ||
132 | { | ||
133 | unsigned char *p = &dev->se_sub_dev->t10_wwn.unit_serial[0]; | ||
134 | int cnt; | ||
135 | bool next = true; | ||
136 | |||
137 | /* | ||
138 | * Generate up to 36 bits of VENDOR SPECIFIC IDENTIFIER starting on | ||
139 | * byte 3 bit 3-0 for NAA IEEE Registered Extended DESIGNATOR field | ||
140 | * format, followed by 64 bits of VENDOR SPECIFIC IDENTIFIER EXTENSION | ||
141 | * to complete the payload. These are based from VPD=0x80 PRODUCT SERIAL | ||
142 | * NUMBER set via vpd_unit_serial in target_core_configfs.c to ensure | ||
143 | * per device uniqeness. | ||
144 | */ | ||
145 | for (cnt = 0; *p && cnt < 13; p++) { | ||
146 | int val = hex_to_bin(*p); | ||
147 | |||
148 | if (val < 0) | ||
149 | continue; | ||
150 | |||
151 | if (next) { | ||
152 | next = false; | ||
153 | buf[cnt++] |= val; | ||
154 | } else { | ||
155 | next = true; | ||
156 | buf[cnt] = val << 4; | ||
157 | } | ||
158 | } | ||
159 | } | ||
160 | |||
161 | /* | ||
162 | * Device identification VPD, for a complete list of | ||
163 | * DESIGNATOR TYPEs see spc4r17 Table 459. | ||
164 | */ | ||
165 | static int | ||
166 | target_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf) | ||
167 | { | ||
168 | struct se_device *dev = cmd->se_dev; | ||
169 | struct se_lun *lun = cmd->se_lun; | ||
170 | struct se_port *port = NULL; | ||
171 | struct se_portal_group *tpg = NULL; | ||
172 | struct t10_alua_lu_gp_member *lu_gp_mem; | ||
173 | struct t10_alua_tg_pt_gp *tg_pt_gp; | ||
174 | struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; | ||
175 | unsigned char *prod = &dev->se_sub_dev->t10_wwn.model[0]; | ||
176 | u32 prod_len; | ||
177 | u32 unit_serial_len, off = 0; | ||
178 | u16 len = 0, id_len; | ||
179 | |||
180 | off = 4; | ||
181 | |||
182 | /* | ||
183 | * NAA IEEE Registered Extended Assigned designator format, see | ||
184 | * spc4r17 section 7.7.3.6.5 | ||
185 | * | ||
186 | * We depend upon a target_core_mod/ConfigFS provided | ||
187 | * /sys/kernel/config/target/core/$HBA/$DEV/wwn/vpd_unit_serial | ||
188 | * value in order to return the NAA id. | ||
189 | */ | ||
190 | if (!(dev->se_sub_dev->su_dev_flags & SDF_EMULATED_VPD_UNIT_SERIAL)) | ||
191 | goto check_t10_vend_desc; | ||
192 | |||
193 | /* CODE SET == Binary */ | ||
194 | buf[off++] = 0x1; | ||
195 | |||
196 | /* Set ASSOCIATION == addressed logical unit: 0)b */ | ||
197 | buf[off] = 0x00; | ||
198 | |||
199 | /* Identifier/Designator type == NAA identifier */ | ||
200 | buf[off++] |= 0x3; | ||
201 | off++; | ||
202 | |||
203 | /* Identifier/Designator length */ | ||
204 | buf[off++] = 0x10; | ||
205 | |||
206 | /* | ||
207 | * Start NAA IEEE Registered Extended Identifier/Designator | ||
208 | */ | ||
209 | buf[off++] = (0x6 << 4); | ||
210 | |||
211 | /* | ||
212 | * Use OpenFabrics IEEE Company ID: 00 14 05 | ||
213 | */ | ||
214 | buf[off++] = 0x01; | ||
215 | buf[off++] = 0x40; | ||
216 | buf[off] = (0x5 << 4); | ||
217 | |||
218 | /* | ||
219 | * Return ConfigFS Unit Serial Number information for | ||
220 | * VENDOR_SPECIFIC_IDENTIFIER and | ||
221 | * VENDOR_SPECIFIC_IDENTIFIER_EXTENTION | ||
222 | */ | ||
223 | target_parse_naa_6h_vendor_specific(dev, &buf[off]); | ||
224 | |||
225 | len = 20; | ||
226 | off = (len + 4); | ||
227 | |||
228 | check_t10_vend_desc: | ||
229 | /* | ||
230 | * T10 Vendor Identifier Page, see spc4r17 section 7.7.3.4 | ||
231 | */ | ||
232 | id_len = 8; /* For Vendor field */ | ||
233 | prod_len = 4; /* For VPD Header */ | ||
234 | prod_len += 8; /* For Vendor field */ | ||
235 | prod_len += strlen(prod); | ||
236 | prod_len++; /* For : */ | ||
237 | |||
238 | if (dev->se_sub_dev->su_dev_flags & | ||
239 | SDF_EMULATED_VPD_UNIT_SERIAL) { | ||
240 | unit_serial_len = | ||
241 | strlen(&dev->se_sub_dev->t10_wwn.unit_serial[0]); | ||
242 | unit_serial_len++; /* For NULL Terminator */ | ||
243 | |||
244 | id_len += sprintf(&buf[off+12], "%s:%s", prod, | ||
245 | &dev->se_sub_dev->t10_wwn.unit_serial[0]); | ||
246 | } | ||
247 | buf[off] = 0x2; /* ASCII */ | ||
248 | buf[off+1] = 0x1; /* T10 Vendor ID */ | ||
249 | buf[off+2] = 0x0; | ||
250 | memcpy(&buf[off+4], "LIO-ORG", 8); | ||
251 | /* Extra Byte for NULL Terminator */ | ||
252 | id_len++; | ||
253 | /* Identifier Length */ | ||
254 | buf[off+3] = id_len; | ||
255 | /* Header size for Designation descriptor */ | ||
256 | len += (id_len + 4); | ||
257 | off += (id_len + 4); | ||
258 | /* | ||
259 | * struct se_port is only set for INQUIRY VPD=1 through $FABRIC_MOD | ||
260 | */ | ||
261 | port = lun->lun_sep; | ||
262 | if (port) { | ||
263 | struct t10_alua_lu_gp *lu_gp; | ||
264 | u32 padding, scsi_name_len; | ||
265 | u16 lu_gp_id = 0; | ||
266 | u16 tg_pt_gp_id = 0; | ||
267 | u16 tpgt; | ||
268 | |||
269 | tpg = port->sep_tpg; | ||
270 | /* | ||
271 | * Relative target port identifer, see spc4r17 | ||
272 | * section 7.7.3.7 | ||
273 | * | ||
274 | * Get the PROTOCOL IDENTIFIER as defined by spc4r17 | ||
275 | * section 7.5.1 Table 362 | ||
276 | */ | ||
277 | buf[off] = | ||
278 | (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4); | ||
279 | buf[off++] |= 0x1; /* CODE SET == Binary */ | ||
280 | buf[off] = 0x80; /* Set PIV=1 */ | ||
281 | /* Set ASSOCIATION == target port: 01b */ | ||
282 | buf[off] |= 0x10; | ||
283 | /* DESIGNATOR TYPE == Relative target port identifer */ | ||
284 | buf[off++] |= 0x4; | ||
285 | off++; /* Skip over Reserved */ | ||
286 | buf[off++] = 4; /* DESIGNATOR LENGTH */ | ||
287 | /* Skip over Obsolete field in RTPI payload | ||
288 | * in Table 472 */ | ||
289 | off += 2; | ||
290 | buf[off++] = ((port->sep_rtpi >> 8) & 0xff); | ||
291 | buf[off++] = (port->sep_rtpi & 0xff); | ||
292 | len += 8; /* Header size + Designation descriptor */ | ||
293 | /* | ||
294 | * Target port group identifier, see spc4r17 | ||
295 | * section 7.7.3.8 | ||
296 | * | ||
297 | * Get the PROTOCOL IDENTIFIER as defined by spc4r17 | ||
298 | * section 7.5.1 Table 362 | ||
299 | */ | ||
300 | if (dev->se_sub_dev->t10_alua.alua_type != | ||
301 | SPC3_ALUA_EMULATED) | ||
302 | goto check_scsi_name; | ||
303 | |||
304 | tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem; | ||
305 | if (!tg_pt_gp_mem) | ||
306 | goto check_lu_gp; | ||
307 | |||
308 | spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
309 | tg_pt_gp = tg_pt_gp_mem->tg_pt_gp; | ||
310 | if (!tg_pt_gp) { | ||
311 | spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
312 | goto check_lu_gp; | ||
313 | } | ||
314 | tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id; | ||
315 | spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
316 | |||
317 | buf[off] = | ||
318 | (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4); | ||
319 | buf[off++] |= 0x1; /* CODE SET == Binary */ | ||
320 | buf[off] = 0x80; /* Set PIV=1 */ | ||
321 | /* Set ASSOCIATION == target port: 01b */ | ||
322 | buf[off] |= 0x10; | ||
323 | /* DESIGNATOR TYPE == Target port group identifier */ | ||
324 | buf[off++] |= 0x5; | ||
325 | off++; /* Skip over Reserved */ | ||
326 | buf[off++] = 4; /* DESIGNATOR LENGTH */ | ||
327 | off += 2; /* Skip over Reserved Field */ | ||
328 | buf[off++] = ((tg_pt_gp_id >> 8) & 0xff); | ||
329 | buf[off++] = (tg_pt_gp_id & 0xff); | ||
330 | len += 8; /* Header size + Designation descriptor */ | ||
331 | /* | ||
332 | * Logical Unit Group identifier, see spc4r17 | ||
333 | * section 7.7.3.8 | ||
334 | */ | ||
335 | check_lu_gp: | ||
336 | lu_gp_mem = dev->dev_alua_lu_gp_mem; | ||
337 | if (!lu_gp_mem) | ||
338 | goto check_scsi_name; | ||
339 | |||
340 | spin_lock(&lu_gp_mem->lu_gp_mem_lock); | ||
341 | lu_gp = lu_gp_mem->lu_gp; | ||
342 | if (!lu_gp) { | ||
343 | spin_unlock(&lu_gp_mem->lu_gp_mem_lock); | ||
344 | goto check_scsi_name; | ||
345 | } | ||
346 | lu_gp_id = lu_gp->lu_gp_id; | ||
347 | spin_unlock(&lu_gp_mem->lu_gp_mem_lock); | ||
348 | |||
349 | buf[off++] |= 0x1; /* CODE SET == Binary */ | ||
350 | /* DESIGNATOR TYPE == Logical Unit Group identifier */ | ||
351 | buf[off++] |= 0x6; | ||
352 | off++; /* Skip over Reserved */ | ||
353 | buf[off++] = 4; /* DESIGNATOR LENGTH */ | ||
354 | off += 2; /* Skip over Reserved Field */ | ||
355 | buf[off++] = ((lu_gp_id >> 8) & 0xff); | ||
356 | buf[off++] = (lu_gp_id & 0xff); | ||
357 | len += 8; /* Header size + Designation descriptor */ | ||
358 | /* | ||
359 | * SCSI name string designator, see spc4r17 | ||
360 | * section 7.7.3.11 | ||
361 | * | ||
362 | * Get the PROTOCOL IDENTIFIER as defined by spc4r17 | ||
363 | * section 7.5.1 Table 362 | ||
364 | */ | ||
365 | check_scsi_name: | ||
366 | scsi_name_len = strlen(tpg->se_tpg_tfo->tpg_get_wwn(tpg)); | ||
367 | /* UTF-8 ",t,0x<16-bit TPGT>" + NULL Terminator */ | ||
368 | scsi_name_len += 10; | ||
369 | /* Check for 4-byte padding */ | ||
370 | padding = ((-scsi_name_len) & 3); | ||
371 | if (padding != 0) | ||
372 | scsi_name_len += padding; | ||
373 | /* Header size + Designation descriptor */ | ||
374 | scsi_name_len += 4; | ||
375 | |||
376 | buf[off] = | ||
377 | (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4); | ||
378 | buf[off++] |= 0x3; /* CODE SET == UTF-8 */ | ||
379 | buf[off] = 0x80; /* Set PIV=1 */ | ||
380 | /* Set ASSOCIATION == target port: 01b */ | ||
381 | buf[off] |= 0x10; | ||
382 | /* DESIGNATOR TYPE == SCSI name string */ | ||
383 | buf[off++] |= 0x8; | ||
384 | off += 2; /* Skip over Reserved and length */ | ||
385 | /* | ||
386 | * SCSI name string identifer containing, $FABRIC_MOD | ||
387 | * dependent information. For LIO-Target and iSCSI | ||
388 | * Target Port, this means "<iSCSI name>,t,0x<TPGT> in | ||
389 | * UTF-8 encoding. | ||
390 | */ | ||
391 | tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg); | ||
392 | scsi_name_len = sprintf(&buf[off], "%s,t,0x%04x", | ||
393 | tpg->se_tpg_tfo->tpg_get_wwn(tpg), tpgt); | ||
394 | scsi_name_len += 1 /* Include NULL terminator */; | ||
395 | /* | ||
396 | * The null-terminated, null-padded (see 4.4.2) SCSI | ||
397 | * NAME STRING field contains a UTF-8 format string. | ||
398 | * The number of bytes in the SCSI NAME STRING field | ||
399 | * (i.e., the value in the DESIGNATOR LENGTH field) | ||
400 | * shall be no larger than 256 and shall be a multiple | ||
401 | * of four. | ||
402 | */ | ||
403 | if (padding) | ||
404 | scsi_name_len += padding; | ||
405 | |||
406 | buf[off-1] = scsi_name_len; | ||
407 | off += scsi_name_len; | ||
408 | /* Header size + Designation descriptor */ | ||
409 | len += (scsi_name_len + 4); | ||
410 | } | ||
411 | buf[2] = ((len >> 8) & 0xff); | ||
412 | buf[3] = (len & 0xff); /* Page Length for VPD 0x83 */ | ||
413 | return 0; | ||
414 | } | ||
415 | |||
416 | /* Extended INQUIRY Data VPD Page */ | ||
417 | static int | ||
418 | target_emulate_evpd_86(struct se_cmd *cmd, unsigned char *buf) | ||
419 | { | ||
420 | buf[3] = 0x3c; | ||
421 | /* Set HEADSUP, ORDSUP, SIMPSUP */ | ||
422 | buf[5] = 0x07; | ||
423 | |||
424 | /* If WriteCache emulation is enabled, set V_SUP */ | ||
425 | if (cmd->se_dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) | ||
426 | buf[6] = 0x01; | ||
427 | return 0; | ||
428 | } | ||
429 | |||
430 | /* Block Limits VPD page */ | ||
431 | static int | ||
432 | target_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) | ||
433 | { | ||
434 | struct se_device *dev = cmd->se_dev; | ||
435 | u32 max_sectors; | ||
436 | int have_tp = 0; | ||
437 | |||
438 | /* | ||
439 | * Following sbc3r22 section 6.5.3 Block Limits VPD page, when | ||
440 | * emulate_tpu=1 or emulate_tpws=1 we will be expect a | ||
441 | * different page length for Thin Provisioning. | ||
442 | */ | ||
443 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) | ||
444 | have_tp = 1; | ||
445 | |||
446 | buf[0] = dev->transport->get_device_type(dev); | ||
447 | buf[3] = have_tp ? 0x3c : 0x10; | ||
448 | |||
449 | /* Set WSNZ to 1 */ | ||
450 | buf[4] = 0x01; | ||
451 | |||
452 | /* | ||
453 | * Set OPTIMAL TRANSFER LENGTH GRANULARITY | ||
454 | */ | ||
455 | put_unaligned_be16(1, &buf[6]); | ||
456 | |||
457 | /* | ||
458 | * Set MAXIMUM TRANSFER LENGTH | ||
459 | */ | ||
460 | max_sectors = min(dev->se_sub_dev->se_dev_attrib.fabric_max_sectors, | ||
461 | dev->se_sub_dev->se_dev_attrib.hw_max_sectors); | ||
462 | put_unaligned_be32(max_sectors, &buf[8]); | ||
463 | |||
464 | /* | ||
465 | * Set OPTIMAL TRANSFER LENGTH | ||
466 | */ | ||
467 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.optimal_sectors, &buf[12]); | ||
468 | |||
469 | /* | ||
470 | * Exit now if we don't support TP. | ||
471 | */ | ||
472 | if (!have_tp) | ||
473 | return 0; | ||
474 | |||
475 | /* | ||
476 | * Set MAXIMUM UNMAP LBA COUNT | ||
477 | */ | ||
478 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_lba_count, &buf[20]); | ||
479 | |||
480 | /* | ||
481 | * Set MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT | ||
482 | */ | ||
483 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count, | ||
484 | &buf[24]); | ||
485 | |||
486 | /* | ||
487 | * Set OPTIMAL UNMAP GRANULARITY | ||
488 | */ | ||
489 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity, &buf[28]); | ||
490 | |||
491 | /* | ||
492 | * UNMAP GRANULARITY ALIGNMENT | ||
493 | */ | ||
494 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment, | ||
495 | &buf[32]); | ||
496 | if (dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment != 0) | ||
497 | buf[32] |= 0x80; /* Set the UGAVALID bit */ | ||
498 | |||
499 | return 0; | ||
500 | } | ||
501 | |||
502 | /* Block Device Characteristics VPD page */ | ||
503 | static int | ||
504 | target_emulate_evpd_b1(struct se_cmd *cmd, unsigned char *buf) | ||
505 | { | ||
506 | struct se_device *dev = cmd->se_dev; | ||
507 | |||
508 | buf[0] = dev->transport->get_device_type(dev); | ||
509 | buf[3] = 0x3c; | ||
510 | buf[5] = dev->se_sub_dev->se_dev_attrib.is_nonrot ? 1 : 0; | ||
511 | |||
512 | return 0; | ||
513 | } | ||
514 | |||
515 | /* Thin Provisioning VPD */ | ||
516 | static int | ||
517 | target_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf) | ||
518 | { | ||
519 | struct se_device *dev = cmd->se_dev; | ||
520 | |||
521 | /* | ||
522 | * From sbc3r22 section 6.5.4 Thin Provisioning VPD page: | ||
523 | * | ||
524 | * The PAGE LENGTH field is defined in SPC-4. If the DP bit is set to | ||
525 | * zero, then the page length shall be set to 0004h. If the DP bit | ||
526 | * is set to one, then the page length shall be set to the value | ||
527 | * defined in table 162. | ||
528 | */ | ||
529 | buf[0] = dev->transport->get_device_type(dev); | ||
530 | |||
531 | /* | ||
532 | * Set Hardcoded length mentioned above for DP=0 | ||
533 | */ | ||
534 | put_unaligned_be16(0x0004, &buf[2]); | ||
535 | |||
536 | /* | ||
537 | * The THRESHOLD EXPONENT field indicates the threshold set size in | ||
538 | * LBAs as a power of 2 (i.e., the threshold set size is equal to | ||
539 | * 2(threshold exponent)). | ||
540 | * | ||
541 | * Note that this is currently set to 0x00 as mkp says it will be | ||
542 | * changing again. We can enable this once it has settled in T10 | ||
543 | * and is actually used by Linux/SCSI ML code. | ||
544 | */ | ||
545 | buf[4] = 0x00; | ||
546 | |||
547 | /* | ||
548 | * A TPU bit set to one indicates that the device server supports | ||
549 | * the UNMAP command (see 5.25). A TPU bit set to zero indicates | ||
550 | * that the device server does not support the UNMAP command. | ||
551 | */ | ||
552 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu != 0) | ||
553 | buf[5] = 0x80; | ||
554 | |||
555 | /* | ||
556 | * A TPWS bit set to one indicates that the device server supports | ||
557 | * the use of the WRITE SAME (16) command (see 5.42) to unmap LBAs. | ||
558 | * A TPWS bit set to zero indicates that the device server does not | ||
559 | * support the use of the WRITE SAME (16) command to unmap LBAs. | ||
560 | */ | ||
561 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpws != 0) | ||
562 | buf[5] |= 0x40; | ||
563 | |||
564 | return 0; | ||
565 | } | ||
566 | |||
567 | static int | ||
568 | target_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf); | ||
569 | |||
570 | static struct { | ||
571 | uint8_t page; | ||
572 | int (*emulate)(struct se_cmd *, unsigned char *); | ||
573 | } evpd_handlers[] = { | ||
574 | { .page = 0x00, .emulate = target_emulate_evpd_00 }, | ||
575 | { .page = 0x80, .emulate = target_emulate_evpd_80 }, | ||
576 | { .page = 0x83, .emulate = target_emulate_evpd_83 }, | ||
577 | { .page = 0x86, .emulate = target_emulate_evpd_86 }, | ||
578 | { .page = 0xb0, .emulate = target_emulate_evpd_b0 }, | ||
579 | { .page = 0xb1, .emulate = target_emulate_evpd_b1 }, | ||
580 | { .page = 0xb2, .emulate = target_emulate_evpd_b2 }, | ||
581 | }; | ||
582 | |||
583 | /* supported vital product data pages */ | ||
584 | static int | ||
585 | target_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf) | ||
586 | { | ||
587 | int p; | ||
588 | |||
589 | /* | ||
590 | * Only report the INQUIRY EVPD=1 pages after a valid NAA | ||
591 | * Registered Extended LUN WWN has been set via ConfigFS | ||
592 | * during device creation/restart. | ||
593 | */ | ||
594 | if (cmd->se_dev->se_sub_dev->su_dev_flags & | ||
595 | SDF_EMULATED_VPD_UNIT_SERIAL) { | ||
596 | buf[3] = ARRAY_SIZE(evpd_handlers); | ||
597 | for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) | ||
598 | buf[p + 4] = evpd_handlers[p].page; | ||
599 | } | ||
600 | |||
601 | return 0; | ||
602 | } | ||
603 | |||
604 | int target_emulate_inquiry(struct se_cmd *cmd) | ||
605 | { | ||
606 | struct se_device *dev = cmd->se_dev; | ||
607 | struct se_portal_group *tpg = cmd->se_lun->lun_sep->sep_tpg; | ||
608 | unsigned char *buf, *map_buf; | ||
609 | unsigned char *cdb = cmd->t_task_cdb; | ||
610 | int p, ret; | ||
611 | |||
612 | map_buf = transport_kmap_data_sg(cmd); | ||
613 | /* | ||
614 | * If SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is not set, then we | ||
615 | * know we actually allocated a full page. Otherwise, if the | ||
616 | * data buffer is too small, allocate a temporary buffer so we | ||
617 | * don't have to worry about overruns in all our INQUIRY | ||
618 | * emulation handling. | ||
619 | */ | ||
620 | if (cmd->data_length < SE_INQUIRY_BUF && | ||
621 | (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) { | ||
622 | buf = kzalloc(SE_INQUIRY_BUF, GFP_KERNEL); | ||
623 | if (!buf) { | ||
624 | transport_kunmap_data_sg(cmd); | ||
625 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
626 | return -ENOMEM; | ||
627 | } | ||
628 | } else { | ||
629 | buf = map_buf; | ||
630 | } | ||
631 | |||
632 | if (dev == tpg->tpg_virt_lun0.lun_se_dev) | ||
633 | buf[0] = 0x3f; /* Not connected */ | ||
634 | else | ||
635 | buf[0] = dev->transport->get_device_type(dev); | ||
636 | |||
637 | if (!(cdb[1] & 0x1)) { | ||
638 | if (cdb[2]) { | ||
639 | pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n", | ||
640 | cdb[2]); | ||
641 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
642 | ret = -EINVAL; | ||
643 | goto out; | ||
644 | } | ||
645 | |||
646 | ret = target_emulate_inquiry_std(cmd, buf); | ||
647 | goto out; | ||
648 | } | ||
649 | |||
650 | for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) { | ||
651 | if (cdb[2] == evpd_handlers[p].page) { | ||
652 | buf[1] = cdb[2]; | ||
653 | ret = evpd_handlers[p].emulate(cmd, buf); | ||
654 | goto out; | ||
655 | } | ||
656 | } | ||
657 | |||
658 | pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]); | ||
659 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
660 | ret = -EINVAL; | ||
661 | |||
662 | out: | ||
663 | if (buf != map_buf) { | ||
664 | memcpy(map_buf, buf, cmd->data_length); | ||
665 | kfree(buf); | ||
666 | } | ||
667 | transport_kunmap_data_sg(cmd); | ||
668 | |||
669 | if (!ret) | ||
670 | target_complete_cmd(cmd, GOOD); | ||
671 | return ret; | ||
672 | } | ||
673 | |||
674 | int target_emulate_readcapacity(struct se_cmd *cmd) | ||
675 | { | ||
676 | struct se_device *dev = cmd->se_dev; | ||
677 | unsigned char *buf; | ||
678 | unsigned long long blocks_long = dev->transport->get_blocks(dev); | ||
679 | u32 blocks; | ||
680 | |||
681 | if (blocks_long >= 0x00000000ffffffff) | ||
682 | blocks = 0xffffffff; | ||
683 | else | ||
684 | blocks = (u32)blocks_long; | ||
685 | |||
686 | buf = transport_kmap_data_sg(cmd); | ||
687 | |||
688 | buf[0] = (blocks >> 24) & 0xff; | ||
689 | buf[1] = (blocks >> 16) & 0xff; | ||
690 | buf[2] = (blocks >> 8) & 0xff; | ||
691 | buf[3] = blocks & 0xff; | ||
692 | buf[4] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff; | ||
693 | buf[5] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff; | ||
694 | buf[6] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff; | ||
695 | buf[7] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff; | ||
696 | |||
697 | transport_kunmap_data_sg(cmd); | ||
698 | |||
699 | target_complete_cmd(cmd, GOOD); | ||
700 | return 0; | ||
701 | } | ||
702 | |||
703 | int target_emulate_readcapacity_16(struct se_cmd *cmd) | ||
704 | { | ||
705 | struct se_device *dev = cmd->se_dev; | ||
706 | unsigned char *buf; | ||
707 | unsigned long long blocks = dev->transport->get_blocks(dev); | ||
708 | |||
709 | buf = transport_kmap_data_sg(cmd); | ||
710 | |||
711 | buf[0] = (blocks >> 56) & 0xff; | ||
712 | buf[1] = (blocks >> 48) & 0xff; | ||
713 | buf[2] = (blocks >> 40) & 0xff; | ||
714 | buf[3] = (blocks >> 32) & 0xff; | ||
715 | buf[4] = (blocks >> 24) & 0xff; | ||
716 | buf[5] = (blocks >> 16) & 0xff; | ||
717 | buf[6] = (blocks >> 8) & 0xff; | ||
718 | buf[7] = blocks & 0xff; | ||
719 | buf[8] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff; | ||
720 | buf[9] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff; | ||
721 | buf[10] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff; | ||
722 | buf[11] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff; | ||
723 | /* | ||
724 | * Set Thin Provisioning Enable bit following sbc3r22 in section | ||
725 | * READ CAPACITY (16) byte 14 if emulate_tpu or emulate_tpws is enabled. | ||
726 | */ | ||
727 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) | ||
728 | buf[14] = 0x80; | ||
729 | |||
730 | transport_kunmap_data_sg(cmd); | ||
731 | |||
732 | target_complete_cmd(cmd, GOOD); | ||
733 | return 0; | ||
734 | } | ||
735 | |||
736 | static int | ||
737 | target_modesense_rwrecovery(unsigned char *p) | ||
738 | { | ||
739 | p[0] = 0x01; | ||
740 | p[1] = 0x0a; | ||
741 | |||
742 | return 12; | ||
743 | } | ||
744 | |||
745 | static int | ||
746 | target_modesense_control(struct se_device *dev, unsigned char *p) | ||
747 | { | ||
748 | p[0] = 0x0a; | ||
749 | p[1] = 0x0a; | ||
750 | p[2] = 2; | ||
751 | /* | ||
752 | * From spc4r23, 7.4.7 Control mode page | ||
753 | * | ||
754 | * The QUEUE ALGORITHM MODIFIER field (see table 368) specifies | ||
755 | * restrictions on the algorithm used for reordering commands | ||
756 | * having the SIMPLE task attribute (see SAM-4). | ||
757 | * | ||
758 | * Table 368 -- QUEUE ALGORITHM MODIFIER field | ||
759 | * Code Description | ||
760 | * 0h Restricted reordering | ||
761 | * 1h Unrestricted reordering allowed | ||
762 | * 2h to 7h Reserved | ||
763 | * 8h to Fh Vendor specific | ||
764 | * | ||
765 | * A value of zero in the QUEUE ALGORITHM MODIFIER field specifies that | ||
766 | * the device server shall order the processing sequence of commands | ||
767 | * having the SIMPLE task attribute such that data integrity is maintained | ||
768 | * for that I_T nexus (i.e., if the transmission of new SCSI transport protocol | ||
769 | * requests is halted at any time, the final value of all data observable | ||
770 | * on the medium shall be the same as if all the commands had been processed | ||
771 | * with the ORDERED task attribute). | ||
772 | * | ||
773 | * A value of one in the QUEUE ALGORITHM MODIFIER field specifies that the | ||
774 | * device server may reorder the processing sequence of commands having the | ||
775 | * SIMPLE task attribute in any manner. Any data integrity exposures related to | ||
776 | * command sequence order shall be explicitly handled by the application client | ||
777 | * through the selection of appropriate ommands and task attributes. | ||
778 | */ | ||
779 | p[3] = (dev->se_sub_dev->se_dev_attrib.emulate_rest_reord == 1) ? 0x00 : 0x10; | ||
780 | /* | ||
781 | * From spc4r17, section 7.4.6 Control mode Page | ||
782 | * | ||
783 | * Unit Attention interlocks control (UN_INTLCK_CTRL) to code 00b | ||
784 | * | ||
785 | * 00b: The logical unit shall clear any unit attention condition | ||
786 | * reported in the same I_T_L_Q nexus transaction as a CHECK CONDITION | ||
787 | * status and shall not establish a unit attention condition when a com- | ||
788 | * mand is completed with BUSY, TASK SET FULL, or RESERVATION CONFLICT | ||
789 | * status. | ||
790 | * | ||
791 | * 10b: The logical unit shall not clear any unit attention condition | ||
792 | * reported in the same I_T_L_Q nexus transaction as a CHECK CONDITION | ||
793 | * status and shall not establish a unit attention condition when | ||
794 | * a command is completed with BUSY, TASK SET FULL, or RESERVATION | ||
795 | * CONFLICT status. | ||
796 | * | ||
797 | * 11b a The logical unit shall not clear any unit attention condition | ||
798 | * reported in the same I_T_L_Q nexus transaction as a CHECK CONDITION | ||
799 | * status and shall establish a unit attention condition for the | ||
800 | * initiator port associated with the I_T nexus on which the BUSY, | ||
801 | * TASK SET FULL, or RESERVATION CONFLICT status is being returned. | ||
802 | * Depending on the status, the additional sense code shall be set to | ||
803 | * PREVIOUS BUSY STATUS, PREVIOUS TASK SET FULL STATUS, or PREVIOUS | ||
804 | * RESERVATION CONFLICT STATUS. Until it is cleared by a REQUEST SENSE | ||
805 | * command, a unit attention condition shall be established only once | ||
806 | * for a BUSY, TASK SET FULL, or RESERVATION CONFLICT status regardless | ||
807 | * to the number of commands completed with one of those status codes. | ||
808 | */ | ||
809 | p[4] = (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 2) ? 0x30 : | ||
810 | (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 1) ? 0x20 : 0x00; | ||
811 | /* | ||
812 | * From spc4r17, section 7.4.6 Control mode Page | ||
813 | * | ||
814 | * Task Aborted Status (TAS) bit set to zero. | ||
815 | * | ||
816 | * A task aborted status (TAS) bit set to zero specifies that aborted | ||
817 | * tasks shall be terminated by the device server without any response | ||
818 | * to the application client. A TAS bit set to one specifies that tasks | ||
819 | * aborted by the actions of an I_T nexus other than the I_T nexus on | ||
820 | * which the command was received shall be completed with TASK ABORTED | ||
821 | * status (see SAM-4). | ||
822 | */ | ||
823 | p[5] = (dev->se_sub_dev->se_dev_attrib.emulate_tas) ? 0x40 : 0x00; | ||
824 | p[8] = 0xff; | ||
825 | p[9] = 0xff; | ||
826 | p[11] = 30; | ||
827 | |||
828 | return 12; | ||
829 | } | ||
830 | |||
831 | static int | ||
832 | target_modesense_caching(struct se_device *dev, unsigned char *p) | ||
833 | { | ||
834 | p[0] = 0x08; | ||
835 | p[1] = 0x12; | ||
836 | if (dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) | ||
837 | p[2] = 0x04; /* Write Cache Enable */ | ||
838 | p[12] = 0x20; /* Disabled Read Ahead */ | ||
839 | |||
840 | return 20; | ||
841 | } | ||
842 | |||
843 | static void | ||
844 | target_modesense_write_protect(unsigned char *buf, int type) | ||
845 | { | ||
846 | /* | ||
847 | * I believe that the WP bit (bit 7) in the mode header is the same for | ||
848 | * all device types.. | ||
849 | */ | ||
850 | switch (type) { | ||
851 | case TYPE_DISK: | ||
852 | case TYPE_TAPE: | ||
853 | default: | ||
854 | buf[0] |= 0x80; /* WP bit */ | ||
855 | break; | ||
856 | } | ||
857 | } | ||
858 | |||
859 | static void | ||
860 | target_modesense_dpofua(unsigned char *buf, int type) | ||
861 | { | ||
862 | switch (type) { | ||
863 | case TYPE_DISK: | ||
864 | buf[0] |= 0x10; /* DPOFUA bit */ | ||
865 | break; | ||
866 | default: | ||
867 | break; | ||
868 | } | ||
869 | } | ||
870 | |||
871 | int target_emulate_modesense(struct se_cmd *cmd) | ||
872 | { | ||
873 | struct se_device *dev = cmd->se_dev; | ||
874 | char *cdb = cmd->t_task_cdb; | ||
875 | unsigned char *rbuf; | ||
876 | int type = dev->transport->get_device_type(dev); | ||
877 | int ten = (cmd->t_task_cdb[0] == MODE_SENSE_10); | ||
878 | int offset = ten ? 8 : 4; | ||
879 | int length = 0; | ||
880 | unsigned char buf[SE_MODE_PAGE_BUF]; | ||
881 | |||
882 | memset(buf, 0, SE_MODE_PAGE_BUF); | ||
883 | |||
884 | switch (cdb[2] & 0x3f) { | ||
885 | case 0x01: | ||
886 | length = target_modesense_rwrecovery(&buf[offset]); | ||
887 | break; | ||
888 | case 0x08: | ||
889 | length = target_modesense_caching(dev, &buf[offset]); | ||
890 | break; | ||
891 | case 0x0a: | ||
892 | length = target_modesense_control(dev, &buf[offset]); | ||
893 | break; | ||
894 | case 0x3f: | ||
895 | length = target_modesense_rwrecovery(&buf[offset]); | ||
896 | length += target_modesense_caching(dev, &buf[offset+length]); | ||
897 | length += target_modesense_control(dev, &buf[offset+length]); | ||
898 | break; | ||
899 | default: | ||
900 | pr_err("MODE SENSE: unimplemented page/subpage: 0x%02x/0x%02x\n", | ||
901 | cdb[2] & 0x3f, cdb[3]); | ||
902 | cmd->scsi_sense_reason = TCM_UNKNOWN_MODE_PAGE; | ||
903 | return -EINVAL; | ||
904 | } | ||
905 | offset += length; | ||
906 | |||
907 | if (ten) { | ||
908 | offset -= 2; | ||
909 | buf[0] = (offset >> 8) & 0xff; | ||
910 | buf[1] = offset & 0xff; | ||
911 | |||
912 | if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) || | ||
913 | (cmd->se_deve && | ||
914 | (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) | ||
915 | target_modesense_write_protect(&buf[3], type); | ||
916 | |||
917 | if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) && | ||
918 | (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0)) | ||
919 | target_modesense_dpofua(&buf[3], type); | ||
920 | |||
921 | if ((offset + 2) > cmd->data_length) | ||
922 | offset = cmd->data_length; | ||
923 | |||
924 | } else { | ||
925 | offset -= 1; | ||
926 | buf[0] = offset & 0xff; | ||
927 | |||
928 | if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) || | ||
929 | (cmd->se_deve && | ||
930 | (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) | ||
931 | target_modesense_write_protect(&buf[2], type); | ||
932 | |||
933 | if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) && | ||
934 | (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0)) | ||
935 | target_modesense_dpofua(&buf[2], type); | ||
936 | |||
937 | if ((offset + 1) > cmd->data_length) | ||
938 | offset = cmd->data_length; | ||
939 | } | ||
940 | |||
941 | rbuf = transport_kmap_data_sg(cmd); | ||
942 | memcpy(rbuf, buf, offset); | ||
943 | transport_kunmap_data_sg(cmd); | ||
944 | |||
945 | target_complete_cmd(cmd, GOOD); | ||
946 | return 0; | ||
947 | } | ||
948 | |||
949 | int target_emulate_request_sense(struct se_cmd *cmd) | ||
950 | { | ||
951 | unsigned char *cdb = cmd->t_task_cdb; | ||
952 | unsigned char *buf; | ||
953 | u8 ua_asc = 0, ua_ascq = 0; | ||
954 | int err = 0; | ||
955 | |||
956 | if (cdb[1] & 0x01) { | ||
957 | pr_err("REQUEST_SENSE description emulation not" | ||
958 | " supported\n"); | ||
959 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
960 | return -ENOSYS; | ||
961 | } | ||
962 | |||
963 | buf = transport_kmap_data_sg(cmd); | ||
964 | |||
965 | if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { | ||
966 | /* | ||
967 | * CURRENT ERROR, UNIT ATTENTION | ||
968 | */ | ||
969 | buf[0] = 0x70; | ||
970 | buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; | ||
971 | |||
972 | if (cmd->data_length < 18) { | ||
973 | buf[7] = 0x00; | ||
974 | err = -EINVAL; | ||
975 | goto end; | ||
976 | } | ||
977 | /* | ||
978 | * The Additional Sense Code (ASC) from the UNIT ATTENTION | ||
979 | */ | ||
980 | buf[SPC_ASC_KEY_OFFSET] = ua_asc; | ||
981 | buf[SPC_ASCQ_KEY_OFFSET] = ua_ascq; | ||
982 | buf[7] = 0x0A; | ||
983 | } else { | ||
984 | /* | ||
985 | * CURRENT ERROR, NO SENSE | ||
986 | */ | ||
987 | buf[0] = 0x70; | ||
988 | buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE; | ||
989 | |||
990 | if (cmd->data_length < 18) { | ||
991 | buf[7] = 0x00; | ||
992 | err = -EINVAL; | ||
993 | goto end; | ||
994 | } | ||
995 | /* | ||
996 | * NO ADDITIONAL SENSE INFORMATION | ||
997 | */ | ||
998 | buf[SPC_ASC_KEY_OFFSET] = 0x00; | ||
999 | buf[7] = 0x0A; | ||
1000 | } | ||
1001 | |||
1002 | end: | ||
1003 | transport_kunmap_data_sg(cmd); | ||
1004 | target_complete_cmd(cmd, GOOD); | ||
1005 | return 0; | ||
1006 | } | ||
1007 | |||
1008 | /* | ||
1009 | * Used for TCM/IBLOCK and TCM/FILEIO for block/blk-lib.c level discard support. | ||
1010 | * Note this is not used for TCM/pSCSI passthrough | ||
1011 | */ | ||
1012 | int target_emulate_unmap(struct se_cmd *cmd) | ||
1013 | { | ||
1014 | struct se_device *dev = cmd->se_dev; | ||
1015 | unsigned char *buf, *ptr = NULL; | ||
1016 | unsigned char *cdb = &cmd->t_task_cdb[0]; | ||
1017 | sector_t lba; | ||
1018 | unsigned int size = cmd->data_length, range; | ||
1019 | int ret = 0, offset; | ||
1020 | unsigned short dl, bd_dl; | ||
1021 | |||
1022 | if (!dev->transport->do_discard) { | ||
1023 | pr_err("UNMAP emulation not supported for: %s\n", | ||
1024 | dev->transport->name); | ||
1025 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | ||
1026 | return -ENOSYS; | ||
1027 | } | ||
1028 | |||
1029 | /* First UNMAP block descriptor starts at 8 byte offset */ | ||
1030 | offset = 8; | ||
1031 | size -= 8; | ||
1032 | dl = get_unaligned_be16(&cdb[0]); | ||
1033 | bd_dl = get_unaligned_be16(&cdb[2]); | ||
1034 | |||
1035 | buf = transport_kmap_data_sg(cmd); | ||
1036 | |||
1037 | ptr = &buf[offset]; | ||
1038 | pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" | ||
1039 | " ptr: %p\n", dev->transport->name, dl, bd_dl, size, ptr); | ||
1040 | |||
1041 | while (size) { | ||
1042 | lba = get_unaligned_be64(&ptr[0]); | ||
1043 | range = get_unaligned_be32(&ptr[8]); | ||
1044 | pr_debug("UNMAP: Using lba: %llu and range: %u\n", | ||
1045 | (unsigned long long)lba, range); | ||
1046 | |||
1047 | ret = dev->transport->do_discard(dev, lba, range); | ||
1048 | if (ret < 0) { | ||
1049 | pr_err("blkdev_issue_discard() failed: %d\n", | ||
1050 | ret); | ||
1051 | goto err; | ||
1052 | } | ||
1053 | |||
1054 | ptr += 16; | ||
1055 | size -= 16; | ||
1056 | } | ||
1057 | |||
1058 | err: | ||
1059 | transport_kunmap_data_sg(cmd); | ||
1060 | if (!ret) | ||
1061 | target_complete_cmd(cmd, GOOD); | ||
1062 | return ret; | ||
1063 | } | ||
1064 | |||
1065 | /* | ||
1066 | * Used for TCM/IBLOCK and TCM/FILEIO for block/blk-lib.c level discard support. | ||
1067 | * Note this is not used for TCM/pSCSI passthrough | ||
1068 | */ | ||
1069 | int target_emulate_write_same(struct se_cmd *cmd) | ||
1070 | { | ||
1071 | struct se_device *dev = cmd->se_dev; | ||
1072 | sector_t range; | ||
1073 | sector_t lba = cmd->t_task_lba; | ||
1074 | u32 num_blocks; | ||
1075 | int ret; | ||
1076 | |||
1077 | if (!dev->transport->do_discard) { | ||
1078 | pr_err("WRITE_SAME emulation not supported" | ||
1079 | " for: %s\n", dev->transport->name); | ||
1080 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | ||
1081 | return -ENOSYS; | ||
1082 | } | ||
1083 | |||
1084 | if (cmd->t_task_cdb[0] == WRITE_SAME) | ||
1085 | num_blocks = get_unaligned_be16(&cmd->t_task_cdb[7]); | ||
1086 | else if (cmd->t_task_cdb[0] == WRITE_SAME_16) | ||
1087 | num_blocks = get_unaligned_be32(&cmd->t_task_cdb[10]); | ||
1088 | else /* WRITE_SAME_32 via VARIABLE_LENGTH_CMD */ | ||
1089 | num_blocks = get_unaligned_be32(&cmd->t_task_cdb[28]); | ||
1090 | |||
1091 | /* | ||
1092 | * Use the explicit range when non zero is supplied, otherwise calculate | ||
1093 | * the remaining range based on ->get_blocks() - starting LBA. | ||
1094 | */ | ||
1095 | if (num_blocks != 0) | ||
1096 | range = num_blocks; | ||
1097 | else | ||
1098 | range = (dev->transport->get_blocks(dev) - lba) + 1; | ||
1099 | |||
1100 | pr_debug("WRITE_SAME UNMAP: LBA: %llu Range: %llu\n", | ||
1101 | (unsigned long long)lba, (unsigned long long)range); | ||
1102 | |||
1103 | ret = dev->transport->do_discard(dev, lba, range); | ||
1104 | if (ret < 0) { | ||
1105 | pr_debug("blkdev_issue_discard() failed for WRITE_SAME\n"); | ||
1106 | return ret; | ||
1107 | } | ||
1108 | |||
1109 | target_complete_cmd(cmd, GOOD); | ||
1110 | return 0; | ||
1111 | } | ||
1112 | |||
1113 | int target_emulate_synchronize_cache(struct se_cmd *cmd) | ||
1114 | { | ||
1115 | if (!cmd->se_dev->transport->do_sync_cache) { | ||
1116 | pr_err("SYNCHRONIZE_CACHE emulation not supported" | ||
1117 | " for: %s\n", cmd->se_dev->transport->name); | ||
1118 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | ||
1119 | return -ENOSYS; | ||
1120 | } | ||
1121 | |||
1122 | cmd->se_dev->transport->do_sync_cache(cmd); | ||
1123 | return 0; | ||
1124 | } | ||
1125 | |||
1126 | int target_emulate_noop(struct se_cmd *cmd) | ||
1127 | { | ||
1128 | target_complete_cmd(cmd, GOOD); | ||
1129 | return 0; | ||
1130 | } | ||
diff --git a/drivers/target/target_core_internal.h b/drivers/target/target_core_internal.h index 165e82429687..031c2889f34c 100644 --- a/drivers/target/target_core_internal.h +++ b/drivers/target/target_core_internal.h | |||
@@ -4,17 +4,6 @@ | |||
4 | /* target_core_alua.c */ | 4 | /* target_core_alua.c */ |
5 | extern struct t10_alua_lu_gp *default_lu_gp; | 5 | extern struct t10_alua_lu_gp *default_lu_gp; |
6 | 6 | ||
7 | /* target_core_cdb.c */ | ||
8 | int target_emulate_inquiry(struct se_cmd *cmd); | ||
9 | int target_emulate_readcapacity(struct se_cmd *cmd); | ||
10 | int target_emulate_readcapacity_16(struct se_cmd *cmd); | ||
11 | int target_emulate_modesense(struct se_cmd *cmd); | ||
12 | int target_emulate_request_sense(struct se_cmd *cmd); | ||
13 | int target_emulate_unmap(struct se_cmd *cmd); | ||
14 | int target_emulate_write_same(struct se_cmd *cmd); | ||
15 | int target_emulate_synchronize_cache(struct se_cmd *cmd); | ||
16 | int target_emulate_noop(struct se_cmd *cmd); | ||
17 | |||
18 | /* target_core_device.c */ | 7 | /* target_core_device.c */ |
19 | struct se_dev_entry *core_get_se_deve_from_rtpi(struct se_node_acl *, u16); | 8 | struct se_dev_entry *core_get_se_deve_from_rtpi(struct se_node_acl *, u16); |
20 | int core_free_device_list_for_node(struct se_node_acl *, | 9 | int core_free_device_list_for_node(struct se_node_acl *, |
@@ -116,6 +105,7 @@ int transport_dump_vpd_ident(struct t10_vpd *, unsigned char *, int); | |||
116 | bool target_stop_cmd(struct se_cmd *cmd, unsigned long *flags); | 105 | bool target_stop_cmd(struct se_cmd *cmd, unsigned long *flags); |
117 | int transport_clear_lun_from_sessions(struct se_lun *); | 106 | int transport_clear_lun_from_sessions(struct se_lun *); |
118 | void transport_send_task_abort(struct se_cmd *); | 107 | void transport_send_task_abort(struct se_cmd *); |
108 | int target_cmd_size_check(struct se_cmd *cmd, unsigned int size); | ||
119 | 109 | ||
120 | /* target_core_stat.c */ | 110 | /* target_core_stat.c */ |
121 | void target_stat_setup_dev_default_groups(struct se_subsystem_dev *); | 111 | void target_stat_setup_dev_default_groups(struct se_subsystem_dev *); |
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 378da242d841..099c59d31b1f 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c | |||
@@ -1022,470 +1022,53 @@ fail: | |||
1022 | return -ENOMEM; | 1022 | return -ENOMEM; |
1023 | } | 1023 | } |
1024 | 1024 | ||
1025 | static inline u32 pscsi_get_sectors_6( | 1025 | static int pscsi_parse_cdb(struct se_cmd *cmd) |
1026 | unsigned char *cdb, | ||
1027 | struct se_cmd *cmd, | ||
1028 | int *ret) | ||
1029 | { | 1026 | { |
1030 | struct se_device *dev = cmd->se_dev; | 1027 | unsigned char *cdb = cmd->t_task_cdb; |
1031 | 1028 | unsigned int dummy_size; | |
1032 | /* | 1029 | int ret; |
1033 | * Assume TYPE_DISK for non struct se_device objects. | ||
1034 | * Use 8-bit sector value. | ||
1035 | */ | ||
1036 | if (!dev) | ||
1037 | goto type_disk; | ||
1038 | |||
1039 | /* | ||
1040 | * Use 24-bit allocation length for TYPE_TAPE. | ||
1041 | */ | ||
1042 | if (dev->transport->get_device_type(dev) == TYPE_TAPE) | ||
1043 | return (u32)(cdb[2] << 16) + (cdb[3] << 8) + cdb[4]; | ||
1044 | |||
1045 | /* | ||
1046 | * Everything else assume TYPE_DISK Sector CDB location. | ||
1047 | * Use 8-bit sector value. SBC-3 says: | ||
1048 | * | ||
1049 | * A TRANSFER LENGTH field set to zero specifies that 256 | ||
1050 | * logical blocks shall be written. Any other value | ||
1051 | * specifies the number of logical blocks that shall be | ||
1052 | * written. | ||
1053 | */ | ||
1054 | type_disk: | ||
1055 | return cdb[4] ? : 256; | ||
1056 | } | ||
1057 | |||
1058 | static inline u32 pscsi_get_sectors_10( | ||
1059 | unsigned char *cdb, | ||
1060 | struct se_cmd *cmd, | ||
1061 | int *ret) | ||
1062 | { | ||
1063 | struct se_device *dev = cmd->se_dev; | ||
1064 | |||
1065 | /* | ||
1066 | * Assume TYPE_DISK for non struct se_device objects. | ||
1067 | * Use 16-bit sector value. | ||
1068 | */ | ||
1069 | if (!dev) | ||
1070 | goto type_disk; | ||
1071 | |||
1072 | /* | ||
1073 | * XXX_10 is not defined in SSC, throw an exception | ||
1074 | */ | ||
1075 | if (dev->transport->get_device_type(dev) == TYPE_TAPE) { | ||
1076 | *ret = -EINVAL; | ||
1077 | return 0; | ||
1078 | } | ||
1079 | |||
1080 | /* | ||
1081 | * Everything else assume TYPE_DISK Sector CDB location. | ||
1082 | * Use 16-bit sector value. | ||
1083 | */ | ||
1084 | type_disk: | ||
1085 | return (u32)(cdb[7] << 8) + cdb[8]; | ||
1086 | } | ||
1087 | |||
1088 | static inline u32 pscsi_get_sectors_12( | ||
1089 | unsigned char *cdb, | ||
1090 | struct se_cmd *cmd, | ||
1091 | int *ret) | ||
1092 | { | ||
1093 | struct se_device *dev = cmd->se_dev; | ||
1094 | |||
1095 | /* | ||
1096 | * Assume TYPE_DISK for non struct se_device objects. | ||
1097 | * Use 32-bit sector value. | ||
1098 | */ | ||
1099 | if (!dev) | ||
1100 | goto type_disk; | ||
1101 | 1030 | ||
1102 | /* | 1031 | if (cmd->se_cmd_flags & SCF_BIDI) { |
1103 | * XXX_12 is not defined in SSC, throw an exception | 1032 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; |
1104 | */ | 1033 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; |
1105 | if (dev->transport->get_device_type(dev) == TYPE_TAPE) { | 1034 | return -EINVAL; |
1106 | *ret = -EINVAL; | ||
1107 | return 0; | ||
1108 | } | 1035 | } |
1109 | 1036 | ||
1110 | /* | 1037 | /* |
1111 | * Everything else assume TYPE_DISK Sector CDB location. | 1038 | * For REPORT LUNS we always need to emulate the respone, and for everything |
1112 | * Use 32-bit sector value. | 1039 | * related to persistent reservations and ALUA we might optionally use our |
1040 | * handlers before passing on the command to the physical hardware. | ||
1113 | */ | 1041 | */ |
1114 | type_disk: | ||
1115 | return (u32)(cdb[6] << 24) + (cdb[7] << 16) + (cdb[8] << 8) + cdb[9]; | ||
1116 | } | ||
1117 | |||
1118 | static inline u32 pscsi_get_sectors_16( | ||
1119 | unsigned char *cdb, | ||
1120 | struct se_cmd *cmd, | ||
1121 | int *ret) | ||
1122 | { | ||
1123 | struct se_device *dev = cmd->se_dev; | ||
1124 | |||
1125 | /* | ||
1126 | * Assume TYPE_DISK for non struct se_device objects. | ||
1127 | * Use 32-bit sector value. | ||
1128 | */ | ||
1129 | if (!dev) | ||
1130 | goto type_disk; | ||
1131 | |||
1132 | /* | ||
1133 | * Use 24-bit allocation length for TYPE_TAPE. | ||
1134 | */ | ||
1135 | if (dev->transport->get_device_type(dev) == TYPE_TAPE) | ||
1136 | return (u32)(cdb[12] << 16) + (cdb[13] << 8) + cdb[14]; | ||
1137 | |||
1138 | type_disk: | ||
1139 | return (u32)(cdb[10] << 24) + (cdb[11] << 16) + | ||
1140 | (cdb[12] << 8) + cdb[13]; | ||
1141 | } | ||
1142 | |||
1143 | /* | ||
1144 | * Used for VARIABLE_LENGTH_CDB WRITE_32 and READ_32 variants | ||
1145 | */ | ||
1146 | static inline u32 pscsi_get_sectors_32( | ||
1147 | unsigned char *cdb, | ||
1148 | struct se_cmd *cmd, | ||
1149 | int *ret) | ||
1150 | { | ||
1151 | /* | ||
1152 | * Assume TYPE_DISK for non struct se_device objects. | ||
1153 | * Use 32-bit sector value. | ||
1154 | */ | ||
1155 | return (u32)(cdb[28] << 24) + (cdb[29] << 16) + | ||
1156 | (cdb[30] << 8) + cdb[31]; | ||
1157 | |||
1158 | } | ||
1159 | |||
1160 | static inline u32 pscsi_get_lba_21(unsigned char *cdb) | ||
1161 | { | ||
1162 | return ((cdb[1] & 0x1f) << 16) | (cdb[2] << 8) | cdb[3]; | ||
1163 | } | ||
1164 | |||
1165 | static inline u32 pscsi_get_lba_32(unsigned char *cdb) | ||
1166 | { | ||
1167 | return (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; | ||
1168 | } | ||
1169 | |||
1170 | static inline unsigned long long pscsi_get_lba_64(unsigned char *cdb) | ||
1171 | { | ||
1172 | unsigned int __v1, __v2; | ||
1173 | |||
1174 | __v1 = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; | ||
1175 | __v2 = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9]; | ||
1176 | |||
1177 | return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32; | ||
1178 | } | ||
1179 | |||
1180 | /* | ||
1181 | * For VARIABLE_LENGTH_CDB w/ 32 byte extended CDBs | ||
1182 | */ | ||
1183 | static inline unsigned long long pscsi_get_lba_64_ext(unsigned char *cdb) | ||
1184 | { | ||
1185 | unsigned int __v1, __v2; | ||
1186 | |||
1187 | __v1 = (cdb[12] << 24) | (cdb[13] << 16) | (cdb[14] << 8) | cdb[15]; | ||
1188 | __v2 = (cdb[16] << 24) | (cdb[17] << 16) | (cdb[18] << 8) | cdb[19]; | ||
1189 | |||
1190 | return ((unsigned long long)__v2) | (unsigned long long)__v1 << 32; | ||
1191 | } | ||
1192 | |||
1193 | |||
1194 | static inline u32 pscsi_get_size( | ||
1195 | u32 sectors, | ||
1196 | unsigned char *cdb, | ||
1197 | struct se_cmd *cmd) | ||
1198 | { | ||
1199 | struct se_device *dev = cmd->se_dev; | ||
1200 | |||
1201 | if (dev->transport->get_device_type(dev) == TYPE_TAPE) { | ||
1202 | if (cdb[1] & 1) { /* sectors */ | ||
1203 | return dev->se_sub_dev->se_dev_attrib.block_size * sectors; | ||
1204 | } else /* bytes */ | ||
1205 | return sectors; | ||
1206 | } | ||
1207 | |||
1208 | pr_debug("Returning block_size: %u, sectors: %u == %u for" | ||
1209 | " %s object\n", dev->se_sub_dev->se_dev_attrib.block_size, | ||
1210 | sectors, dev->se_sub_dev->se_dev_attrib.block_size * sectors, | ||
1211 | dev->transport->name); | ||
1212 | |||
1213 | return dev->se_sub_dev->se_dev_attrib.block_size * sectors; | ||
1214 | } | ||
1215 | |||
1216 | static int pscsi_parse_cdb(struct se_cmd *cmd, unsigned int *size) | ||
1217 | { | ||
1218 | struct se_device *dev = cmd->se_dev; | ||
1219 | struct se_subsystem_dev *su_dev = dev->se_sub_dev; | ||
1220 | unsigned char *cdb = cmd->t_task_cdb; | ||
1221 | int sector_ret = 0; | ||
1222 | u32 sectors = 0; | ||
1223 | u16 service_action; | ||
1224 | int ret; | ||
1225 | |||
1226 | if (cmd->se_cmd_flags & SCF_BIDI) | ||
1227 | goto out_unsupported_cdb; | ||
1228 | |||
1229 | switch (cdb[0]) { | 1042 | switch (cdb[0]) { |
1230 | case READ_6: | 1043 | case REPORT_LUNS: |
1231 | sectors = pscsi_get_sectors_6(cdb, cmd, §or_ret); | 1044 | case PERSISTENT_RESERVE_IN: |
1232 | if (sector_ret) | 1045 | case PERSISTENT_RESERVE_OUT: |
1233 | goto out_unsupported_cdb; | 1046 | case RELEASE: |
1234 | *size = pscsi_get_size(sectors, cdb, cmd); | 1047 | case RELEASE_10: |
1235 | cmd->t_task_lba = pscsi_get_lba_21(cdb); | 1048 | case RESERVE: |
1236 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | 1049 | case RESERVE_10: |
1050 | ret = spc_parse_cdb(cmd, &dummy_size); | ||
1051 | if (ret) | ||
1052 | return ret; | ||
1237 | break; | 1053 | break; |
1054 | case READ_6: | ||
1238 | case READ_10: | 1055 | case READ_10: |
1239 | sectors = pscsi_get_sectors_10(cdb, cmd, §or_ret); | ||
1240 | if (sector_ret) | ||
1241 | goto out_unsupported_cdb; | ||
1242 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1243 | cmd->t_task_lba = pscsi_get_lba_32(cdb); | ||
1244 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | ||
1245 | break; | ||
1246 | case READ_12: | 1056 | case READ_12: |
1247 | sectors = pscsi_get_sectors_12(cdb, cmd, §or_ret); | ||
1248 | if (sector_ret) | ||
1249 | goto out_unsupported_cdb; | ||
1250 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1251 | cmd->t_task_lba = pscsi_get_lba_32(cdb); | ||
1252 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | ||
1253 | break; | ||
1254 | case READ_16: | 1057 | case READ_16: |
1255 | sectors = pscsi_get_sectors_16(cdb, cmd, §or_ret); | ||
1256 | if (sector_ret) | ||
1257 | goto out_unsupported_cdb; | ||
1258 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1259 | cmd->t_task_lba = pscsi_get_lba_64(cdb); | ||
1260 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | ||
1261 | break; | ||
1262 | case WRITE_6: | 1058 | case WRITE_6: |
1263 | sectors = pscsi_get_sectors_6(cdb, cmd, §or_ret); | ||
1264 | if (sector_ret) | ||
1265 | goto out_unsupported_cdb; | ||
1266 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1267 | cmd->t_task_lba = pscsi_get_lba_21(cdb); | ||
1268 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | ||
1269 | break; | ||
1270 | case WRITE_10: | 1059 | case WRITE_10: |
1271 | case WRITE_VERIFY: | ||
1272 | sectors = pscsi_get_sectors_10(cdb, cmd, §or_ret); | ||
1273 | if (sector_ret) | ||
1274 | goto out_unsupported_cdb; | ||
1275 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1276 | cmd->t_task_lba = pscsi_get_lba_32(cdb); | ||
1277 | if (cdb[1] & 0x8) | ||
1278 | cmd->se_cmd_flags |= SCF_FUA; | ||
1279 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | ||
1280 | break; | ||
1281 | case WRITE_12: | 1060 | case WRITE_12: |
1282 | sectors = pscsi_get_sectors_12(cdb, cmd, §or_ret); | ||
1283 | if (sector_ret) | ||
1284 | goto out_unsupported_cdb; | ||
1285 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1286 | cmd->t_task_lba = pscsi_get_lba_32(cdb); | ||
1287 | if (cdb[1] & 0x8) | ||
1288 | cmd->se_cmd_flags |= SCF_FUA; | ||
1289 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | ||
1290 | break; | ||
1291 | case WRITE_16: | 1061 | case WRITE_16: |
1292 | sectors = pscsi_get_sectors_16(cdb, cmd, §or_ret); | 1062 | case WRITE_VERIFY: |
1293 | if (sector_ret) | ||
1294 | goto out_unsupported_cdb; | ||
1295 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1296 | cmd->t_task_lba = pscsi_get_lba_64(cdb); | ||
1297 | if (cdb[1] & 0x8) | ||
1298 | cmd->se_cmd_flags |= SCF_FUA; | ||
1299 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; | 1063 | cmd->se_cmd_flags |= SCF_SCSI_DATA_CDB; |
1300 | break; | 1064 | break; |
1301 | case VARIABLE_LENGTH_CMD: | ||
1302 | service_action = get_unaligned_be16(&cdb[8]); | ||
1303 | switch (service_action) { | ||
1304 | case WRITE_SAME_32: | ||
1305 | sectors = pscsi_get_sectors_32(cdb, cmd, §or_ret); | ||
1306 | if (sector_ret) | ||
1307 | goto out_unsupported_cdb; | ||
1308 | |||
1309 | if (!sectors) { | ||
1310 | pr_err("WSNZ=1, WRITE_SAME w/sectors=0 not" | ||
1311 | " supported\n"); | ||
1312 | goto out_invalid_cdb_field; | ||
1313 | } | ||
1314 | |||
1315 | *size = pscsi_get_size(1, cdb, cmd); | ||
1316 | cmd->t_task_lba = get_unaligned_be64(&cdb[12]); | ||
1317 | break; | ||
1318 | default: | ||
1319 | pr_err("VARIABLE_LENGTH_CMD service action" | ||
1320 | " 0x%04x not supported\n", service_action); | ||
1321 | goto out_unsupported_cdb; | ||
1322 | } | ||
1323 | break; | ||
1324 | case GPCMD_READ_BUFFER_CAPACITY: | ||
1325 | case GPCMD_SEND_OPC: | ||
1326 | *size = (cdb[7] << 8) + cdb[8]; | ||
1327 | break; | ||
1328 | case READ_BLOCK_LIMITS: | ||
1329 | *size = READ_BLOCK_LEN; | ||
1330 | break; | ||
1331 | case GPCMD_GET_CONFIGURATION: | ||
1332 | case GPCMD_READ_FORMAT_CAPACITIES: | ||
1333 | case GPCMD_READ_DISC_INFO: | ||
1334 | case GPCMD_READ_TRACK_RZONE_INFO: | ||
1335 | *size = (cdb[7] << 8) + cdb[8]; | ||
1336 | break; | ||
1337 | case GPCMD_MECHANISM_STATUS: | ||
1338 | case GPCMD_READ_DVD_STRUCTURE: | ||
1339 | *size = (cdb[8] << 8) + cdb[9]; | ||
1340 | break; | ||
1341 | case READ_POSITION: | ||
1342 | *size = READ_POSITION_LEN; | ||
1343 | break; | ||
1344 | case READ_BUFFER: | ||
1345 | *size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8]; | ||
1346 | break; | ||
1347 | case READ_CAPACITY: | ||
1348 | *size = READ_CAP_LEN; | ||
1349 | break; | ||
1350 | case READ_MEDIA_SERIAL_NUMBER: | ||
1351 | case SERVICE_ACTION_IN: | ||
1352 | case ACCESS_CONTROL_IN: | ||
1353 | case ACCESS_CONTROL_OUT: | ||
1354 | *size = (cdb[10] << 24) | (cdb[11] << 16) | | ||
1355 | (cdb[12] << 8) | cdb[13]; | ||
1356 | break; | ||
1357 | case READ_TOC: | ||
1358 | *size = cdb[8]; | ||
1359 | break; | ||
1360 | case READ_ELEMENT_STATUS: | ||
1361 | *size = 65536 * cdb[7] + 256 * cdb[8] + cdb[9]; | ||
1362 | break; | ||
1363 | case SYNCHRONIZE_CACHE: | ||
1364 | case SYNCHRONIZE_CACHE_16: | ||
1365 | /* | ||
1366 | * Extract LBA and range to be flushed for emulated SYNCHRONIZE_CACHE | ||
1367 | */ | ||
1368 | if (cdb[0] == SYNCHRONIZE_CACHE) { | ||
1369 | sectors = pscsi_get_sectors_10(cdb, cmd, §or_ret); | ||
1370 | cmd->t_task_lba = pscsi_get_lba_32(cdb); | ||
1371 | } else { | ||
1372 | sectors = pscsi_get_sectors_16(cdb, cmd, §or_ret); | ||
1373 | cmd->t_task_lba = pscsi_get_lba_64(cdb); | ||
1374 | } | ||
1375 | if (sector_ret) | ||
1376 | goto out_unsupported_cdb; | ||
1377 | |||
1378 | *size = pscsi_get_size(sectors, cdb, cmd); | ||
1379 | break; | ||
1380 | case UNMAP: | ||
1381 | *size = get_unaligned_be16(&cdb[7]); | ||
1382 | break; | ||
1383 | case WRITE_SAME_16: | ||
1384 | sectors = pscsi_get_sectors_16(cdb, cmd, §or_ret); | ||
1385 | if (sector_ret) | ||
1386 | goto out_unsupported_cdb; | ||
1387 | |||
1388 | if (!sectors) { | ||
1389 | pr_err("WSNZ=1, WRITE_SAME w/sectors=0 not supported\n"); | ||
1390 | goto out_invalid_cdb_field; | ||
1391 | } | ||
1392 | |||
1393 | *size = pscsi_get_size(1, cdb, cmd); | ||
1394 | cmd->t_task_lba = get_unaligned_be64(&cdb[2]); | ||
1395 | break; | ||
1396 | case WRITE_SAME: | ||
1397 | sectors = pscsi_get_sectors_10(cdb, cmd, §or_ret); | ||
1398 | if (sector_ret) | ||
1399 | goto out_unsupported_cdb; | ||
1400 | |||
1401 | if (!sectors) { | ||
1402 | pr_err("WSNZ=1, WRITE_SAME w/sectors=0 not supported\n"); | ||
1403 | goto out_invalid_cdb_field; | ||
1404 | } | ||
1405 | |||
1406 | *size = pscsi_get_size(1, cdb, cmd); | ||
1407 | cmd->t_task_lba = get_unaligned_be32(&cdb[2]); | ||
1408 | break; | ||
1409 | case ALLOW_MEDIUM_REMOVAL: | ||
1410 | case ERASE: | ||
1411 | case REZERO_UNIT: | ||
1412 | case SEEK_10: | ||
1413 | case SPACE: | ||
1414 | case START_STOP: | ||
1415 | case VERIFY: | ||
1416 | case WRITE_FILEMARKS: | ||
1417 | case GPCMD_CLOSE_TRACK: | ||
1418 | case INITIALIZE_ELEMENT_STATUS: | ||
1419 | case GPCMD_LOAD_UNLOAD: | ||
1420 | case GPCMD_SET_SPEED: | ||
1421 | case MOVE_MEDIUM: | ||
1422 | *size = 0; | ||
1423 | break; | ||
1424 | case GET_EVENT_STATUS_NOTIFICATION: | ||
1425 | *size = (cdb[7] << 8) | cdb[8]; | ||
1426 | break; | ||
1427 | case ATA_16: | ||
1428 | switch (cdb[2] & 0x3) { /* T_LENGTH */ | ||
1429 | case 0x0: | ||
1430 | sectors = 0; | ||
1431 | break; | ||
1432 | case 0x1: | ||
1433 | sectors = (((cdb[1] & 0x1) ? cdb[3] : 0) << 8) | cdb[4]; | ||
1434 | break; | ||
1435 | case 0x2: | ||
1436 | sectors = (((cdb[1] & 0x1) ? cdb[5] : 0) << 8) | cdb[6]; | ||
1437 | break; | ||
1438 | case 0x3: | ||
1439 | pr_err("T_LENGTH=0x3 not supported for ATA_16\n"); | ||
1440 | goto out_invalid_cdb_field; | ||
1441 | } | ||
1442 | |||
1443 | /* BYTE_BLOCK */ | ||
1444 | if (cdb[2] & 0x4) { | ||
1445 | /* BLOCK T_TYPE: 512 or sector */ | ||
1446 | *size = sectors * ((cdb[2] & 0x10) ? | ||
1447 | dev->se_sub_dev->se_dev_attrib.block_size : 512); | ||
1448 | } else { | ||
1449 | /* BYTE */ | ||
1450 | *size = sectors; | ||
1451 | } | ||
1452 | break; | ||
1453 | default: | 1065 | default: |
1454 | ret = spc_parse_cdb(cmd, size, true); | 1066 | break; |
1455 | if (ret) | ||
1456 | return ret; | ||
1457 | } | ||
1458 | |||
1459 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { | ||
1460 | if (sectors > su_dev->se_dev_attrib.fabric_max_sectors) { | ||
1461 | printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" | ||
1462 | " big sectors %u exceeds fabric_max_sectors:" | ||
1463 | " %u\n", cdb[0], sectors, | ||
1464 | su_dev->se_dev_attrib.fabric_max_sectors); | ||
1465 | goto out_invalid_cdb_field; | ||
1466 | } | ||
1467 | if (sectors > su_dev->se_dev_attrib.hw_max_sectors) { | ||
1468 | printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" | ||
1469 | " big sectors %u exceeds backend hw_max_sectors:" | ||
1470 | " %u\n", cdb[0], sectors, | ||
1471 | su_dev->se_dev_attrib.hw_max_sectors); | ||
1472 | goto out_invalid_cdb_field; | ||
1473 | } | ||
1474 | } | 1067 | } |
1475 | 1068 | ||
1476 | return 0; | 1069 | return 0; |
1477 | |||
1478 | out_unsupported_cdb: | ||
1479 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; | ||
1480 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | ||
1481 | return -EINVAL; | ||
1482 | out_invalid_cdb_field: | ||
1483 | cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION; | ||
1484 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
1485 | return -EINVAL; | ||
1486 | } | 1070 | } |
1487 | 1071 | ||
1488 | |||
1489 | static int pscsi_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl, | 1072 | static int pscsi_execute_cmd(struct se_cmd *cmd, struct scatterlist *sgl, |
1490 | u32 sgl_nents, enum dma_data_direction data_direction) | 1073 | u32 sgl_nents, enum dma_data_direction data_direction) |
1491 | { | 1074 | { |
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 9d1ca3814876..a5bd0c0eba08 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
@@ -37,6 +37,192 @@ | |||
37 | #include "target_core_ua.h" | 37 | #include "target_core_ua.h" |
38 | 38 | ||
39 | 39 | ||
40 | static int sbc_emulate_readcapacity(struct se_cmd *cmd) | ||
41 | { | ||
42 | struct se_device *dev = cmd->se_dev; | ||
43 | unsigned char *buf; | ||
44 | unsigned long long blocks_long = dev->transport->get_blocks(dev); | ||
45 | u32 blocks; | ||
46 | |||
47 | if (blocks_long >= 0x00000000ffffffff) | ||
48 | blocks = 0xffffffff; | ||
49 | else | ||
50 | blocks = (u32)blocks_long; | ||
51 | |||
52 | buf = transport_kmap_data_sg(cmd); | ||
53 | |||
54 | buf[0] = (blocks >> 24) & 0xff; | ||
55 | buf[1] = (blocks >> 16) & 0xff; | ||
56 | buf[2] = (blocks >> 8) & 0xff; | ||
57 | buf[3] = blocks & 0xff; | ||
58 | buf[4] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff; | ||
59 | buf[5] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff; | ||
60 | buf[6] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff; | ||
61 | buf[7] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff; | ||
62 | |||
63 | transport_kunmap_data_sg(cmd); | ||
64 | |||
65 | target_complete_cmd(cmd, GOOD); | ||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | static int sbc_emulate_readcapacity_16(struct se_cmd *cmd) | ||
70 | { | ||
71 | struct se_device *dev = cmd->se_dev; | ||
72 | unsigned char *buf; | ||
73 | unsigned long long blocks = dev->transport->get_blocks(dev); | ||
74 | |||
75 | buf = transport_kmap_data_sg(cmd); | ||
76 | |||
77 | buf[0] = (blocks >> 56) & 0xff; | ||
78 | buf[1] = (blocks >> 48) & 0xff; | ||
79 | buf[2] = (blocks >> 40) & 0xff; | ||
80 | buf[3] = (blocks >> 32) & 0xff; | ||
81 | buf[4] = (blocks >> 24) & 0xff; | ||
82 | buf[5] = (blocks >> 16) & 0xff; | ||
83 | buf[6] = (blocks >> 8) & 0xff; | ||
84 | buf[7] = blocks & 0xff; | ||
85 | buf[8] = (dev->se_sub_dev->se_dev_attrib.block_size >> 24) & 0xff; | ||
86 | buf[9] = (dev->se_sub_dev->se_dev_attrib.block_size >> 16) & 0xff; | ||
87 | buf[10] = (dev->se_sub_dev->se_dev_attrib.block_size >> 8) & 0xff; | ||
88 | buf[11] = dev->se_sub_dev->se_dev_attrib.block_size & 0xff; | ||
89 | /* | ||
90 | * Set Thin Provisioning Enable bit following sbc3r22 in section | ||
91 | * READ CAPACITY (16) byte 14 if emulate_tpu or emulate_tpws is enabled. | ||
92 | */ | ||
93 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) | ||
94 | buf[14] = 0x80; | ||
95 | |||
96 | transport_kunmap_data_sg(cmd); | ||
97 | |||
98 | target_complete_cmd(cmd, GOOD); | ||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | /* | ||
103 | * Used for TCM/IBLOCK and TCM/FILEIO for block/blk-lib.c level discard support. | ||
104 | * Note this is not used for TCM/pSCSI passthrough | ||
105 | */ | ||
106 | static int sbc_emulate_unmap(struct se_cmd *cmd) | ||
107 | { | ||
108 | struct se_device *dev = cmd->se_dev; | ||
109 | unsigned char *buf, *ptr = NULL; | ||
110 | unsigned char *cdb = &cmd->t_task_cdb[0]; | ||
111 | sector_t lba; | ||
112 | unsigned int size = cmd->data_length, range; | ||
113 | int ret = 0, offset; | ||
114 | unsigned short dl, bd_dl; | ||
115 | |||
116 | if (!dev->transport->do_discard) { | ||
117 | pr_err("UNMAP emulation not supported for: %s\n", | ||
118 | dev->transport->name); | ||
119 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | ||
120 | return -ENOSYS; | ||
121 | } | ||
122 | |||
123 | /* First UNMAP block descriptor starts at 8 byte offset */ | ||
124 | offset = 8; | ||
125 | size -= 8; | ||
126 | dl = get_unaligned_be16(&cdb[0]); | ||
127 | bd_dl = get_unaligned_be16(&cdb[2]); | ||
128 | |||
129 | buf = transport_kmap_data_sg(cmd); | ||
130 | |||
131 | ptr = &buf[offset]; | ||
132 | pr_debug("UNMAP: Sub: %s Using dl: %hu bd_dl: %hu size: %hu" | ||
133 | " ptr: %p\n", dev->transport->name, dl, bd_dl, size, ptr); | ||
134 | |||
135 | while (size) { | ||
136 | lba = get_unaligned_be64(&ptr[0]); | ||
137 | range = get_unaligned_be32(&ptr[8]); | ||
138 | pr_debug("UNMAP: Using lba: %llu and range: %u\n", | ||
139 | (unsigned long long)lba, range); | ||
140 | |||
141 | ret = dev->transport->do_discard(dev, lba, range); | ||
142 | if (ret < 0) { | ||
143 | pr_err("blkdev_issue_discard() failed: %d\n", | ||
144 | ret); | ||
145 | goto err; | ||
146 | } | ||
147 | |||
148 | ptr += 16; | ||
149 | size -= 16; | ||
150 | } | ||
151 | |||
152 | err: | ||
153 | transport_kunmap_data_sg(cmd); | ||
154 | if (!ret) | ||
155 | target_complete_cmd(cmd, GOOD); | ||
156 | return ret; | ||
157 | } | ||
158 | |||
159 | /* | ||
160 | * Used for TCM/IBLOCK and TCM/FILEIO for block/blk-lib.c level discard support. | ||
161 | * Note this is not used for TCM/pSCSI passthrough | ||
162 | */ | ||
163 | static int sbc_emulate_write_same(struct se_cmd *cmd) | ||
164 | { | ||
165 | struct se_device *dev = cmd->se_dev; | ||
166 | sector_t range; | ||
167 | sector_t lba = cmd->t_task_lba; | ||
168 | u32 num_blocks; | ||
169 | int ret; | ||
170 | |||
171 | if (!dev->transport->do_discard) { | ||
172 | pr_err("WRITE_SAME emulation not supported" | ||
173 | " for: %s\n", dev->transport->name); | ||
174 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | ||
175 | return -ENOSYS; | ||
176 | } | ||
177 | |||
178 | if (cmd->t_task_cdb[0] == WRITE_SAME) | ||
179 | num_blocks = get_unaligned_be16(&cmd->t_task_cdb[7]); | ||
180 | else if (cmd->t_task_cdb[0] == WRITE_SAME_16) | ||
181 | num_blocks = get_unaligned_be32(&cmd->t_task_cdb[10]); | ||
182 | else /* WRITE_SAME_32 via VARIABLE_LENGTH_CMD */ | ||
183 | num_blocks = get_unaligned_be32(&cmd->t_task_cdb[28]); | ||
184 | |||
185 | /* | ||
186 | * Use the explicit range when non zero is supplied, otherwise calculate | ||
187 | * the remaining range based on ->get_blocks() - starting LBA. | ||
188 | */ | ||
189 | if (num_blocks != 0) | ||
190 | range = num_blocks; | ||
191 | else | ||
192 | range = (dev->transport->get_blocks(dev) - lba) + 1; | ||
193 | |||
194 | pr_debug("WRITE_SAME UNMAP: LBA: %llu Range: %llu\n", | ||
195 | (unsigned long long)lba, (unsigned long long)range); | ||
196 | |||
197 | ret = dev->transport->do_discard(dev, lba, range); | ||
198 | if (ret < 0) { | ||
199 | pr_debug("blkdev_issue_discard() failed for WRITE_SAME\n"); | ||
200 | return ret; | ||
201 | } | ||
202 | |||
203 | target_complete_cmd(cmd, GOOD); | ||
204 | return 0; | ||
205 | } | ||
206 | |||
207 | static int sbc_emulate_synchronize_cache(struct se_cmd *cmd) | ||
208 | { | ||
209 | if (!cmd->se_dev->transport->do_sync_cache) { | ||
210 | pr_err("SYNCHRONIZE_CACHE emulation not supported" | ||
211 | " for: %s\n", cmd->se_dev->transport->name); | ||
212 | cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE; | ||
213 | return -ENOSYS; | ||
214 | } | ||
215 | |||
216 | cmd->se_dev->transport->do_sync_cache(cmd); | ||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static int sbc_emulate_verify(struct se_cmd *cmd) | ||
221 | { | ||
222 | target_complete_cmd(cmd, GOOD); | ||
223 | return 0; | ||
224 | } | ||
225 | |||
40 | static inline u32 sbc_get_size(struct se_cmd *cmd, u32 sectors) | 226 | static inline u32 sbc_get_size(struct se_cmd *cmd, u32 sectors) |
41 | { | 227 | { |
42 | return cmd->se_dev->se_sub_dev->se_dev_attrib.block_size * sectors; | 228 | return cmd->se_dev->se_sub_dev->se_dev_attrib.block_size * sectors; |
@@ -209,11 +395,12 @@ out: | |||
209 | kfree(buf); | 395 | kfree(buf); |
210 | } | 396 | } |
211 | 397 | ||
212 | int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | 398 | int sbc_parse_cdb(struct se_cmd *cmd) |
213 | { | 399 | { |
214 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; | 400 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; |
215 | struct se_device *dev = cmd->se_dev; | 401 | struct se_device *dev = cmd->se_dev; |
216 | unsigned char *cdb = cmd->t_task_cdb; | 402 | unsigned char *cdb = cmd->t_task_cdb; |
403 | unsigned int size; | ||
217 | u32 sectors = 0; | 404 | u32 sectors = 0; |
218 | int ret; | 405 | int ret; |
219 | 406 | ||
@@ -311,12 +498,12 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
311 | goto out_invalid_cdb_field; | 498 | goto out_invalid_cdb_field; |
312 | } | 499 | } |
313 | 500 | ||
314 | *size = sbc_get_size(cmd, 1); | 501 | size = sbc_get_size(cmd, 1); |
315 | cmd->t_task_lba = get_unaligned_be64(&cdb[12]); | 502 | cmd->t_task_lba = get_unaligned_be64(&cdb[12]); |
316 | 503 | ||
317 | if (sbc_write_same_supported(dev, &cdb[10]) < 0) | 504 | if (sbc_write_same_supported(dev, &cdb[10]) < 0) |
318 | goto out_unsupported_cdb; | 505 | goto out_unsupported_cdb; |
319 | cmd->execute_cmd = target_emulate_write_same; | 506 | cmd->execute_cmd = sbc_emulate_write_same; |
320 | break; | 507 | break; |
321 | default: | 508 | default: |
322 | pr_err("VARIABLE_LENGTH_CMD service action" | 509 | pr_err("VARIABLE_LENGTH_CMD service action" |
@@ -326,20 +513,20 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
326 | break; | 513 | break; |
327 | } | 514 | } |
328 | case READ_CAPACITY: | 515 | case READ_CAPACITY: |
329 | *size = READ_CAP_LEN; | 516 | size = READ_CAP_LEN; |
330 | cmd->execute_cmd = target_emulate_readcapacity; | 517 | cmd->execute_cmd = sbc_emulate_readcapacity; |
331 | break; | 518 | break; |
332 | case SERVICE_ACTION_IN: | 519 | case SERVICE_ACTION_IN: |
333 | switch (cmd->t_task_cdb[1] & 0x1f) { | 520 | switch (cmd->t_task_cdb[1] & 0x1f) { |
334 | case SAI_READ_CAPACITY_16: | 521 | case SAI_READ_CAPACITY_16: |
335 | cmd->execute_cmd = target_emulate_readcapacity_16; | 522 | cmd->execute_cmd = sbc_emulate_readcapacity_16; |
336 | break; | 523 | break; |
337 | default: | 524 | default: |
338 | pr_err("Unsupported SA: 0x%02x\n", | 525 | pr_err("Unsupported SA: 0x%02x\n", |
339 | cmd->t_task_cdb[1] & 0x1f); | 526 | cmd->t_task_cdb[1] & 0x1f); |
340 | goto out_invalid_cdb_field; | 527 | goto out_invalid_cdb_field; |
341 | } | 528 | } |
342 | *size = (cdb[10] << 24) | (cdb[11] << 16) | | 529 | size = (cdb[10] << 24) | (cdb[11] << 16) | |
343 | (cdb[12] << 8) | cdb[13]; | 530 | (cdb[12] << 8) | cdb[13]; |
344 | break; | 531 | break; |
345 | case SYNCHRONIZE_CACHE: | 532 | case SYNCHRONIZE_CACHE: |
@@ -355,7 +542,7 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
355 | cmd->t_task_lba = transport_lba_64(cdb); | 542 | cmd->t_task_lba = transport_lba_64(cdb); |
356 | } | 543 | } |
357 | 544 | ||
358 | *size = sbc_get_size(cmd, sectors); | 545 | size = sbc_get_size(cmd, sectors); |
359 | 546 | ||
360 | /* | 547 | /* |
361 | * Check to ensure that LBA + Range does not exceed past end of | 548 | * Check to ensure that LBA + Range does not exceed past end of |
@@ -365,11 +552,11 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
365 | if (sbc_check_valid_sectors(cmd) < 0) | 552 | if (sbc_check_valid_sectors(cmd) < 0) |
366 | goto out_invalid_cdb_field; | 553 | goto out_invalid_cdb_field; |
367 | } | 554 | } |
368 | cmd->execute_cmd = target_emulate_synchronize_cache; | 555 | cmd->execute_cmd = sbc_emulate_synchronize_cache; |
369 | break; | 556 | break; |
370 | case UNMAP: | 557 | case UNMAP: |
371 | *size = get_unaligned_be16(&cdb[7]); | 558 | size = get_unaligned_be16(&cdb[7]); |
372 | cmd->execute_cmd = target_emulate_unmap; | 559 | cmd->execute_cmd = sbc_emulate_unmap; |
373 | break; | 560 | break; |
374 | case WRITE_SAME_16: | 561 | case WRITE_SAME_16: |
375 | sectors = transport_get_sectors_16(cdb); | 562 | sectors = transport_get_sectors_16(cdb); |
@@ -378,12 +565,12 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
378 | goto out_invalid_cdb_field; | 565 | goto out_invalid_cdb_field; |
379 | } | 566 | } |
380 | 567 | ||
381 | *size = sbc_get_size(cmd, 1); | 568 | size = sbc_get_size(cmd, 1); |
382 | cmd->t_task_lba = get_unaligned_be64(&cdb[2]); | 569 | cmd->t_task_lba = get_unaligned_be64(&cdb[2]); |
383 | 570 | ||
384 | if (sbc_write_same_supported(dev, &cdb[1]) < 0) | 571 | if (sbc_write_same_supported(dev, &cdb[1]) < 0) |
385 | goto out_unsupported_cdb; | 572 | goto out_unsupported_cdb; |
386 | cmd->execute_cmd = target_emulate_write_same; | 573 | cmd->execute_cmd = sbc_emulate_write_same; |
387 | break; | 574 | break; |
388 | case WRITE_SAME: | 575 | case WRITE_SAME: |
389 | sectors = transport_get_sectors_10(cdb); | 576 | sectors = transport_get_sectors_10(cdb); |
@@ -392,7 +579,7 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
392 | goto out_invalid_cdb_field; | 579 | goto out_invalid_cdb_field; |
393 | } | 580 | } |
394 | 581 | ||
395 | *size = sbc_get_size(cmd, 1); | 582 | size = sbc_get_size(cmd, 1); |
396 | cmd->t_task_lba = get_unaligned_be32(&cdb[2]); | 583 | cmd->t_task_lba = get_unaligned_be32(&cdb[2]); |
397 | 584 | ||
398 | /* | 585 | /* |
@@ -401,14 +588,14 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
401 | */ | 588 | */ |
402 | if (sbc_write_same_supported(dev, &cdb[1]) < 0) | 589 | if (sbc_write_same_supported(dev, &cdb[1]) < 0) |
403 | goto out_unsupported_cdb; | 590 | goto out_unsupported_cdb; |
404 | cmd->execute_cmd = target_emulate_write_same; | 591 | cmd->execute_cmd = sbc_emulate_write_same; |
405 | break; | 592 | break; |
406 | case VERIFY: | 593 | case VERIFY: |
407 | *size = 0; | 594 | size = 0; |
408 | cmd->execute_cmd = target_emulate_noop; | 595 | cmd->execute_cmd = sbc_emulate_verify; |
409 | break; | 596 | break; |
410 | default: | 597 | default: |
411 | ret = spc_parse_cdb(cmd, size, false); | 598 | ret = spc_parse_cdb(cmd, &size); |
412 | if (ret) | 599 | if (ret) |
413 | return ret; | 600 | return ret; |
414 | } | 601 | } |
@@ -418,6 +605,8 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
418 | goto out_unsupported_cdb; | 605 | goto out_unsupported_cdb; |
419 | 606 | ||
420 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { | 607 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { |
608 | unsigned long long end_lba; | ||
609 | |||
421 | if (sectors > su_dev->se_dev_attrib.fabric_max_sectors) { | 610 | if (sectors > su_dev->se_dev_attrib.fabric_max_sectors) { |
422 | printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" | 611 | printk_ratelimited(KERN_ERR "SCSI OP %02xh with too" |
423 | " big sectors %u exceeds fabric_max_sectors:" | 612 | " big sectors %u exceeds fabric_max_sectors:" |
@@ -433,9 +622,21 @@ int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | |||
433 | goto out_invalid_cdb_field; | 622 | goto out_invalid_cdb_field; |
434 | } | 623 | } |
435 | 624 | ||
436 | *size = sbc_get_size(cmd, sectors); | 625 | end_lba = dev->transport->get_blocks(dev) + 1; |
626 | if (cmd->t_task_lba + sectors > end_lba) { | ||
627 | pr_err("cmd exceeds last lba %llu " | ||
628 | "(lba %llu, sectors %u)\n", | ||
629 | end_lba, cmd->t_task_lba, sectors); | ||
630 | goto out_invalid_cdb_field; | ||
631 | } | ||
632 | |||
633 | size = sbc_get_size(cmd, sectors); | ||
437 | } | 634 | } |
438 | 635 | ||
636 | ret = target_cmd_size_check(cmd, size); | ||
637 | if (ret < 0) | ||
638 | return ret; | ||
639 | |||
439 | return 0; | 640 | return 0; |
440 | 641 | ||
441 | out_unsupported_cdb: | 642 | out_unsupported_cdb: |
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 156291fbf6d8..96dcb57089f7 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c | |||
@@ -39,7 +39,906 @@ | |||
39 | #include "target_core_ua.h" | 39 | #include "target_core_ua.h" |
40 | 40 | ||
41 | 41 | ||
42 | int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough) | 42 | static void spc_fill_alua_data(struct se_port *port, unsigned char *buf) |
43 | { | ||
44 | struct t10_alua_tg_pt_gp *tg_pt_gp; | ||
45 | struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; | ||
46 | |||
47 | /* | ||
48 | * Set SCCS for MAINTENANCE_IN + REPORT_TARGET_PORT_GROUPS. | ||
49 | */ | ||
50 | buf[5] = 0x80; | ||
51 | |||
52 | /* | ||
53 | * Set TPGS field for explict and/or implict ALUA access type | ||
54 | * and opteration. | ||
55 | * | ||
56 | * See spc4r17 section 6.4.2 Table 135 | ||
57 | */ | ||
58 | if (!port) | ||
59 | return; | ||
60 | tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem; | ||
61 | if (!tg_pt_gp_mem) | ||
62 | return; | ||
63 | |||
64 | spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
65 | tg_pt_gp = tg_pt_gp_mem->tg_pt_gp; | ||
66 | if (tg_pt_gp) | ||
67 | buf[5] |= tg_pt_gp->tg_pt_gp_alua_access_type; | ||
68 | spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
69 | } | ||
70 | |||
71 | static int spc_emulate_inquiry_std(struct se_cmd *cmd, char *buf) | ||
72 | { | ||
73 | struct se_lun *lun = cmd->se_lun; | ||
74 | struct se_device *dev = cmd->se_dev; | ||
75 | |||
76 | /* Set RMB (removable media) for tape devices */ | ||
77 | if (dev->transport->get_device_type(dev) == TYPE_TAPE) | ||
78 | buf[1] = 0x80; | ||
79 | |||
80 | buf[2] = dev->transport->get_device_rev(dev); | ||
81 | |||
82 | /* | ||
83 | * NORMACA and HISUP = 0, RESPONSE DATA FORMAT = 2 | ||
84 | * | ||
85 | * SPC4 says: | ||
86 | * A RESPONSE DATA FORMAT field set to 2h indicates that the | ||
87 | * standard INQUIRY data is in the format defined in this | ||
88 | * standard. Response data format values less than 2h are | ||
89 | * obsolete. Response data format values greater than 2h are | ||
90 | * reserved. | ||
91 | */ | ||
92 | buf[3] = 2; | ||
93 | |||
94 | /* | ||
95 | * Enable SCCS and TPGS fields for Emulated ALUA | ||
96 | */ | ||
97 | if (dev->se_sub_dev->t10_alua.alua_type == SPC3_ALUA_EMULATED) | ||
98 | spc_fill_alua_data(lun->lun_sep, buf); | ||
99 | |||
100 | buf[7] = 0x2; /* CmdQue=1 */ | ||
101 | |||
102 | snprintf(&buf[8], 8, "LIO-ORG"); | ||
103 | snprintf(&buf[16], 16, "%s", dev->se_sub_dev->t10_wwn.model); | ||
104 | snprintf(&buf[32], 4, "%s", dev->se_sub_dev->t10_wwn.revision); | ||
105 | buf[4] = 31; /* Set additional length to 31 */ | ||
106 | |||
107 | return 0; | ||
108 | } | ||
109 | |||
110 | /* unit serial number */ | ||
111 | static int spc_emulate_evpd_80(struct se_cmd *cmd, unsigned char *buf) | ||
112 | { | ||
113 | struct se_device *dev = cmd->se_dev; | ||
114 | u16 len = 0; | ||
115 | |||
116 | if (dev->se_sub_dev->su_dev_flags & | ||
117 | SDF_EMULATED_VPD_UNIT_SERIAL) { | ||
118 | u32 unit_serial_len; | ||
119 | |||
120 | unit_serial_len = strlen(dev->se_sub_dev->t10_wwn.unit_serial); | ||
121 | unit_serial_len++; /* For NULL Terminator */ | ||
122 | |||
123 | len += sprintf(&buf[4], "%s", | ||
124 | dev->se_sub_dev->t10_wwn.unit_serial); | ||
125 | len++; /* Extra Byte for NULL Terminator */ | ||
126 | buf[3] = len; | ||
127 | } | ||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static void spc_parse_naa_6h_vendor_specific(struct se_device *dev, | ||
132 | unsigned char *buf) | ||
133 | { | ||
134 | unsigned char *p = &dev->se_sub_dev->t10_wwn.unit_serial[0]; | ||
135 | int cnt; | ||
136 | bool next = true; | ||
137 | |||
138 | /* | ||
139 | * Generate up to 36 bits of VENDOR SPECIFIC IDENTIFIER starting on | ||
140 | * byte 3 bit 3-0 for NAA IEEE Registered Extended DESIGNATOR field | ||
141 | * format, followed by 64 bits of VENDOR SPECIFIC IDENTIFIER EXTENSION | ||
142 | * to complete the payload. These are based from VPD=0x80 PRODUCT SERIAL | ||
143 | * NUMBER set via vpd_unit_serial in target_core_configfs.c to ensure | ||
144 | * per device uniqeness. | ||
145 | */ | ||
146 | for (cnt = 0; *p && cnt < 13; p++) { | ||
147 | int val = hex_to_bin(*p); | ||
148 | |||
149 | if (val < 0) | ||
150 | continue; | ||
151 | |||
152 | if (next) { | ||
153 | next = false; | ||
154 | buf[cnt++] |= val; | ||
155 | } else { | ||
156 | next = true; | ||
157 | buf[cnt] = val << 4; | ||
158 | } | ||
159 | } | ||
160 | } | ||
161 | |||
162 | /* | ||
163 | * Device identification VPD, for a complete list of | ||
164 | * DESIGNATOR TYPEs see spc4r17 Table 459. | ||
165 | */ | ||
166 | static int spc_emulate_evpd_83(struct se_cmd *cmd, unsigned char *buf) | ||
167 | { | ||
168 | struct se_device *dev = cmd->se_dev; | ||
169 | struct se_lun *lun = cmd->se_lun; | ||
170 | struct se_port *port = NULL; | ||
171 | struct se_portal_group *tpg = NULL; | ||
172 | struct t10_alua_lu_gp_member *lu_gp_mem; | ||
173 | struct t10_alua_tg_pt_gp *tg_pt_gp; | ||
174 | struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; | ||
175 | unsigned char *prod = &dev->se_sub_dev->t10_wwn.model[0]; | ||
176 | u32 prod_len; | ||
177 | u32 unit_serial_len, off = 0; | ||
178 | u16 len = 0, id_len; | ||
179 | |||
180 | off = 4; | ||
181 | |||
182 | /* | ||
183 | * NAA IEEE Registered Extended Assigned designator format, see | ||
184 | * spc4r17 section 7.7.3.6.5 | ||
185 | * | ||
186 | * We depend upon a target_core_mod/ConfigFS provided | ||
187 | * /sys/kernel/config/target/core/$HBA/$DEV/wwn/vpd_unit_serial | ||
188 | * value in order to return the NAA id. | ||
189 | */ | ||
190 | if (!(dev->se_sub_dev->su_dev_flags & SDF_EMULATED_VPD_UNIT_SERIAL)) | ||
191 | goto check_t10_vend_desc; | ||
192 | |||
193 | /* CODE SET == Binary */ | ||
194 | buf[off++] = 0x1; | ||
195 | |||
196 | /* Set ASSOCIATION == addressed logical unit: 0)b */ | ||
197 | buf[off] = 0x00; | ||
198 | |||
199 | /* Identifier/Designator type == NAA identifier */ | ||
200 | buf[off++] |= 0x3; | ||
201 | off++; | ||
202 | |||
203 | /* Identifier/Designator length */ | ||
204 | buf[off++] = 0x10; | ||
205 | |||
206 | /* | ||
207 | * Start NAA IEEE Registered Extended Identifier/Designator | ||
208 | */ | ||
209 | buf[off++] = (0x6 << 4); | ||
210 | |||
211 | /* | ||
212 | * Use OpenFabrics IEEE Company ID: 00 14 05 | ||
213 | */ | ||
214 | buf[off++] = 0x01; | ||
215 | buf[off++] = 0x40; | ||
216 | buf[off] = (0x5 << 4); | ||
217 | |||
218 | /* | ||
219 | * Return ConfigFS Unit Serial Number information for | ||
220 | * VENDOR_SPECIFIC_IDENTIFIER and | ||
221 | * VENDOR_SPECIFIC_IDENTIFIER_EXTENTION | ||
222 | */ | ||
223 | spc_parse_naa_6h_vendor_specific(dev, &buf[off]); | ||
224 | |||
225 | len = 20; | ||
226 | off = (len + 4); | ||
227 | |||
228 | check_t10_vend_desc: | ||
229 | /* | ||
230 | * T10 Vendor Identifier Page, see spc4r17 section 7.7.3.4 | ||
231 | */ | ||
232 | id_len = 8; /* For Vendor field */ | ||
233 | prod_len = 4; /* For VPD Header */ | ||
234 | prod_len += 8; /* For Vendor field */ | ||
235 | prod_len += strlen(prod); | ||
236 | prod_len++; /* For : */ | ||
237 | |||
238 | if (dev->se_sub_dev->su_dev_flags & | ||
239 | SDF_EMULATED_VPD_UNIT_SERIAL) { | ||
240 | unit_serial_len = | ||
241 | strlen(&dev->se_sub_dev->t10_wwn.unit_serial[0]); | ||
242 | unit_serial_len++; /* For NULL Terminator */ | ||
243 | |||
244 | id_len += sprintf(&buf[off+12], "%s:%s", prod, | ||
245 | &dev->se_sub_dev->t10_wwn.unit_serial[0]); | ||
246 | } | ||
247 | buf[off] = 0x2; /* ASCII */ | ||
248 | buf[off+1] = 0x1; /* T10 Vendor ID */ | ||
249 | buf[off+2] = 0x0; | ||
250 | memcpy(&buf[off+4], "LIO-ORG", 8); | ||
251 | /* Extra Byte for NULL Terminator */ | ||
252 | id_len++; | ||
253 | /* Identifier Length */ | ||
254 | buf[off+3] = id_len; | ||
255 | /* Header size for Designation descriptor */ | ||
256 | len += (id_len + 4); | ||
257 | off += (id_len + 4); | ||
258 | /* | ||
259 | * struct se_port is only set for INQUIRY VPD=1 through $FABRIC_MOD | ||
260 | */ | ||
261 | port = lun->lun_sep; | ||
262 | if (port) { | ||
263 | struct t10_alua_lu_gp *lu_gp; | ||
264 | u32 padding, scsi_name_len; | ||
265 | u16 lu_gp_id = 0; | ||
266 | u16 tg_pt_gp_id = 0; | ||
267 | u16 tpgt; | ||
268 | |||
269 | tpg = port->sep_tpg; | ||
270 | /* | ||
271 | * Relative target port identifer, see spc4r17 | ||
272 | * section 7.7.3.7 | ||
273 | * | ||
274 | * Get the PROTOCOL IDENTIFIER as defined by spc4r17 | ||
275 | * section 7.5.1 Table 362 | ||
276 | */ | ||
277 | buf[off] = | ||
278 | (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4); | ||
279 | buf[off++] |= 0x1; /* CODE SET == Binary */ | ||
280 | buf[off] = 0x80; /* Set PIV=1 */ | ||
281 | /* Set ASSOCIATION == target port: 01b */ | ||
282 | buf[off] |= 0x10; | ||
283 | /* DESIGNATOR TYPE == Relative target port identifer */ | ||
284 | buf[off++] |= 0x4; | ||
285 | off++; /* Skip over Reserved */ | ||
286 | buf[off++] = 4; /* DESIGNATOR LENGTH */ | ||
287 | /* Skip over Obsolete field in RTPI payload | ||
288 | * in Table 472 */ | ||
289 | off += 2; | ||
290 | buf[off++] = ((port->sep_rtpi >> 8) & 0xff); | ||
291 | buf[off++] = (port->sep_rtpi & 0xff); | ||
292 | len += 8; /* Header size + Designation descriptor */ | ||
293 | /* | ||
294 | * Target port group identifier, see spc4r17 | ||
295 | * section 7.7.3.8 | ||
296 | * | ||
297 | * Get the PROTOCOL IDENTIFIER as defined by spc4r17 | ||
298 | * section 7.5.1 Table 362 | ||
299 | */ | ||
300 | if (dev->se_sub_dev->t10_alua.alua_type != | ||
301 | SPC3_ALUA_EMULATED) | ||
302 | goto check_scsi_name; | ||
303 | |||
304 | tg_pt_gp_mem = port->sep_alua_tg_pt_gp_mem; | ||
305 | if (!tg_pt_gp_mem) | ||
306 | goto check_lu_gp; | ||
307 | |||
308 | spin_lock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
309 | tg_pt_gp = tg_pt_gp_mem->tg_pt_gp; | ||
310 | if (!tg_pt_gp) { | ||
311 | spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
312 | goto check_lu_gp; | ||
313 | } | ||
314 | tg_pt_gp_id = tg_pt_gp->tg_pt_gp_id; | ||
315 | spin_unlock(&tg_pt_gp_mem->tg_pt_gp_mem_lock); | ||
316 | |||
317 | buf[off] = | ||
318 | (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4); | ||
319 | buf[off++] |= 0x1; /* CODE SET == Binary */ | ||
320 | buf[off] = 0x80; /* Set PIV=1 */ | ||
321 | /* Set ASSOCIATION == target port: 01b */ | ||
322 | buf[off] |= 0x10; | ||
323 | /* DESIGNATOR TYPE == Target port group identifier */ | ||
324 | buf[off++] |= 0x5; | ||
325 | off++; /* Skip over Reserved */ | ||
326 | buf[off++] = 4; /* DESIGNATOR LENGTH */ | ||
327 | off += 2; /* Skip over Reserved Field */ | ||
328 | buf[off++] = ((tg_pt_gp_id >> 8) & 0xff); | ||
329 | buf[off++] = (tg_pt_gp_id & 0xff); | ||
330 | len += 8; /* Header size + Designation descriptor */ | ||
331 | /* | ||
332 | * Logical Unit Group identifier, see spc4r17 | ||
333 | * section 7.7.3.8 | ||
334 | */ | ||
335 | check_lu_gp: | ||
336 | lu_gp_mem = dev->dev_alua_lu_gp_mem; | ||
337 | if (!lu_gp_mem) | ||
338 | goto check_scsi_name; | ||
339 | |||
340 | spin_lock(&lu_gp_mem->lu_gp_mem_lock); | ||
341 | lu_gp = lu_gp_mem->lu_gp; | ||
342 | if (!lu_gp) { | ||
343 | spin_unlock(&lu_gp_mem->lu_gp_mem_lock); | ||
344 | goto check_scsi_name; | ||
345 | } | ||
346 | lu_gp_id = lu_gp->lu_gp_id; | ||
347 | spin_unlock(&lu_gp_mem->lu_gp_mem_lock); | ||
348 | |||
349 | buf[off++] |= 0x1; /* CODE SET == Binary */ | ||
350 | /* DESIGNATOR TYPE == Logical Unit Group identifier */ | ||
351 | buf[off++] |= 0x6; | ||
352 | off++; /* Skip over Reserved */ | ||
353 | buf[off++] = 4; /* DESIGNATOR LENGTH */ | ||
354 | off += 2; /* Skip over Reserved Field */ | ||
355 | buf[off++] = ((lu_gp_id >> 8) & 0xff); | ||
356 | buf[off++] = (lu_gp_id & 0xff); | ||
357 | len += 8; /* Header size + Designation descriptor */ | ||
358 | /* | ||
359 | * SCSI name string designator, see spc4r17 | ||
360 | * section 7.7.3.11 | ||
361 | * | ||
362 | * Get the PROTOCOL IDENTIFIER as defined by spc4r17 | ||
363 | * section 7.5.1 Table 362 | ||
364 | */ | ||
365 | check_scsi_name: | ||
366 | scsi_name_len = strlen(tpg->se_tpg_tfo->tpg_get_wwn(tpg)); | ||
367 | /* UTF-8 ",t,0x<16-bit TPGT>" + NULL Terminator */ | ||
368 | scsi_name_len += 10; | ||
369 | /* Check for 4-byte padding */ | ||
370 | padding = ((-scsi_name_len) & 3); | ||
371 | if (padding != 0) | ||
372 | scsi_name_len += padding; | ||
373 | /* Header size + Designation descriptor */ | ||
374 | scsi_name_len += 4; | ||
375 | |||
376 | buf[off] = | ||
377 | (tpg->se_tpg_tfo->get_fabric_proto_ident(tpg) << 4); | ||
378 | buf[off++] |= 0x3; /* CODE SET == UTF-8 */ | ||
379 | buf[off] = 0x80; /* Set PIV=1 */ | ||
380 | /* Set ASSOCIATION == target port: 01b */ | ||
381 | buf[off] |= 0x10; | ||
382 | /* DESIGNATOR TYPE == SCSI name string */ | ||
383 | buf[off++] |= 0x8; | ||
384 | off += 2; /* Skip over Reserved and length */ | ||
385 | /* | ||
386 | * SCSI name string identifer containing, $FABRIC_MOD | ||
387 | * dependent information. For LIO-Target and iSCSI | ||
388 | * Target Port, this means "<iSCSI name>,t,0x<TPGT> in | ||
389 | * UTF-8 encoding. | ||
390 | */ | ||
391 | tpgt = tpg->se_tpg_tfo->tpg_get_tag(tpg); | ||
392 | scsi_name_len = sprintf(&buf[off], "%s,t,0x%04x", | ||
393 | tpg->se_tpg_tfo->tpg_get_wwn(tpg), tpgt); | ||
394 | scsi_name_len += 1 /* Include NULL terminator */; | ||
395 | /* | ||
396 | * The null-terminated, null-padded (see 4.4.2) SCSI | ||
397 | * NAME STRING field contains a UTF-8 format string. | ||
398 | * The number of bytes in the SCSI NAME STRING field | ||
399 | * (i.e., the value in the DESIGNATOR LENGTH field) | ||
400 | * shall be no larger than 256 and shall be a multiple | ||
401 | * of four. | ||
402 | */ | ||
403 | if (padding) | ||
404 | scsi_name_len += padding; | ||
405 | |||
406 | buf[off-1] = scsi_name_len; | ||
407 | off += scsi_name_len; | ||
408 | /* Header size + Designation descriptor */ | ||
409 | len += (scsi_name_len + 4); | ||
410 | } | ||
411 | buf[2] = ((len >> 8) & 0xff); | ||
412 | buf[3] = (len & 0xff); /* Page Length for VPD 0x83 */ | ||
413 | return 0; | ||
414 | } | ||
415 | |||
416 | /* Extended INQUIRY Data VPD Page */ | ||
417 | static int spc_emulate_evpd_86(struct se_cmd *cmd, unsigned char *buf) | ||
418 | { | ||
419 | buf[3] = 0x3c; | ||
420 | /* Set HEADSUP, ORDSUP, SIMPSUP */ | ||
421 | buf[5] = 0x07; | ||
422 | |||
423 | /* If WriteCache emulation is enabled, set V_SUP */ | ||
424 | if (cmd->se_dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) | ||
425 | buf[6] = 0x01; | ||
426 | return 0; | ||
427 | } | ||
428 | |||
429 | /* Block Limits VPD page */ | ||
430 | static int spc_emulate_evpd_b0(struct se_cmd *cmd, unsigned char *buf) | ||
431 | { | ||
432 | struct se_device *dev = cmd->se_dev; | ||
433 | u32 max_sectors; | ||
434 | int have_tp = 0; | ||
435 | |||
436 | /* | ||
437 | * Following spc3r22 section 6.5.3 Block Limits VPD page, when | ||
438 | * emulate_tpu=1 or emulate_tpws=1 we will be expect a | ||
439 | * different page length for Thin Provisioning. | ||
440 | */ | ||
441 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu || dev->se_sub_dev->se_dev_attrib.emulate_tpws) | ||
442 | have_tp = 1; | ||
443 | |||
444 | buf[0] = dev->transport->get_device_type(dev); | ||
445 | buf[3] = have_tp ? 0x3c : 0x10; | ||
446 | |||
447 | /* Set WSNZ to 1 */ | ||
448 | buf[4] = 0x01; | ||
449 | |||
450 | /* | ||
451 | * Set OPTIMAL TRANSFER LENGTH GRANULARITY | ||
452 | */ | ||
453 | put_unaligned_be16(1, &buf[6]); | ||
454 | |||
455 | /* | ||
456 | * Set MAXIMUM TRANSFER LENGTH | ||
457 | */ | ||
458 | max_sectors = min(dev->se_sub_dev->se_dev_attrib.fabric_max_sectors, | ||
459 | dev->se_sub_dev->se_dev_attrib.hw_max_sectors); | ||
460 | put_unaligned_be32(max_sectors, &buf[8]); | ||
461 | |||
462 | /* | ||
463 | * Set OPTIMAL TRANSFER LENGTH | ||
464 | */ | ||
465 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.optimal_sectors, &buf[12]); | ||
466 | |||
467 | /* | ||
468 | * Exit now if we don't support TP. | ||
469 | */ | ||
470 | if (!have_tp) | ||
471 | return 0; | ||
472 | |||
473 | /* | ||
474 | * Set MAXIMUM UNMAP LBA COUNT | ||
475 | */ | ||
476 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_lba_count, &buf[20]); | ||
477 | |||
478 | /* | ||
479 | * Set MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT | ||
480 | */ | ||
481 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count, | ||
482 | &buf[24]); | ||
483 | |||
484 | /* | ||
485 | * Set OPTIMAL UNMAP GRANULARITY | ||
486 | */ | ||
487 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity, &buf[28]); | ||
488 | |||
489 | /* | ||
490 | * UNMAP GRANULARITY ALIGNMENT | ||
491 | */ | ||
492 | put_unaligned_be32(dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment, | ||
493 | &buf[32]); | ||
494 | if (dev->se_sub_dev->se_dev_attrib.unmap_granularity_alignment != 0) | ||
495 | buf[32] |= 0x80; /* Set the UGAVALID bit */ | ||
496 | |||
497 | return 0; | ||
498 | } | ||
499 | |||
500 | /* Block Device Characteristics VPD page */ | ||
501 | static int spc_emulate_evpd_b1(struct se_cmd *cmd, unsigned char *buf) | ||
502 | { | ||
503 | struct se_device *dev = cmd->se_dev; | ||
504 | |||
505 | buf[0] = dev->transport->get_device_type(dev); | ||
506 | buf[3] = 0x3c; | ||
507 | buf[5] = dev->se_sub_dev->se_dev_attrib.is_nonrot ? 1 : 0; | ||
508 | |||
509 | return 0; | ||
510 | } | ||
511 | |||
512 | /* Thin Provisioning VPD */ | ||
513 | static int spc_emulate_evpd_b2(struct se_cmd *cmd, unsigned char *buf) | ||
514 | { | ||
515 | struct se_device *dev = cmd->se_dev; | ||
516 | |||
517 | /* | ||
518 | * From spc3r22 section 6.5.4 Thin Provisioning VPD page: | ||
519 | * | ||
520 | * The PAGE LENGTH field is defined in SPC-4. If the DP bit is set to | ||
521 | * zero, then the page length shall be set to 0004h. If the DP bit | ||
522 | * is set to one, then the page length shall be set to the value | ||
523 | * defined in table 162. | ||
524 | */ | ||
525 | buf[0] = dev->transport->get_device_type(dev); | ||
526 | |||
527 | /* | ||
528 | * Set Hardcoded length mentioned above for DP=0 | ||
529 | */ | ||
530 | put_unaligned_be16(0x0004, &buf[2]); | ||
531 | |||
532 | /* | ||
533 | * The THRESHOLD EXPONENT field indicates the threshold set size in | ||
534 | * LBAs as a power of 2 (i.e., the threshold set size is equal to | ||
535 | * 2(threshold exponent)). | ||
536 | * | ||
537 | * Note that this is currently set to 0x00 as mkp says it will be | ||
538 | * changing again. We can enable this once it has settled in T10 | ||
539 | * and is actually used by Linux/SCSI ML code. | ||
540 | */ | ||
541 | buf[4] = 0x00; | ||
542 | |||
543 | /* | ||
544 | * A TPU bit set to one indicates that the device server supports | ||
545 | * the UNMAP command (see 5.25). A TPU bit set to zero indicates | ||
546 | * that the device server does not support the UNMAP command. | ||
547 | */ | ||
548 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpu != 0) | ||
549 | buf[5] = 0x80; | ||
550 | |||
551 | /* | ||
552 | * A TPWS bit set to one indicates that the device server supports | ||
553 | * the use of the WRITE SAME (16) command (see 5.42) to unmap LBAs. | ||
554 | * A TPWS bit set to zero indicates that the device server does not | ||
555 | * support the use of the WRITE SAME (16) command to unmap LBAs. | ||
556 | */ | ||
557 | if (dev->se_sub_dev->se_dev_attrib.emulate_tpws != 0) | ||
558 | buf[5] |= 0x40; | ||
559 | |||
560 | return 0; | ||
561 | } | ||
562 | |||
563 | static int spc_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf); | ||
564 | |||
565 | static struct { | ||
566 | uint8_t page; | ||
567 | int (*emulate)(struct se_cmd *, unsigned char *); | ||
568 | } evpd_handlers[] = { | ||
569 | { .page = 0x00, .emulate = spc_emulate_evpd_00 }, | ||
570 | { .page = 0x80, .emulate = spc_emulate_evpd_80 }, | ||
571 | { .page = 0x83, .emulate = spc_emulate_evpd_83 }, | ||
572 | { .page = 0x86, .emulate = spc_emulate_evpd_86 }, | ||
573 | { .page = 0xb0, .emulate = spc_emulate_evpd_b0 }, | ||
574 | { .page = 0xb1, .emulate = spc_emulate_evpd_b1 }, | ||
575 | { .page = 0xb2, .emulate = spc_emulate_evpd_b2 }, | ||
576 | }; | ||
577 | |||
578 | /* supported vital product data pages */ | ||
579 | static int spc_emulate_evpd_00(struct se_cmd *cmd, unsigned char *buf) | ||
580 | { | ||
581 | int p; | ||
582 | |||
583 | /* | ||
584 | * Only report the INQUIRY EVPD=1 pages after a valid NAA | ||
585 | * Registered Extended LUN WWN has been set via ConfigFS | ||
586 | * during device creation/restart. | ||
587 | */ | ||
588 | if (cmd->se_dev->se_sub_dev->su_dev_flags & | ||
589 | SDF_EMULATED_VPD_UNIT_SERIAL) { | ||
590 | buf[3] = ARRAY_SIZE(evpd_handlers); | ||
591 | for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) | ||
592 | buf[p + 4] = evpd_handlers[p].page; | ||
593 | } | ||
594 | |||
595 | return 0; | ||
596 | } | ||
597 | |||
598 | static int spc_emulate_inquiry(struct se_cmd *cmd) | ||
599 | { | ||
600 | struct se_device *dev = cmd->se_dev; | ||
601 | struct se_portal_group *tpg = cmd->se_lun->lun_sep->sep_tpg; | ||
602 | unsigned char *buf, *map_buf; | ||
603 | unsigned char *cdb = cmd->t_task_cdb; | ||
604 | int p, ret; | ||
605 | |||
606 | map_buf = transport_kmap_data_sg(cmd); | ||
607 | /* | ||
608 | * If SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is not set, then we | ||
609 | * know we actually allocated a full page. Otherwise, if the | ||
610 | * data buffer is too small, allocate a temporary buffer so we | ||
611 | * don't have to worry about overruns in all our INQUIRY | ||
612 | * emulation handling. | ||
613 | */ | ||
614 | if (cmd->data_length < SE_INQUIRY_BUF && | ||
615 | (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) { | ||
616 | buf = kzalloc(SE_INQUIRY_BUF, GFP_KERNEL); | ||
617 | if (!buf) { | ||
618 | transport_kunmap_data_sg(cmd); | ||
619 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
620 | return -ENOMEM; | ||
621 | } | ||
622 | } else { | ||
623 | buf = map_buf; | ||
624 | } | ||
625 | |||
626 | if (dev == tpg->tpg_virt_lun0.lun_se_dev) | ||
627 | buf[0] = 0x3f; /* Not connected */ | ||
628 | else | ||
629 | buf[0] = dev->transport->get_device_type(dev); | ||
630 | |||
631 | if (!(cdb[1] & 0x1)) { | ||
632 | if (cdb[2]) { | ||
633 | pr_err("INQUIRY with EVPD==0 but PAGE CODE=%02x\n", | ||
634 | cdb[2]); | ||
635 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
636 | ret = -EINVAL; | ||
637 | goto out; | ||
638 | } | ||
639 | |||
640 | ret = spc_emulate_inquiry_std(cmd, buf); | ||
641 | goto out; | ||
642 | } | ||
643 | |||
644 | for (p = 0; p < ARRAY_SIZE(evpd_handlers); ++p) { | ||
645 | if (cdb[2] == evpd_handlers[p].page) { | ||
646 | buf[1] = cdb[2]; | ||
647 | ret = evpd_handlers[p].emulate(cmd, buf); | ||
648 | goto out; | ||
649 | } | ||
650 | } | ||
651 | |||
652 | pr_err("Unknown VPD Code: 0x%02x\n", cdb[2]); | ||
653 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
654 | ret = -EINVAL; | ||
655 | |||
656 | out: | ||
657 | if (buf != map_buf) { | ||
658 | memcpy(map_buf, buf, cmd->data_length); | ||
659 | kfree(buf); | ||
660 | } | ||
661 | transport_kunmap_data_sg(cmd); | ||
662 | |||
663 | if (!ret) | ||
664 | target_complete_cmd(cmd, GOOD); | ||
665 | return ret; | ||
666 | } | ||
667 | |||
668 | static int spc_modesense_rwrecovery(unsigned char *p) | ||
669 | { | ||
670 | p[0] = 0x01; | ||
671 | p[1] = 0x0a; | ||
672 | |||
673 | return 12; | ||
674 | } | ||
675 | |||
676 | static int spc_modesense_control(struct se_device *dev, unsigned char *p) | ||
677 | { | ||
678 | p[0] = 0x0a; | ||
679 | p[1] = 0x0a; | ||
680 | p[2] = 2; | ||
681 | /* | ||
682 | * From spc4r23, 7.4.7 Control mode page | ||
683 | * | ||
684 | * The QUEUE ALGORITHM MODIFIER field (see table 368) specifies | ||
685 | * restrictions on the algorithm used for reordering commands | ||
686 | * having the SIMPLE task attribute (see SAM-4). | ||
687 | * | ||
688 | * Table 368 -- QUEUE ALGORITHM MODIFIER field | ||
689 | * Code Description | ||
690 | * 0h Restricted reordering | ||
691 | * 1h Unrestricted reordering allowed | ||
692 | * 2h to 7h Reserved | ||
693 | * 8h to Fh Vendor specific | ||
694 | * | ||
695 | * A value of zero in the QUEUE ALGORITHM MODIFIER field specifies that | ||
696 | * the device server shall order the processing sequence of commands | ||
697 | * having the SIMPLE task attribute such that data integrity is maintained | ||
698 | * for that I_T nexus (i.e., if the transmission of new SCSI transport protocol | ||
699 | * requests is halted at any time, the final value of all data observable | ||
700 | * on the medium shall be the same as if all the commands had been processed | ||
701 | * with the ORDERED task attribute). | ||
702 | * | ||
703 | * A value of one in the QUEUE ALGORITHM MODIFIER field specifies that the | ||
704 | * device server may reorder the processing sequence of commands having the | ||
705 | * SIMPLE task attribute in any manner. Any data integrity exposures related to | ||
706 | * command sequence order shall be explicitly handled by the application client | ||
707 | * through the selection of appropriate ommands and task attributes. | ||
708 | */ | ||
709 | p[3] = (dev->se_sub_dev->se_dev_attrib.emulate_rest_reord == 1) ? 0x00 : 0x10; | ||
710 | /* | ||
711 | * From spc4r17, section 7.4.6 Control mode Page | ||
712 | * | ||
713 | * Unit Attention interlocks control (UN_INTLCK_CTRL) to code 00b | ||
714 | * | ||
715 | * 00b: The logical unit shall clear any unit attention condition | ||
716 | * reported in the same I_T_L_Q nexus transaction as a CHECK CONDITION | ||
717 | * status and shall not establish a unit attention condition when a com- | ||
718 | * mand is completed with BUSY, TASK SET FULL, or RESERVATION CONFLICT | ||
719 | * status. | ||
720 | * | ||
721 | * 10b: The logical unit shall not clear any unit attention condition | ||
722 | * reported in the same I_T_L_Q nexus transaction as a CHECK CONDITION | ||
723 | * status and shall not establish a unit attention condition when | ||
724 | * a command is completed with BUSY, TASK SET FULL, or RESERVATION | ||
725 | * CONFLICT status. | ||
726 | * | ||
727 | * 11b a The logical unit shall not clear any unit attention condition | ||
728 | * reported in the same I_T_L_Q nexus transaction as a CHECK CONDITION | ||
729 | * status and shall establish a unit attention condition for the | ||
730 | * initiator port associated with the I_T nexus on which the BUSY, | ||
731 | * TASK SET FULL, or RESERVATION CONFLICT status is being returned. | ||
732 | * Depending on the status, the additional sense code shall be set to | ||
733 | * PREVIOUS BUSY STATUS, PREVIOUS TASK SET FULL STATUS, or PREVIOUS | ||
734 | * RESERVATION CONFLICT STATUS. Until it is cleared by a REQUEST SENSE | ||
735 | * command, a unit attention condition shall be established only once | ||
736 | * for a BUSY, TASK SET FULL, or RESERVATION CONFLICT status regardless | ||
737 | * to the number of commands completed with one of those status codes. | ||
738 | */ | ||
739 | p[4] = (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 2) ? 0x30 : | ||
740 | (dev->se_sub_dev->se_dev_attrib.emulate_ua_intlck_ctrl == 1) ? 0x20 : 0x00; | ||
741 | /* | ||
742 | * From spc4r17, section 7.4.6 Control mode Page | ||
743 | * | ||
744 | * Task Aborted Status (TAS) bit set to zero. | ||
745 | * | ||
746 | * A task aborted status (TAS) bit set to zero specifies that aborted | ||
747 | * tasks shall be terminated by the device server without any response | ||
748 | * to the application client. A TAS bit set to one specifies that tasks | ||
749 | * aborted by the actions of an I_T nexus other than the I_T nexus on | ||
750 | * which the command was received shall be completed with TASK ABORTED | ||
751 | * status (see SAM-4). | ||
752 | */ | ||
753 | p[5] = (dev->se_sub_dev->se_dev_attrib.emulate_tas) ? 0x40 : 0x00; | ||
754 | p[8] = 0xff; | ||
755 | p[9] = 0xff; | ||
756 | p[11] = 30; | ||
757 | |||
758 | return 12; | ||
759 | } | ||
760 | |||
761 | static int spc_modesense_caching(struct se_device *dev, unsigned char *p) | ||
762 | { | ||
763 | p[0] = 0x08; | ||
764 | p[1] = 0x12; | ||
765 | if (dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) | ||
766 | p[2] = 0x04; /* Write Cache Enable */ | ||
767 | p[12] = 0x20; /* Disabled Read Ahead */ | ||
768 | |||
769 | return 20; | ||
770 | } | ||
771 | |||
772 | static void spc_modesense_write_protect(unsigned char *buf, int type) | ||
773 | { | ||
774 | /* | ||
775 | * I believe that the WP bit (bit 7) in the mode header is the same for | ||
776 | * all device types.. | ||
777 | */ | ||
778 | switch (type) { | ||
779 | case TYPE_DISK: | ||
780 | case TYPE_TAPE: | ||
781 | default: | ||
782 | buf[0] |= 0x80; /* WP bit */ | ||
783 | break; | ||
784 | } | ||
785 | } | ||
786 | |||
787 | static void spc_modesense_dpofua(unsigned char *buf, int type) | ||
788 | { | ||
789 | switch (type) { | ||
790 | case TYPE_DISK: | ||
791 | buf[0] |= 0x10; /* DPOFUA bit */ | ||
792 | break; | ||
793 | default: | ||
794 | break; | ||
795 | } | ||
796 | } | ||
797 | |||
798 | static int spc_emulate_modesense(struct se_cmd *cmd) | ||
799 | { | ||
800 | struct se_device *dev = cmd->se_dev; | ||
801 | char *cdb = cmd->t_task_cdb; | ||
802 | unsigned char *rbuf; | ||
803 | int type = dev->transport->get_device_type(dev); | ||
804 | int ten = (cmd->t_task_cdb[0] == MODE_SENSE_10); | ||
805 | int offset = ten ? 8 : 4; | ||
806 | int length = 0; | ||
807 | unsigned char buf[SE_MODE_PAGE_BUF]; | ||
808 | |||
809 | memset(buf, 0, SE_MODE_PAGE_BUF); | ||
810 | |||
811 | switch (cdb[2] & 0x3f) { | ||
812 | case 0x01: | ||
813 | length = spc_modesense_rwrecovery(&buf[offset]); | ||
814 | break; | ||
815 | case 0x08: | ||
816 | length = spc_modesense_caching(dev, &buf[offset]); | ||
817 | break; | ||
818 | case 0x0a: | ||
819 | length = spc_modesense_control(dev, &buf[offset]); | ||
820 | break; | ||
821 | case 0x3f: | ||
822 | length = spc_modesense_rwrecovery(&buf[offset]); | ||
823 | length += spc_modesense_caching(dev, &buf[offset+length]); | ||
824 | length += spc_modesense_control(dev, &buf[offset+length]); | ||
825 | break; | ||
826 | default: | ||
827 | pr_err("MODE SENSE: unimplemented page/subpage: 0x%02x/0x%02x\n", | ||
828 | cdb[2] & 0x3f, cdb[3]); | ||
829 | cmd->scsi_sense_reason = TCM_UNKNOWN_MODE_PAGE; | ||
830 | return -EINVAL; | ||
831 | } | ||
832 | offset += length; | ||
833 | |||
834 | if (ten) { | ||
835 | offset -= 2; | ||
836 | buf[0] = (offset >> 8) & 0xff; | ||
837 | buf[1] = offset & 0xff; | ||
838 | |||
839 | if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) || | ||
840 | (cmd->se_deve && | ||
841 | (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) | ||
842 | spc_modesense_write_protect(&buf[3], type); | ||
843 | |||
844 | if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) && | ||
845 | (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0)) | ||
846 | spc_modesense_dpofua(&buf[3], type); | ||
847 | |||
848 | if ((offset + 2) > cmd->data_length) | ||
849 | offset = cmd->data_length; | ||
850 | |||
851 | } else { | ||
852 | offset -= 1; | ||
853 | buf[0] = offset & 0xff; | ||
854 | |||
855 | if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) || | ||
856 | (cmd->se_deve && | ||
857 | (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY))) | ||
858 | spc_modesense_write_protect(&buf[2], type); | ||
859 | |||
860 | if ((dev->se_sub_dev->se_dev_attrib.emulate_write_cache > 0) && | ||
861 | (dev->se_sub_dev->se_dev_attrib.emulate_fua_write > 0)) | ||
862 | spc_modesense_dpofua(&buf[2], type); | ||
863 | |||
864 | if ((offset + 1) > cmd->data_length) | ||
865 | offset = cmd->data_length; | ||
866 | } | ||
867 | |||
868 | rbuf = transport_kmap_data_sg(cmd); | ||
869 | memcpy(rbuf, buf, offset); | ||
870 | transport_kunmap_data_sg(cmd); | ||
871 | |||
872 | target_complete_cmd(cmd, GOOD); | ||
873 | return 0; | ||
874 | } | ||
875 | |||
876 | static int spc_emulate_request_sense(struct se_cmd *cmd) | ||
877 | { | ||
878 | unsigned char *cdb = cmd->t_task_cdb; | ||
879 | unsigned char *buf; | ||
880 | u8 ua_asc = 0, ua_ascq = 0; | ||
881 | int err = 0; | ||
882 | |||
883 | if (cdb[1] & 0x01) { | ||
884 | pr_err("REQUEST_SENSE description emulation not" | ||
885 | " supported\n"); | ||
886 | cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
887 | return -ENOSYS; | ||
888 | } | ||
889 | |||
890 | buf = transport_kmap_data_sg(cmd); | ||
891 | |||
892 | if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { | ||
893 | /* | ||
894 | * CURRENT ERROR, UNIT ATTENTION | ||
895 | */ | ||
896 | buf[0] = 0x70; | ||
897 | buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; | ||
898 | |||
899 | if (cmd->data_length < 18) { | ||
900 | buf[7] = 0x00; | ||
901 | err = -EINVAL; | ||
902 | goto end; | ||
903 | } | ||
904 | /* | ||
905 | * The Additional Sense Code (ASC) from the UNIT ATTENTION | ||
906 | */ | ||
907 | buf[SPC_ASC_KEY_OFFSET] = ua_asc; | ||
908 | buf[SPC_ASCQ_KEY_OFFSET] = ua_ascq; | ||
909 | buf[7] = 0x0A; | ||
910 | } else { | ||
911 | /* | ||
912 | * CURRENT ERROR, NO SENSE | ||
913 | */ | ||
914 | buf[0] = 0x70; | ||
915 | buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE; | ||
916 | |||
917 | if (cmd->data_length < 18) { | ||
918 | buf[7] = 0x00; | ||
919 | err = -EINVAL; | ||
920 | goto end; | ||
921 | } | ||
922 | /* | ||
923 | * NO ADDITIONAL SENSE INFORMATION | ||
924 | */ | ||
925 | buf[SPC_ASC_KEY_OFFSET] = 0x00; | ||
926 | buf[7] = 0x0A; | ||
927 | } | ||
928 | |||
929 | end: | ||
930 | transport_kunmap_data_sg(cmd); | ||
931 | target_complete_cmd(cmd, GOOD); | ||
932 | return 0; | ||
933 | } | ||
934 | |||
935 | static int spc_emulate_testunitready(struct se_cmd *cmd) | ||
936 | { | ||
937 | target_complete_cmd(cmd, GOOD); | ||
938 | return 0; | ||
939 | } | ||
940 | |||
941 | int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size) | ||
43 | { | 942 | { |
44 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; | 943 | struct se_subsystem_dev *su_dev = cmd->se_dev->se_sub_dev; |
45 | unsigned char *cdb = cmd->t_task_cdb; | 944 | unsigned char *cdb = cmd->t_task_cdb; |
@@ -53,13 +952,11 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough) | |||
53 | break; | 952 | break; |
54 | case MODE_SENSE: | 953 | case MODE_SENSE: |
55 | *size = cdb[4]; | 954 | *size = cdb[4]; |
56 | if (!passthrough) | 955 | cmd->execute_cmd = spc_emulate_modesense; |
57 | cmd->execute_cmd = target_emulate_modesense; | ||
58 | break; | 956 | break; |
59 | case MODE_SENSE_10: | 957 | case MODE_SENSE_10: |
60 | *size = (cdb[7] << 8) + cdb[8]; | 958 | *size = (cdb[7] << 8) + cdb[8]; |
61 | if (!passthrough) | 959 | cmd->execute_cmd = spc_emulate_modesense; |
62 | cmd->execute_cmd = target_emulate_modesense; | ||
63 | break; | 960 | break; |
64 | case LOG_SELECT: | 961 | case LOG_SELECT: |
65 | case LOG_SENSE: | 962 | case LOG_SENSE: |
@@ -108,8 +1005,7 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough) | |||
108 | break; | 1005 | break; |
109 | case REQUEST_SENSE: | 1006 | case REQUEST_SENSE: |
110 | *size = cdb[4]; | 1007 | *size = cdb[4]; |
111 | if (!passthrough) | 1008 | cmd->execute_cmd = spc_emulate_request_sense; |
112 | cmd->execute_cmd = target_emulate_request_sense; | ||
113 | break; | 1009 | break; |
114 | case INQUIRY: | 1010 | case INQUIRY: |
115 | *size = (cdb[3] << 8) + cdb[4]; | 1011 | *size = (cdb[3] << 8) + cdb[4]; |
@@ -120,8 +1016,7 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough) | |||
120 | */ | 1016 | */ |
121 | if (cmd->se_dev->dev_task_attr_type == SAM_TASK_ATTR_EMULATED) | 1017 | if (cmd->se_dev->dev_task_attr_type == SAM_TASK_ATTR_EMULATED) |
122 | cmd->sam_task_attr = MSG_HEAD_TAG; | 1018 | cmd->sam_task_attr = MSG_HEAD_TAG; |
123 | if (!passthrough) | 1019 | cmd->execute_cmd = spc_emulate_inquiry; |
124 | cmd->execute_cmd = target_emulate_inquiry; | ||
125 | break; | 1020 | break; |
126 | case SECURITY_PROTOCOL_IN: | 1021 | case SECURITY_PROTOCOL_IN: |
127 | case SECURITY_PROTOCOL_OUT: | 1022 | case SECURITY_PROTOCOL_OUT: |
@@ -152,9 +1047,8 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough) | |||
152 | cmd->sam_task_attr = MSG_HEAD_TAG; | 1047 | cmd->sam_task_attr = MSG_HEAD_TAG; |
153 | break; | 1048 | break; |
154 | case TEST_UNIT_READY: | 1049 | case TEST_UNIT_READY: |
1050 | cmd->execute_cmd = spc_emulate_testunitready; | ||
155 | *size = 0; | 1051 | *size = 0; |
156 | if (!passthrough) | ||
157 | cmd->execute_cmd = target_emulate_noop; | ||
158 | break; | 1052 | break; |
159 | default: | 1053 | default: |
160 | pr_warn("TARGET_CORE[%s]: Unsupported SCSI Opcode" | 1054 | pr_warn("TARGET_CORE[%s]: Unsupported SCSI Opcode" |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 0adabd37cbb1..3a7fe21e4d23 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -1343,7 +1343,7 @@ static inline void transport_generic_prepare_cdb( | |||
1343 | } | 1343 | } |
1344 | } | 1344 | } |
1345 | 1345 | ||
1346 | static int target_cmd_size_check(struct se_cmd *cmd, unsigned int size) | 1346 | int target_cmd_size_check(struct se_cmd *cmd, unsigned int size) |
1347 | { | 1347 | { |
1348 | struct se_device *dev = cmd->se_dev; | 1348 | struct se_device *dev = cmd->se_dev; |
1349 | 1349 | ||
@@ -1469,7 +1469,6 @@ int target_setup_cmd_from_cdb( | |||
1469 | u32 pr_reg_type = 0; | 1469 | u32 pr_reg_type = 0; |
1470 | u8 alua_ascq = 0; | 1470 | u8 alua_ascq = 0; |
1471 | unsigned long flags; | 1471 | unsigned long flags; |
1472 | unsigned int size; | ||
1473 | int ret; | 1472 | int ret; |
1474 | 1473 | ||
1475 | transport_generic_prepare_cdb(cdb); | 1474 | transport_generic_prepare_cdb(cdb); |
@@ -1561,11 +1560,7 @@ int target_setup_cmd_from_cdb( | |||
1561 | */ | 1560 | */ |
1562 | } | 1561 | } |
1563 | 1562 | ||
1564 | ret = cmd->se_dev->transport->parse_cdb(cmd, &size); | 1563 | ret = cmd->se_dev->transport->parse_cdb(cmd); |
1565 | if (ret < 0) | ||
1566 | return ret; | ||
1567 | |||
1568 | ret = target_cmd_size_check(cmd, size); | ||
1569 | if (ret < 0) | 1564 | if (ret < 0) |
1570 | return ret; | 1565 | return ret; |
1571 | 1566 | ||
@@ -2163,32 +2158,6 @@ out: | |||
2163 | return -1; | 2158 | return -1; |
2164 | } | 2159 | } |
2165 | 2160 | ||
2166 | static inline long long transport_dev_end_lba(struct se_device *dev) | ||
2167 | { | ||
2168 | return dev->transport->get_blocks(dev) + 1; | ||
2169 | } | ||
2170 | |||
2171 | static int transport_cmd_get_valid_sectors(struct se_cmd *cmd) | ||
2172 | { | ||
2173 | struct se_device *dev = cmd->se_dev; | ||
2174 | u32 sectors; | ||
2175 | |||
2176 | if (dev->transport->get_device_type(dev) != TYPE_DISK) | ||
2177 | return 0; | ||
2178 | |||
2179 | sectors = (cmd->data_length / dev->se_sub_dev->se_dev_attrib.block_size); | ||
2180 | |||
2181 | if ((cmd->t_task_lba + sectors) > transport_dev_end_lba(dev)) { | ||
2182 | pr_err("LBA: %llu Sectors: %u exceeds" | ||
2183 | " transport_dev_end_lba(): %llu\n", | ||
2184 | cmd->t_task_lba, sectors, | ||
2185 | transport_dev_end_lba(dev)); | ||
2186 | return -EINVAL; | ||
2187 | } | ||
2188 | |||
2189 | return 0; | ||
2190 | } | ||
2191 | |||
2192 | /* | 2161 | /* |
2193 | * Called from I/O completion to determine which dormant/delayed | 2162 | * Called from I/O completion to determine which dormant/delayed |
2194 | * and ordered cmds need to have their tasks added to the execution queue. | 2163 | * and ordered cmds need to have their tasks added to the execution queue. |
@@ -2632,7 +2601,6 @@ out: | |||
2632 | */ | 2601 | */ |
2633 | int transport_generic_new_cmd(struct se_cmd *cmd) | 2602 | int transport_generic_new_cmd(struct se_cmd *cmd) |
2634 | { | 2603 | { |
2635 | struct se_device *dev = cmd->se_dev; | ||
2636 | int ret = 0; | 2604 | int ret = 0; |
2637 | 2605 | ||
2638 | /* | 2606 | /* |
@@ -2666,17 +2634,6 @@ int transport_generic_new_cmd(struct se_cmd *cmd) | |||
2666 | return 0; | 2634 | return 0; |
2667 | } | 2635 | } |
2668 | 2636 | ||
2669 | if (cmd->se_cmd_flags & SCF_SCSI_DATA_CDB) { | ||
2670 | struct se_dev_attrib *attr = &dev->se_sub_dev->se_dev_attrib; | ||
2671 | |||
2672 | if (transport_cmd_get_valid_sectors(cmd) < 0) | ||
2673 | return -EINVAL; | ||
2674 | |||
2675 | BUG_ON(cmd->data_length % attr->block_size); | ||
2676 | BUG_ON(DIV_ROUND_UP(cmd->data_length, attr->block_size) > | ||
2677 | attr->hw_max_sectors); | ||
2678 | } | ||
2679 | |||
2680 | atomic_inc(&cmd->t_fe_count); | 2637 | atomic_inc(&cmd->t_fe_count); |
2681 | 2638 | ||
2682 | /* | 2639 | /* |