xref: /spdk/lib/scsi/scsi_bdev.c (revision 588dfe314bb83d86effdf67ec42837b11c2620bf)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2008-2012 Daisuke Aoyama <aoyama@peach.ne.jp>.
3  *   Copyright (C) 2016 Intel Corporation.
4  *   All rights reserved.
5  */
6 
7 #include "scsi_internal.h"
8 
9 #include "spdk/env.h"
10 #include "spdk/bdev.h"
11 #include "spdk/endian.h"
12 #include "spdk/likely.h"
13 #include "spdk/string.h"
14 #include "spdk/util.h"
15 
16 #define SPDK_WORK_BLOCK_SIZE		(4ULL * 1024ULL * 1024ULL)
17 #define SPDK_WORK_ATS_BLOCK_SIZE	(1ULL * 1024ULL * 1024ULL)
18 #define MAX_SERIAL_STRING		32
19 
20 #define DEFAULT_DISK_VENDOR		"INTEL"
21 #define DEFAULT_DISK_REVISION		"0001"
22 #define DEFAULT_DISK_ROTATION_RATE	1	/* Non-rotating medium */
23 #define DEFAULT_DISK_FORM_FACTOR	0x02	/* 3.5 inch */
24 #define DEFAULT_MAX_UNMAP_BLOCK_DESCRIPTOR_COUNT	256
25 
26 #define INQUIRY_OFFSET(field)		offsetof(struct spdk_scsi_cdb_inquiry_data, field) + \
27 					SPDK_SIZEOF_MEMBER(struct spdk_scsi_cdb_inquiry_data, field)
28 
29 static void bdev_scsi_process_block_resubmit(void *arg);
30 
31 static void
32 bdev_scsi_set_naa_ieee_extended(const char *name, uint8_t *buf)
33 {
34 	int i;
35 	uint64_t local_value = 0, id_a, seed = 131;
36 
37 	for (i = 0; name[i] != '\0'; i++) {
38 		local_value = (local_value * seed) + name[i];
39 	}
40 
41 	/*
42 	 * see spc3r23 7.6.3.6.2,
43 	 *  NAA IEEE Extended identifer format
44 	 */
45 	id_a = local_value & 0x0000000fff000000ull;
46 	id_a = id_a << 24;
47 
48 	local_value &= 0x0000000000ffffffull;
49 	/* NAA 02, and 00 03 47 for IEEE Intel */
50 	local_value |= 0x2000000347000000ull;
51 	local_value |= id_a;
52 
53 	to_be64((void *)buf, local_value);
54 }
55 
56 static int
57 bdev_scsi_report_luns(struct spdk_scsi_lun *lun,
58 		      int sel, uint8_t *data, int alloc_len)
59 {
60 	struct spdk_scsi_dev *dev;
61 	struct spdk_scsi_lun *tmp_lun;
62 	uint64_t fmt_lun;
63 	int hlen, len = 0;
64 
65 	if (alloc_len < 8) {
66 		return -1;
67 	}
68 
69 	if (sel == 0x00) {
70 		/* logical unit with addressing method */
71 	} else if (sel == 0x01) {
72 		/* well known logical unit */
73 	} else if (sel == 0x02) {
74 		/* logical unit */
75 	} else {
76 		return -1;
77 	}
78 
79 	/* LUN LIST LENGTH */
80 	memset(data, 0, 4);
81 
82 	/* Reserved */
83 	memset(&data[4], 0, 4);
84 	hlen = 8;
85 
86 	dev = lun->dev;
87 
88 	for (tmp_lun = spdk_scsi_dev_get_first_lun(dev); tmp_lun != NULL;
89 	     tmp_lun = spdk_scsi_dev_get_next_lun(tmp_lun)) {
90 		if (alloc_len - (hlen + len) < 8) {
91 			return -1;
92 		}
93 
94 		fmt_lun = spdk_scsi_lun_id_int_to_fmt(tmp_lun->id);
95 
96 		/* LUN */
97 		to_be64(&data[hlen + len], fmt_lun);
98 		len += 8;
99 	}
100 
101 	/* LUN LIST LENGTH */
102 	to_be32(data, len);
103 
104 	return hlen + len;
105 }
106 
107 static int
108 bdev_scsi_pad_scsi_name(char *dst, const char *name)
109 {
110 	size_t len;
111 
112 	len = strlen(name);
113 	memcpy(dst, name, len);
114 	do {
115 		dst[len++] = '\0';
116 	} while (len & 3);
117 
118 	return len;
119 }
120 
121 static int
122 bdev_scsi_inquiry(struct spdk_bdev *bdev, struct spdk_scsi_task *task,
123 		  uint8_t *cdb, uint8_t *data, uint16_t alloc_len)
124 {
125 	struct spdk_scsi_lun	*lun;
126 	struct spdk_scsi_dev	*dev;
127 	struct spdk_scsi_port	*port;
128 	uint32_t blocks, optimal_blocks;
129 	int hlen = 0, plen, plen2;
130 	uint16_t len = 0;
131 	int pc;
132 	int pd;
133 	int evpd;
134 	int i;
135 	struct spdk_scsi_cdb_inquiry *inq = (struct spdk_scsi_cdb_inquiry *)cdb;
136 
137 	/* standard inquiry command at lease with 36 Bytes */
138 	if (alloc_len < 0x24) {
139 		goto inq_error;
140 	}
141 
142 	lun = task->lun;
143 	dev = lun->dev;
144 	port = task->target_port;
145 
146 	pd = SPDK_SPC_PERIPHERAL_DEVICE_TYPE_DISK;
147 	pc = inq->page_code;
148 	evpd = inq->evpd & 0x1;
149 
150 	if (!evpd && pc) {
151 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
152 					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
153 					  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
154 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
155 		return -1;
156 	}
157 
158 	if (evpd) {
159 		struct spdk_scsi_vpd_page *vpage = (struct spdk_scsi_vpd_page *)data;
160 
161 		/* PERIPHERAL QUALIFIER(7-5) PERIPHERAL DEVICE TYPE(4-0) */
162 		vpage->peripheral_device_type = pd;
163 		vpage->peripheral_qualifier = SPDK_SPC_PERIPHERAL_QUALIFIER_CONNECTED;
164 		/* PAGE CODE */
165 		vpage->page_code = pc;
166 
167 		/* Vital product data */
168 		switch (pc) {
169 		case SPDK_SPC_VPD_SUPPORTED_VPD_PAGES:
170 			hlen = 4;
171 
172 			vpage->params[0] = SPDK_SPC_VPD_SUPPORTED_VPD_PAGES;
173 			vpage->params[1] = SPDK_SPC_VPD_UNIT_SERIAL_NUMBER;
174 			vpage->params[2] = SPDK_SPC_VPD_DEVICE_IDENTIFICATION;
175 			vpage->params[3] = SPDK_SPC_VPD_MANAGEMENT_NETWORK_ADDRESSES;
176 			vpage->params[4] = SPDK_SPC_VPD_EXTENDED_INQUIRY_DATA;
177 			vpage->params[5] = SPDK_SPC_VPD_MODE_PAGE_POLICY;
178 			vpage->params[6] = SPDK_SPC_VPD_SCSI_PORTS;
179 			vpage->params[7] = SPDK_SPC_VPD_BLOCK_LIMITS;
180 			vpage->params[8] = SPDK_SPC_VPD_BLOCK_DEV_CHARS;
181 			len = 9;
182 			if (spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) {
183 				vpage->params[9] = SPDK_SPC_VPD_BLOCK_THIN_PROVISION;
184 				len++;
185 			}
186 
187 			/* PAGE LENGTH */
188 			to_be16(vpage->alloc_len, len);
189 			break;
190 
191 		case SPDK_SPC_VPD_UNIT_SERIAL_NUMBER: {
192 			const char *name = spdk_bdev_get_name(bdev);
193 
194 			hlen = 4;
195 
196 			/* PRODUCT SERIAL NUMBER */
197 			len = strlen(name) + 1;
198 			if (len > MAX_SERIAL_STRING) {
199 				len = MAX_SERIAL_STRING;
200 			}
201 
202 			memcpy(vpage->params, name, len - 1);
203 			vpage->params[len - 1] = 0;
204 
205 			/* PAGE LENGTH */
206 			to_be16(vpage->alloc_len, len);
207 			break;
208 		}
209 
210 		case SPDK_SPC_VPD_DEVICE_IDENTIFICATION: {
211 			const char *name = spdk_bdev_get_name(bdev);
212 			const char *product_name = spdk_bdev_get_product_name(bdev);
213 			uint8_t protocol_id = dev->protocol_id;
214 			uint8_t *buf = vpage->params;
215 			struct spdk_scsi_desig_desc *desig;
216 
217 			hlen = 4;
218 
219 			/* Check total length by calculated how much space all entries take */
220 			len = sizeof(struct spdk_scsi_desig_desc) + 8;
221 			len += sizeof(struct spdk_scsi_desig_desc) + 8 + 16 + MAX_SERIAL_STRING;
222 			len += sizeof(struct spdk_scsi_desig_desc) + SPDK_SCSI_DEV_MAX_NAME + 1;
223 			len += sizeof(struct spdk_scsi_desig_desc) + SPDK_SCSI_PORT_MAX_NAME_LENGTH;
224 			len += sizeof(struct spdk_scsi_desig_desc) + 4;
225 			len += sizeof(struct spdk_scsi_desig_desc) + 4;
226 			len += sizeof(struct spdk_scsi_desig_desc) + 4;
227 			if (sizeof(struct spdk_scsi_vpd_page) + len > alloc_len) {
228 				spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
229 							  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
230 							  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
231 							  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
232 				return -1;
233 			}
234 
235 			/* Now fill out the designator array */
236 
237 			/* NAA designator */
238 			desig = (struct spdk_scsi_desig_desc *)buf;
239 			desig->code_set = SPDK_SPC_VPD_CODE_SET_BINARY;
240 			desig->protocol_id = protocol_id;
241 			desig->type = SPDK_SPC_VPD_IDENTIFIER_TYPE_NAA;
242 			desig->association = SPDK_SPC_VPD_ASSOCIATION_LOGICAL_UNIT;
243 			desig->reserved0 = 0;
244 			desig->piv = 1;
245 			desig->reserved1 = 0;
246 			desig->len = 8;
247 			bdev_scsi_set_naa_ieee_extended(name, desig->desig);
248 			len = sizeof(struct spdk_scsi_desig_desc) + 8;
249 
250 			buf += sizeof(struct spdk_scsi_desig_desc) + desig->len;
251 
252 			/* T10 Vendor ID designator */
253 			desig = (struct spdk_scsi_desig_desc *)buf;
254 			desig->code_set = SPDK_SPC_VPD_CODE_SET_ASCII;
255 			desig->protocol_id = protocol_id;
256 			desig->type = SPDK_SPC_VPD_IDENTIFIER_TYPE_T10_VENDOR_ID;
257 			desig->association = SPDK_SPC_VPD_ASSOCIATION_LOGICAL_UNIT;
258 			desig->reserved0 = 0;
259 			desig->piv = 1;
260 			desig->reserved1 = 0;
261 			desig->len = 8 + 16 + MAX_SERIAL_STRING;
262 			spdk_strcpy_pad(desig->desig, DEFAULT_DISK_VENDOR, 8, ' ');
263 			spdk_strcpy_pad(&desig->desig[8], product_name, 16, ' ');
264 			spdk_strcpy_pad(&desig->desig[24], name, MAX_SERIAL_STRING, ' ');
265 			len += sizeof(struct spdk_scsi_desig_desc) + 8 + 16 + MAX_SERIAL_STRING;
266 
267 			buf += sizeof(struct spdk_scsi_desig_desc) + desig->len;
268 
269 			/* SCSI Device Name designator */
270 			desig = (struct spdk_scsi_desig_desc *)buf;
271 			desig->code_set = SPDK_SPC_VPD_CODE_SET_UTF8;
272 			desig->protocol_id = protocol_id;
273 			desig->type = SPDK_SPC_VPD_IDENTIFIER_TYPE_SCSI_NAME;
274 			desig->association = SPDK_SPC_VPD_ASSOCIATION_TARGET_DEVICE;
275 			desig->reserved0 = 0;
276 			desig->piv = 1;
277 			desig->reserved1 = 0;
278 			desig->len = bdev_scsi_pad_scsi_name(desig->desig, dev->name);
279 			len += sizeof(struct spdk_scsi_desig_desc) + desig->len;
280 
281 			buf += sizeof(struct spdk_scsi_desig_desc) + desig->len;
282 
283 			/* SCSI Port Name designator */
284 			desig = (struct spdk_scsi_desig_desc *)buf;
285 			desig->code_set = SPDK_SPC_VPD_CODE_SET_UTF8;
286 			desig->protocol_id = protocol_id;
287 			desig->type = SPDK_SPC_VPD_IDENTIFIER_TYPE_SCSI_NAME;
288 			desig->association = SPDK_SPC_VPD_ASSOCIATION_TARGET_PORT;
289 			desig->reserved0 = 0;
290 			desig->piv = 1;
291 			desig->reserved1 = 0;
292 			desig->len = snprintf(desig->desig, SPDK_SCSI_PORT_MAX_NAME_LENGTH, "%s", port->name);
293 			len += sizeof(struct spdk_scsi_desig_desc) + desig->len;
294 
295 			buf += sizeof(struct spdk_scsi_desig_desc) + desig->len;
296 
297 			/* Relative Target Port designator */
298 			desig = (struct spdk_scsi_desig_desc *)buf;
299 			desig->code_set = SPDK_SPC_VPD_CODE_SET_BINARY;
300 			desig->protocol_id = protocol_id;
301 			desig->type = SPDK_SPC_VPD_IDENTIFIER_TYPE_RELATIVE_TARGET_PORT;
302 			desig->association = SPDK_SPC_VPD_ASSOCIATION_TARGET_PORT;
303 			desig->reserved0 = 0;
304 			desig->piv = 1;
305 			desig->reserved1 = 0;
306 			desig->len = 4;
307 			memset(desig->desig, 0, 2); /* Reserved */
308 			to_be16(&desig->desig[2], port->index);
309 			len += sizeof(struct spdk_scsi_desig_desc) + desig->len;
310 
311 			buf += sizeof(struct spdk_scsi_desig_desc) + desig->len;
312 
313 			/* Target port group designator */
314 			desig = (struct spdk_scsi_desig_desc *)buf;
315 			desig->code_set = SPDK_SPC_VPD_CODE_SET_BINARY;
316 			desig->protocol_id = protocol_id;
317 			desig->type = SPDK_SPC_VPD_IDENTIFIER_TYPE_TARGET_PORT_GROUP;
318 			desig->association = SPDK_SPC_VPD_ASSOCIATION_TARGET_PORT;
319 			desig->reserved0 = 0;
320 			desig->piv = 1;
321 			desig->reserved1 = 0;
322 			desig->len = 4;
323 			memset(desig->desig, 0, 4);
324 			len += sizeof(struct spdk_scsi_desig_desc) + desig->len;
325 
326 			buf += sizeof(struct spdk_scsi_desig_desc) + desig->len;
327 
328 			/* Logical unit group designator */
329 			desig = (struct spdk_scsi_desig_desc *)buf;
330 			desig->code_set = SPDK_SPC_VPD_CODE_SET_BINARY;
331 			desig->protocol_id = protocol_id;
332 			desig->type = SPDK_SPC_VPD_IDENTIFIER_TYPE_LOGICAL_UNIT_GROUP;
333 			desig->association = SPDK_SPC_VPD_ASSOCIATION_LOGICAL_UNIT;
334 			desig->reserved0 = 0;
335 			desig->piv = 1;
336 			desig->reserved1 = 0;
337 			desig->len = 4;
338 			memset(desig->desig, 0, 2); /* Reserved */
339 			to_be16(&desig->desig[2], dev->id);
340 			len += sizeof(struct spdk_scsi_desig_desc) + desig->len;
341 
342 			to_be16(vpage->alloc_len, len);
343 
344 			break;
345 		}
346 
347 		case SPDK_SPC_VPD_EXTENDED_INQUIRY_DATA: {
348 			struct spdk_scsi_vpd_ext_inquiry *vext = (struct spdk_scsi_vpd_ext_inquiry *)vpage;
349 
350 			hlen = 4;
351 			memset((uint8_t *)vext + hlen, 0, sizeof(*vext) - hlen);
352 
353 			/* RTO(3) GRD_CHK(2) APP_CHK(1) REF_CHK(0) */
354 
355 			/* GROUP_SUP(4) PRIOR_SUP(3) HEADSUP(2) ORDSUP(1) SIMPSUP(0) */
356 			vext->sup = SPDK_SCSI_VEXT_HEADSUP | SPDK_SCSI_VEXT_SIMPSUP;
357 
358 			/* NV_SUP(1) V_SUP(0) */
359 
360 			/* Reserved[7-63] */
361 
362 			len = 64 - hlen;
363 
364 			/* PAGE LENGTH */
365 			to_be16(vpage->alloc_len, len);
366 			break;
367 		}
368 
369 		case SPDK_SPC_VPD_MANAGEMENT_NETWORK_ADDRESSES:
370 			/* PAGE LENGTH */
371 			hlen = 4;
372 
373 			to_be16(vpage->alloc_len, len);
374 			break;
375 
376 		case SPDK_SPC_VPD_MODE_PAGE_POLICY: {
377 			struct spdk_scsi_mpage_policy_desc *pdesc =
378 				(struct spdk_scsi_mpage_policy_desc *)vpage->params;
379 
380 			hlen = 4;
381 
382 			/* Mode page policy descriptor 1 */
383 
384 			/* POLICY PAGE CODE(5-0) */
385 			/* all page code */
386 			pdesc->page_code = 0x3f;
387 
388 			/* POLICY SUBPAGE CODE */
389 			/* all sub page */
390 			pdesc->sub_page_code = 0xff;
391 
392 			/* MLUS(7) MODE PAGE POLICY(1-0) */
393 			/* MLUS own copy */
394 			/* Shared MODE PAGE policy */
395 			pdesc->policy = 0;
396 			/* Reserved */
397 			pdesc->reserved = 0;
398 
399 			len += 4;
400 
401 			to_be16(vpage->alloc_len, len);
402 			break;
403 		}
404 
405 		case SPDK_SPC_VPD_SCSI_PORTS: {
406 			/* PAGE LENGTH */
407 			hlen = 4;
408 
409 			/* Identification descriptor list */
410 			for (i = 0; i < SPDK_SCSI_DEV_MAX_PORTS; i++) {
411 				struct spdk_scsi_port_desc *sdesc;
412 				struct spdk_scsi_tgt_port_desc *pdesc;
413 
414 				if (!dev->port[i].is_used) {
415 					continue;
416 				}
417 
418 				/* Identification descriptor N */
419 				sdesc = (struct spdk_scsi_port_desc *)&vpage->params[len];
420 
421 				/* Reserved */
422 				sdesc->reserved = 0;
423 
424 				/* RELATIVE PORT IDENTIFIER */
425 				to_be16(&sdesc->rel_port_id, dev->port[i].index);
426 
427 				/* Reserved */
428 				sdesc->reserved2 = 0;
429 
430 				/* INITIATOR PORT TRANSPORTID LENGTH */
431 				sdesc->init_port_len = 0;
432 
433 				/* Reserved */
434 				sdesc->init_port_id = 0;
435 
436 				/* TARGET PORT DESCRIPTORS LENGTH */
437 				sdesc->tgt_desc_len = 0;
438 
439 				len += 12;
440 
441 				plen2 = 0;
442 				/* Target port descriptor 1 */
443 				pdesc = (struct spdk_scsi_tgt_port_desc *)sdesc->tgt_desc;
444 
445 				/* PROTOCOL IDENTIFIER(7-4) CODE SET(3-0) */
446 				pdesc->code_set =
447 					SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI << 4 |
448 					SPDK_SPC_VPD_CODE_SET_UTF8;
449 
450 				/* PIV(7) ASSOCIATION(5-4) IDENTIFIER TYPE(3-0) */
451 				pdesc->desig_type = SPDK_SPC_VPD_DESIG_PIV |
452 						    SPDK_SPC_VPD_ASSOCIATION_TARGET_PORT << 4 |
453 						    SPDK_SPC_VPD_IDENTIFIER_TYPE_SCSI_NAME;
454 
455 				/* Reserved */
456 				pdesc->reserved = 0;
457 
458 				/* IDENTIFIER */
459 				plen = snprintf((char *)pdesc->designator,
460 						SPDK_SCSI_PORT_MAX_NAME_LENGTH, "%s",
461 						dev->port[i].name);
462 				pdesc->len = plen;
463 
464 				plen2 += 4 + plen;
465 
466 				/* TARGET PORT DESCRIPTORS LENGTH */
467 				to_be16(&sdesc->tgt_desc_len, plen2);
468 
469 				len += plen2;
470 			}
471 
472 			to_be16(vpage->alloc_len, len);
473 			break;
474 		}
475 
476 		case SPDK_SPC_VPD_BLOCK_LIMITS: {
477 			uint32_t block_size = spdk_bdev_get_data_block_size(bdev);
478 
479 			/* PAGE LENGTH */
480 			memset(&data[4], 0, 60);
481 
482 			hlen = 4;
483 
484 			/* WSNZ(0) */
485 			/* support zero length in WRITE SAME */
486 
487 			/* MAXIMUM COMPARE AND WRITE LENGTH */
488 			blocks = SPDK_WORK_ATS_BLOCK_SIZE / block_size;
489 
490 			if (blocks > 0xff) {
491 				blocks = 0xff;
492 			}
493 
494 			data[5] = (uint8_t)blocks;
495 
496 			/* force align to 4KB */
497 			if (block_size < 4096) {
498 				optimal_blocks = 4096 / block_size;
499 			} else {
500 				optimal_blocks = 1;
501 			}
502 
503 			/* OPTIMAL TRANSFER LENGTH GRANULARITY */
504 			to_be16(&data[6], optimal_blocks);
505 
506 			blocks = SPDK_WORK_BLOCK_SIZE / block_size;
507 
508 			/* MAXIMUM TRANSFER LENGTH */
509 			to_be32(&data[8], blocks);
510 			/* OPTIMAL TRANSFER LENGTH */
511 			to_be32(&data[12], blocks);
512 
513 			/* MAXIMUM PREFETCH XDREAD XDWRITE TRANSFER LENGTH */
514 
515 			len = 20 - hlen;
516 
517 			if (spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) {
518 				/*
519 				 * MAXIMUM UNMAP LBA COUNT: indicates the
520 				 * maximum  number of LBAs that may be
521 				 * unmapped by an UNMAP command.
522 				 */
523 				/* For now, choose 4MB as the maximum. */
524 				to_be32(&data[20], 4194304);
525 
526 				/*
527 				 * MAXIMUM UNMAP BLOCK DESCRIPTOR COUNT:
528 				 * indicates the maximum number of UNMAP
529 				 * block descriptors that shall be contained
530 				 * in the parameter data transferred to the
531 				 * device server for an UNMAP command.
532 				 * The bdev layer automatically splits unmap
533 				 * requests, so pick an arbitrary high number here.
534 				 */
535 				to_be32(&data[24], DEFAULT_MAX_UNMAP_BLOCK_DESCRIPTOR_COUNT);
536 
537 				/*
538 				 * The UGAVALID bit is left as 0 which means neither the
539 				 * OPTIMAL UNMAP GRANULARITY nor the UNMAP GRANULARITY
540 				 * ALIGNMENT fields are valid.
541 				 */
542 
543 				/*
544 				 * MAXIMUM WRITE SAME LENGTH: indicates the
545 				 * maximum number of contiguous logical blocks
546 				 * that the device server allows to be unmapped
547 				 * or written in a single WRITE SAME command.
548 				 */
549 				to_be64(&data[36], 512);
550 
551 				/* Reserved */
552 				/* not specified */
553 				len = 64 - hlen;
554 			}
555 
556 			to_be16(vpage->alloc_len, len);
557 			break;
558 		}
559 
560 		case SPDK_SPC_VPD_BLOCK_DEV_CHARS: {
561 			/* PAGE LENGTH */
562 			hlen = 4;
563 			len = 64 - hlen;
564 
565 			to_be16(&data[4], DEFAULT_DISK_ROTATION_RATE);
566 
567 			/* Reserved */
568 			data[6] = 0;
569 			/* NOMINAL FORM FACTOR(3-0) */
570 			data[7] = DEFAULT_DISK_FORM_FACTOR << 4;
571 			/* Reserved */
572 			memset(&data[8], 0, 64 - 8);
573 
574 			to_be16(vpage->alloc_len, len);
575 			break;
576 		}
577 
578 		case SPDK_SPC_VPD_BLOCK_THIN_PROVISION: {
579 			if (!spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) {
580 				goto inq_error;
581 			}
582 
583 			hlen = 4;
584 			len = 7;
585 
586 			/*
587 			 *  PAGE LENGTH : if the DP bit is set to one, then the
588 			 *  page length shall be set  0004h.
589 			 */
590 			to_be16(&data[2], 0x0004);
591 
592 			/*
593 			 * THRESHOLD EXPONENT : it indicates the threshold set
594 			 * size in LBAs as a power of 2( i.e., the threshold
595 			 * set size  = 2 ^ (threshold exponent).
596 			 */
597 			data[4] = 0;
598 
599 			/*
600 			 * Set the LBPU bit to indicate  the support for UNMAP
601 			 * command.
602 			 */
603 			data[5] |= SPDK_SCSI_UNMAP_LBPU;
604 
605 			/*
606 			 * Set the provisioning type to thin provision.
607 			 */
608 			data[6] = SPDK_SCSI_UNMAP_THIN_PROVISIONING;
609 
610 			to_be16(vpage->alloc_len, len);
611 			break;
612 		}
613 
614 		default:
615 			if (pc >= 0xc0 && pc <= 0xff) {
616 				SPDK_DEBUGLOG(scsi, "Vendor specific INQUIRY VPD page 0x%x\n", pc);
617 			} else {
618 				SPDK_ERRLOG("unsupported INQUIRY VPD page 0x%x\n", pc);
619 			}
620 			goto inq_error;
621 		}
622 	} else {
623 		struct spdk_scsi_cdb_inquiry_data *inqdata =
624 			(struct spdk_scsi_cdb_inquiry_data *)data;
625 
626 		/* Standard INQUIRY data */
627 		/* PERIPHERAL QUALIFIER(7-5) PERIPHERAL DEVICE TYPE(4-0) */
628 		inqdata->peripheral_device_type = pd;
629 		inqdata->peripheral_qualifier = SPDK_SPC_PERIPHERAL_QUALIFIER_CONNECTED;
630 
631 		/* RMB(7) */
632 		inqdata->rmb = 0;
633 
634 		/* VERSION */
635 		/* See SPC3/SBC2/MMC4/SAM2 for more details */
636 		inqdata->version = SPDK_SPC_VERSION_SPC3;
637 
638 		/* NORMACA(5) HISUP(4) RESPONSE DATA FORMAT(3-0) */
639 		/* format 2 */ /* hierarchical support */
640 		inqdata->response = 2 | 1 << 4;
641 
642 		hlen = 5;
643 
644 		/* SCCS(7) ACC(6) TPGS(5-4) 3PC(3) PROTECT(0) */
645 		/* Not support TPGS */
646 		inqdata->flags = 0;
647 
648 		/* MULTIP */
649 		inqdata->flags2 = 0x10;
650 
651 		/* WBUS16(5) SYNC(4) LINKED(3) CMDQUE(1) VS(0) */
652 		/* CMDQUE */
653 		inqdata->flags3 = 0x2;
654 
655 		/* T10 VENDOR IDENTIFICATION */
656 		spdk_strcpy_pad(inqdata->t10_vendor_id, DEFAULT_DISK_VENDOR, 8, ' ');
657 
658 		/* PRODUCT IDENTIFICATION */
659 		spdk_strcpy_pad(inqdata->product_id, spdk_bdev_get_product_name(bdev), 16, ' ');
660 
661 		/* PRODUCT REVISION LEVEL */
662 		spdk_strcpy_pad(inqdata->product_rev, DEFAULT_DISK_REVISION, 4, ' ');
663 
664 		/*
665 		 * Standard inquiry data ends here.  Only populate remaining fields if alloc_len
666 		 *  indicates enough space to hold it.
667 		 */
668 		len = INQUIRY_OFFSET(product_rev) - 5;
669 
670 		if (alloc_len >= INQUIRY_OFFSET(vendor)) {
671 			/* Vendor specific */
672 			memset(inqdata->vendor, 0x20, 20);
673 			len += sizeof(inqdata->vendor);
674 		}
675 
676 		if (alloc_len >= INQUIRY_OFFSET(ius)) {
677 			/* CLOCKING(3-2) QAS(1) IUS(0) */
678 			inqdata->ius = 0;
679 			len += sizeof(inqdata->ius);
680 		}
681 
682 		if (alloc_len >= INQUIRY_OFFSET(reserved)) {
683 			/* Reserved */
684 			inqdata->reserved = 0;
685 			len += sizeof(inqdata->reserved);
686 		}
687 
688 		/* VERSION DESCRIPTOR 1-8 */
689 		if (alloc_len >= INQUIRY_OFFSET(reserved) + 2) {
690 			to_be16(&inqdata->desc[0], 0x0960);
691 			len += 2;
692 		}
693 
694 		if (alloc_len >= INQUIRY_OFFSET(reserved) + 4) {
695 			to_be16(&inqdata->desc[2], 0x0300); /* SPC-3 (no version claimed) */
696 			len += 2;
697 		}
698 
699 		if (alloc_len >= INQUIRY_OFFSET(reserved) + 6) {
700 			to_be16(&inqdata->desc[4], 0x320); /* SBC-2 (no version claimed) */
701 			len += 2;
702 		}
703 
704 		if (alloc_len >= INQUIRY_OFFSET(reserved) + 8) {
705 			to_be16(&inqdata->desc[6], 0x0040); /* SAM-2 (no version claimed) */
706 			len += 2;
707 		}
708 
709 		/*
710 		 * We only fill out 4 descriptors, but if the allocation length goes past
711 		 *  that, zero the remaining bytes.  This fixes some SCSI compliance tests
712 		 *  which expect a full 96 bytes to be returned, including the unpopulated
713 		 *  version descriptors 5-8 (4 * 2 = 8 bytes) plus the 22 bytes of reserved
714 		 *  space (bytes 74-95) - for a total of 30 bytes.
715 		 */
716 		if (alloc_len > INQUIRY_OFFSET(reserved) + 8) {
717 			i = alloc_len - (INQUIRY_OFFSET(reserved) + 8);
718 			if (i > 30) {
719 				i = 30;
720 			}
721 			memset(&inqdata->desc[8], 0, i);
722 			len += i;
723 		}
724 
725 		/* ADDITIONAL LENGTH */
726 		inqdata->add_len = len;
727 	}
728 
729 	return hlen + len;
730 
731 inq_error:
732 	task->data_transferred = 0;
733 	spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
734 				  SPDK_SCSI_SENSE_NO_SENSE,
735 				  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
736 				  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
737 	return -1;
738 }
739 
740 static void
741 mode_sense_page_init(uint8_t *buf, int len, int page, int subpage)
742 {
743 	if (!buf) {
744 		return;
745 	}
746 
747 	memset(buf, 0, len);
748 	if (subpage != 0) {
749 		buf[0] = page | 0x40; /* PAGE + SPF=1 */
750 		buf[1] = subpage;
751 		to_be16(&buf[2], len - 4);
752 	} else {
753 		buf[0] = page;
754 		buf[1] = len - 2;
755 	}
756 }
757 
758 static int
759 bdev_scsi_mode_sense_page(struct spdk_bdev *bdev,
760 			  uint8_t *cdb, int pc, int page, int subpage,
761 			  uint8_t *data, struct spdk_scsi_task *task)
762 {
763 	uint8_t *cp = data;
764 	int len = 0;
765 	int plen;
766 	int i;
767 
768 	if (pc == 0x00) {
769 		/* Current values */
770 	} else if (pc == 0x01) {
771 		/* Changeable values */
772 		/* As we currently do not support changeable values,
773 		   all parameters are reported as zero. */
774 	} else if (pc == 0x02) {
775 		/* Default values */
776 	} else {
777 		/* Saved values not supported */
778 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
779 					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
780 					  SPDK_SCSI_ASC_SAVING_PARAMETERS_NOT_SUPPORTED,
781 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
782 		return -1;
783 	}
784 
785 	switch (page) {
786 	case 0x00:
787 		/* Vendor specific */
788 		break;
789 	case 0x01:
790 		/* Read-Write Error Recovery */
791 		SPDK_DEBUGLOG(scsi,
792 			      "MODE_SENSE Read-Write Error Recovery\n");
793 		if (subpage != 0x00) {
794 			break;
795 		}
796 		plen = 0x0a + 2;
797 		mode_sense_page_init(cp, plen, page, subpage);
798 		len += plen;
799 		break;
800 	case 0x02:
801 		/* Disconnect-Reconnect */
802 		SPDK_DEBUGLOG(scsi,
803 			      "MODE_SENSE Disconnect-Reconnect\n");
804 		if (subpage != 0x00) {
805 			break;
806 		}
807 		plen = 0x0e + 2;
808 		mode_sense_page_init(cp, plen, page, subpage);
809 		len += plen;
810 		break;
811 	case 0x03:
812 		/* Obsolete (Format Device) */
813 		break;
814 	case 0x04:
815 		/* Obsolete (Rigid Disk Geometry) */
816 		break;
817 	case 0x05:
818 		/* Obsolete (Rigid Disk Geometry) */
819 		break;
820 	case 0x06:
821 		/* Reserved */
822 		break;
823 	case 0x07:
824 		/* Verify Error Recovery */
825 		SPDK_DEBUGLOG(scsi,
826 			      "MODE_SENSE Verify Error Recovery\n");
827 
828 		if (subpage != 0x00) {
829 			break;
830 		}
831 
832 		plen = 0x0a + 2;
833 		mode_sense_page_init(cp, plen, page, subpage);
834 		len += plen;
835 		break;
836 	case 0x08: {
837 		/* Caching */
838 		SPDK_DEBUGLOG(scsi, "MODE_SENSE Caching\n");
839 		if (subpage != 0x00) {
840 			break;
841 		}
842 
843 		plen = 0x12 + 2;
844 		mode_sense_page_init(cp, plen, page, subpage);
845 
846 		if (cp && spdk_bdev_has_write_cache(bdev) && pc != 0x01) {
847 			cp[2] |= 0x4;        /* WCE */
848 		}
849 
850 		/* Read Cache Disable (RCD) = 1 */
851 		if (cp && pc != 0x01) {
852 			cp[2] |= 0x1;
853 		}
854 
855 		len += plen;
856 		break;
857 	}
858 	case 0x09:
859 		/* Obsolete */
860 		break;
861 	case 0x0a:
862 		switch (subpage) {
863 		case 0x00:
864 			/* Control */
865 			SPDK_DEBUGLOG(scsi,
866 				      "MODE_SENSE Control\n");
867 			plen = 0x0a + 2;
868 			mode_sense_page_init(cp, plen, page, subpage);
869 			len += plen;
870 			break;
871 		case 0x01:
872 			/* Control Extension */
873 			SPDK_DEBUGLOG(scsi,
874 				      "MODE_SENSE Control Extension\n");
875 			plen = 0x1c + 4;
876 			mode_sense_page_init(cp, plen, page, subpage);
877 			len += plen;
878 			break;
879 		case 0xff:
880 			/* All subpages */
881 			len += bdev_scsi_mode_sense_page(bdev,
882 							 cdb, pc, page,
883 							 0x00,
884 							 cp ? &cp[len] : NULL, task);
885 			len += bdev_scsi_mode_sense_page(bdev,
886 							 cdb, pc, page,
887 							 0x01,
888 							 cp ? &cp[len] : NULL, task);
889 			break;
890 		default:
891 			/* 0x02-0x3e: Reserved */
892 			break;
893 		}
894 		break;
895 	case 0x0b:
896 		/* Obsolete (Medium Types Supported) */
897 		break;
898 	case 0x0c:
899 		/* Obsolete (Notch And Partition) */
900 		break;
901 	case 0x0d:
902 		/* Obsolete */
903 		break;
904 	case 0x0e:
905 	case 0x0f:
906 		/* Reserved */
907 		break;
908 	case 0x10:
909 		/* XOR Control */
910 		SPDK_DEBUGLOG(scsi, "MODE_SENSE XOR Control\n");
911 		if (subpage != 0x00) {
912 			break;
913 		}
914 		plen = 0x16 + 2;
915 		mode_sense_page_init(cp, plen, page, subpage);
916 		len += plen;
917 		break;
918 	case 0x11:
919 	case 0x12:
920 	case 0x13:
921 		/* Reserved */
922 		break;
923 	case 0x14:
924 		/* Enclosure Services Management */
925 		break;
926 	case 0x15:
927 	case 0x16:
928 	case 0x17:
929 		/* Reserved */
930 		break;
931 	case 0x18:
932 		/* Protocol-Specific LUN */
933 		break;
934 	case 0x19:
935 		/* Protocol-Specific Port */
936 		break;
937 	case 0x1a:
938 		/* Power Condition */
939 		SPDK_DEBUGLOG(scsi,
940 			      "MODE_SENSE Power Condition\n");
941 		if (subpage != 0x00) {
942 			break;
943 		}
944 		plen = 0x0a + 2;
945 		mode_sense_page_init(cp, plen, page, subpage);
946 		len += plen;
947 		break;
948 	case 0x1b:
949 		/* Reserved */
950 		break;
951 	case 0x1c:
952 		/* Informational Exceptions Control */
953 		SPDK_DEBUGLOG(scsi,
954 			      "MODE_SENSE Informational Exceptions Control\n");
955 		if (subpage != 0x00) {
956 			break;
957 		}
958 
959 		plen = 0x0a + 2;
960 		mode_sense_page_init(cp, plen, page, subpage);
961 		len += plen;
962 		break;
963 	case 0x1d:
964 	case 0x1e:
965 	case 0x1f:
966 		/* Reserved */
967 		break;
968 	case 0x20:
969 	case 0x21:
970 	case 0x22:
971 	case 0x23:
972 	case 0x24:
973 	case 0x25:
974 	case 0x26:
975 	case 0x27:
976 	case 0x28:
977 	case 0x29:
978 	case 0x2a:
979 	case 0x2b:
980 	case 0x2c:
981 	case 0x2d:
982 	case 0x2e:
983 	case 0x2f:
984 	case 0x30:
985 	case 0x31:
986 	case 0x32:
987 	case 0x33:
988 	case 0x34:
989 	case 0x35:
990 	case 0x36:
991 	case 0x37:
992 	case 0x38:
993 	case 0x39:
994 	case 0x3a:
995 	case 0x3b:
996 	case 0x3c:
997 	case 0x3d:
998 	case 0x3e:
999 		/* Vendor-specific */
1000 		break;
1001 	case 0x3f:
1002 		switch (subpage) {
1003 		case 0x00:
1004 			/* All mode pages */
1005 			for (i = 0x00; i < 0x3e; i ++) {
1006 				len += bdev_scsi_mode_sense_page(
1007 					       bdev, cdb, pc, i, 0x00,
1008 					       cp ? &cp[len] : NULL, task);
1009 			}
1010 			break;
1011 		case 0xff:
1012 			/* All mode pages and subpages */
1013 			for (i = 0x00; i < 0x3e; i ++) {
1014 				len += bdev_scsi_mode_sense_page(
1015 					       bdev, cdb, pc, i, 0x00,
1016 					       cp ? &cp[len] : NULL, task);
1017 			}
1018 			for (i = 0x00; i < 0x3e; i ++) {
1019 				len += bdev_scsi_mode_sense_page(
1020 					       bdev, cdb, pc, i, 0xff,
1021 					       cp ? &cp[len] : NULL, task);
1022 			}
1023 			break;
1024 		default:
1025 			/* 0x01-0x3e: Reserved */
1026 			break;
1027 		}
1028 	}
1029 
1030 	return len;
1031 }
1032 
1033 static int
1034 bdev_scsi_mode_sense(struct spdk_bdev *bdev, int md,
1035 		     uint8_t *cdb, int dbd, int llbaa, int pc,
1036 		     int page, int subpage, uint8_t *data, struct spdk_scsi_task *task)
1037 {
1038 	uint64_t num_blocks = spdk_bdev_get_num_blocks(bdev);
1039 	uint32_t block_size = spdk_bdev_get_data_block_size(bdev);
1040 	uint8_t *hdr, *bdesc, *pages;
1041 	int hlen;
1042 	int blen;
1043 	int plen, total;
1044 
1045 	assert(md == 6 || md == 10);
1046 
1047 	if (md == 6) {
1048 		hlen = 4;
1049 		blen = 8; /* For MODE SENSE 6 only short LBA */
1050 	} else {
1051 		hlen = 8;
1052 		blen = llbaa ? 16 : 8;
1053 	}
1054 
1055 	if (dbd) {
1056 		blen = 0;
1057 	}
1058 
1059 	pages = data ? &data[hlen + blen] : NULL;
1060 	plen = bdev_scsi_mode_sense_page(bdev, cdb, pc, page,
1061 					 subpage,
1062 					 pages, task);
1063 	if (plen < 0) {
1064 		return -1;
1065 	}
1066 
1067 	total = hlen + blen + plen;
1068 	if (data == NULL) {
1069 		return total;
1070 	}
1071 
1072 	hdr = &data[0];
1073 	if (hlen == 4) {
1074 		hdr[0] = total - 1;            /* Mode Data Length */
1075 		hdr[1] = 0;                    /* Medium Type */
1076 		hdr[2] = 0;                    /* Device-Specific Parameter */
1077 		hdr[3] = blen;                 /* Block Descriptor Length */
1078 	} else {
1079 		to_be16(&hdr[0], total - 2);   /* Mode Data Length */
1080 		hdr[2] = 0;                    /* Medium Type */
1081 		hdr[3] = 0;                    /* Device-Specific Parameter */
1082 		hdr[4] = llbaa ? 0x1 : 0;      /* Long/short LBA */
1083 		hdr[5] = 0;                    /* Reserved */
1084 		to_be16(&hdr[6], blen);        /* Block Descriptor Length */
1085 	}
1086 
1087 	bdesc = &data[hlen];
1088 	if (blen == 16) {
1089 		/* Number of Blocks */
1090 		to_be64(&bdesc[0], num_blocks);
1091 		/* Reserved */
1092 		memset(&bdesc[8], 0, 4);
1093 		/* Block Length */
1094 		to_be32(&bdesc[12], block_size);
1095 	} else if (blen == 8) {
1096 		/* Number of Blocks */
1097 		if (num_blocks > 0xffffffffULL) {
1098 			memset(&bdesc[0], 0xff, 4);
1099 		} else {
1100 			to_be32(&bdesc[0], num_blocks);
1101 		}
1102 
1103 		/* Block Length */
1104 		to_be32(&bdesc[4], block_size);
1105 	}
1106 
1107 	return total;
1108 }
1109 
1110 static void
1111 bdev_scsi_task_complete_cmd(struct spdk_bdev_io *bdev_io, bool success,
1112 			    void *cb_arg)
1113 {
1114 	struct spdk_scsi_task *task = cb_arg;
1115 	int sc, sk, asc, ascq;
1116 
1117 	spdk_bdev_io_get_scsi_status(bdev_io, &sc, &sk, &asc, &ascq);
1118 
1119 	spdk_bdev_free_io(bdev_io);
1120 
1121 	spdk_scsi_task_set_status(task, sc, sk, asc, ascq);
1122 	scsi_lun_complete_task(task->lun, task);
1123 }
1124 
1125 static void
1126 bdev_scsi_read_task_complete_cmd(struct spdk_bdev_io *bdev_io, bool success,
1127 				 void *cb_arg)
1128 {
1129 	struct spdk_scsi_task *task = cb_arg;
1130 	int sc, sk, asc, ascq;
1131 
1132 	task->bdev_io = bdev_io;
1133 
1134 	spdk_bdev_io_get_scsi_status(bdev_io, &sc, &sk, &asc, &ascq);
1135 
1136 	spdk_scsi_task_set_status(task, sc, sk, asc, ascq);
1137 	scsi_lun_complete_task(task->lun, task);
1138 }
1139 
1140 static void
1141 bdev_scsi_task_complete_reset(struct spdk_bdev_io *bdev_io, bool success,
1142 			      void *cb_arg)
1143 {
1144 	struct spdk_scsi_task *task = cb_arg;
1145 
1146 	spdk_bdev_free_io(bdev_io);
1147 
1148 	if (success) {
1149 		task->response = SPDK_SCSI_TASK_MGMT_RESP_SUCCESS;
1150 	}
1151 
1152 	scsi_lun_complete_reset_task(task->lun, task);
1153 }
1154 
1155 static void
1156 bdev_scsi_queue_io(struct spdk_scsi_task *task, spdk_bdev_io_wait_cb cb_fn, void *cb_arg)
1157 {
1158 	struct spdk_scsi_lun *lun = task->lun;
1159 	struct spdk_bdev *bdev = lun->bdev;
1160 	struct spdk_io_channel *ch = lun->io_channel;
1161 	int rc;
1162 
1163 	task->bdev_io_wait.bdev = bdev;
1164 	task->bdev_io_wait.cb_fn = cb_fn;
1165 	task->bdev_io_wait.cb_arg = cb_arg;
1166 
1167 	rc = spdk_bdev_queue_io_wait(bdev, ch, &task->bdev_io_wait);
1168 	if (rc != 0) {
1169 		assert(false);
1170 	}
1171 }
1172 
1173 static int
1174 bdev_scsi_sync(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
1175 	       struct spdk_io_channel *bdev_ch, struct spdk_scsi_task *task,
1176 	       uint64_t lba, uint32_t num_blocks)
1177 {
1178 	uint64_t bdev_num_blocks;
1179 	int rc;
1180 
1181 	if (num_blocks == 0) {
1182 		return SPDK_SCSI_TASK_COMPLETE;
1183 	}
1184 
1185 	bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
1186 
1187 	if (lba >= bdev_num_blocks || num_blocks > bdev_num_blocks ||
1188 	    lba > (bdev_num_blocks - num_blocks)) {
1189 		SPDK_ERRLOG("end of media\n");
1190 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1191 					  SPDK_SCSI_SENSE_NO_SENSE,
1192 					  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1193 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1194 		return SPDK_SCSI_TASK_COMPLETE;
1195 	}
1196 
1197 	rc = spdk_bdev_flush_blocks(bdev_desc, bdev_ch, lba, num_blocks,
1198 				    bdev_scsi_task_complete_cmd, task);
1199 
1200 	if (rc) {
1201 		if (rc == -ENOMEM) {
1202 			bdev_scsi_queue_io(task, bdev_scsi_process_block_resubmit, task);
1203 			return SPDK_SCSI_TASK_PENDING;
1204 		}
1205 		SPDK_ERRLOG("spdk_bdev_flush_blocks() failed\n");
1206 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1207 					  SPDK_SCSI_SENSE_NO_SENSE,
1208 					  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1209 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1210 		return SPDK_SCSI_TASK_COMPLETE;
1211 	}
1212 	task->data_transferred = 0;
1213 	return SPDK_SCSI_TASK_PENDING;
1214 }
1215 
1216 static uint64_t
1217 _bytes_to_blocks(uint32_t block_size, uint64_t offset_bytes, uint64_t *offset_blocks,
1218 		 uint64_t num_bytes, uint64_t *num_blocks)
1219 {
1220 	uint8_t shift_cnt;
1221 
1222 	/* Avoid expensive div operations if possible. These spdk_u32 functions are very cheap. */
1223 	if (spdk_likely(spdk_u32_is_pow2(block_size))) {
1224 		shift_cnt = spdk_u32log2(block_size);
1225 		*offset_blocks = offset_bytes >> shift_cnt;
1226 		*num_blocks = num_bytes >> shift_cnt;
1227 		return (offset_bytes - (*offset_blocks << shift_cnt)) |
1228 		       (num_bytes - (*num_blocks << shift_cnt));
1229 	} else {
1230 		*offset_blocks = offset_bytes / block_size;
1231 		*num_blocks = num_bytes / block_size;
1232 		return (offset_bytes % block_size) | (num_bytes % block_size);
1233 	}
1234 }
1235 
1236 static int
1237 bdev_scsi_readwrite(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
1238 		    struct spdk_io_channel *bdev_ch, struct spdk_scsi_task *task,
1239 		    uint64_t lba, uint32_t xfer_len, bool is_read)
1240 {
1241 	uint64_t bdev_num_blocks, offset_blocks, num_blocks;
1242 	uint32_t max_xfer_len, block_size;
1243 	int sk = SPDK_SCSI_SENSE_NO_SENSE, asc = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
1244 	int rc;
1245 
1246 	task->data_transferred = 0;
1247 
1248 	if (spdk_unlikely(task->dxfer_dir != SPDK_SCSI_DIR_NONE &&
1249 			  task->dxfer_dir != (is_read ? SPDK_SCSI_DIR_FROM_DEV : SPDK_SCSI_DIR_TO_DEV))) {
1250 		SPDK_ERRLOG("Incorrect data direction\n");
1251 		goto check_condition;
1252 	}
1253 
1254 	bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
1255 	if (spdk_unlikely(bdev_num_blocks <= lba || bdev_num_blocks - lba < xfer_len)) {
1256 		SPDK_DEBUGLOG(scsi, "end of media\n");
1257 		sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
1258 		asc = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1259 		goto check_condition;
1260 	}
1261 
1262 	if (spdk_unlikely(xfer_len == 0)) {
1263 		task->status = SPDK_SCSI_STATUS_GOOD;
1264 		return SPDK_SCSI_TASK_COMPLETE;
1265 	}
1266 
1267 	block_size = spdk_bdev_get_data_block_size(bdev);
1268 
1269 	/* Transfer Length is limited to the Block Limits VPD page Maximum Transfer Length */
1270 	max_xfer_len = SPDK_WORK_BLOCK_SIZE / block_size;
1271 	if (spdk_unlikely(xfer_len > max_xfer_len)) {
1272 		SPDK_ERRLOG("xfer_len %" PRIu32 " > maximum transfer length %" PRIu32 "\n",
1273 			    xfer_len, max_xfer_len);
1274 		sk = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
1275 		asc = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
1276 		goto check_condition;
1277 	}
1278 
1279 	if (!is_read) {
1280 		/* Additional check for Transfer Length */
1281 		if (xfer_len * block_size > task->transfer_len) {
1282 			SPDK_ERRLOG("xfer_len %" PRIu32 " * block_size %" PRIu32 " > transfer_len %u\n",
1283 				    xfer_len, block_size, task->transfer_len);
1284 			goto check_condition;
1285 		}
1286 	}
1287 
1288 	if (_bytes_to_blocks(block_size, task->offset, &offset_blocks, task->length, &num_blocks) != 0) {
1289 		SPDK_ERRLOG("task's offset %" PRIu64 " or length %" PRIu32 " is not block multiple\n",
1290 			    task->offset, task->length);
1291 		goto check_condition;
1292 	}
1293 
1294 	offset_blocks += lba;
1295 
1296 	SPDK_DEBUGLOG(scsi,
1297 		      "%s: lba=%"PRIu64", len=%"PRIu64"\n",
1298 		      is_read ? "Read" : "Write", offset_blocks, num_blocks);
1299 
1300 	if (is_read) {
1301 		rc = spdk_bdev_readv_blocks(bdev_desc, bdev_ch, task->iovs, task->iovcnt,
1302 					    offset_blocks, num_blocks,
1303 					    bdev_scsi_read_task_complete_cmd, task);
1304 	} else {
1305 		rc = spdk_bdev_writev_blocks(bdev_desc, bdev_ch, task->iovs, task->iovcnt,
1306 					     offset_blocks, num_blocks,
1307 					     bdev_scsi_task_complete_cmd, task);
1308 	}
1309 
1310 	if (rc) {
1311 		if (rc == -ENOMEM) {
1312 			bdev_scsi_queue_io(task, bdev_scsi_process_block_resubmit, task);
1313 			return SPDK_SCSI_TASK_PENDING;
1314 		}
1315 		SPDK_ERRLOG("spdk_bdev_%s_blocks() failed\n", is_read ? "readv" : "writev");
1316 		goto check_condition;
1317 	}
1318 
1319 	task->data_transferred = task->length;
1320 	return SPDK_SCSI_TASK_PENDING;
1321 
1322 check_condition:
1323 	spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION, sk, asc,
1324 				  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1325 	return SPDK_SCSI_TASK_COMPLETE;
1326 }
1327 
1328 struct spdk_bdev_scsi_unmap_ctx {
1329 	struct spdk_scsi_task		*task;
1330 	struct spdk_scsi_unmap_bdesc	desc[DEFAULT_MAX_UNMAP_BLOCK_DESCRIPTOR_COUNT];
1331 	uint32_t			count;
1332 };
1333 
1334 static int bdev_scsi_unmap(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
1335 			   struct spdk_io_channel *bdev_ch, struct spdk_scsi_task *task,
1336 			   struct spdk_bdev_scsi_unmap_ctx *ctx);
1337 
1338 static void
1339 bdev_scsi_task_complete_unmap_cmd(struct spdk_bdev_io *bdev_io, bool success,
1340 				  void *cb_arg)
1341 {
1342 	struct spdk_bdev_scsi_unmap_ctx *ctx = cb_arg;
1343 	struct spdk_scsi_task *task = ctx->task;
1344 	int sc, sk, asc, ascq;
1345 
1346 	ctx->count--;
1347 
1348 	if (task->status == SPDK_SCSI_STATUS_GOOD) {
1349 		spdk_bdev_io_get_scsi_status(bdev_io, &sc, &sk, &asc, &ascq);
1350 		spdk_scsi_task_set_status(task, sc, sk, asc, ascq);
1351 	}
1352 
1353 	spdk_bdev_free_io(bdev_io);
1354 
1355 	if (ctx->count == 0) {
1356 		scsi_lun_complete_task(task->lun, task);
1357 		free(ctx);
1358 	}
1359 }
1360 
1361 static int
1362 __copy_desc(struct spdk_bdev_scsi_unmap_ctx *ctx, uint8_t *data, size_t data_len)
1363 {
1364 	uint16_t	desc_data_len;
1365 	uint16_t	desc_count;
1366 
1367 	if (!data) {
1368 		return -EINVAL;
1369 	}
1370 
1371 	if (data_len < 8) {
1372 		/* We can't even get the reported length, so fail. */
1373 		return -EINVAL;
1374 	}
1375 
1376 	desc_data_len = from_be16(&data[2]);
1377 	desc_count = desc_data_len / 16;
1378 
1379 	if (desc_data_len > (data_len - 8)) {
1380 		SPDK_ERRLOG("Error - desc_data_len (%u) > data_len (%zu) - 8\n",
1381 			    desc_data_len, data_len);
1382 		return -EINVAL;
1383 	}
1384 
1385 	if (desc_count > DEFAULT_MAX_UNMAP_BLOCK_DESCRIPTOR_COUNT) {
1386 		SPDK_ERRLOG("desc_count (%u) greater than max allowed (%u)\n",
1387 			    desc_count, DEFAULT_MAX_UNMAP_BLOCK_DESCRIPTOR_COUNT);
1388 		return -EINVAL;
1389 	}
1390 
1391 	memcpy(ctx->desc, &data[8], desc_data_len);
1392 	return desc_count;
1393 }
1394 
1395 static void
1396 bdev_scsi_unmap_resubmit(void *arg)
1397 {
1398 	struct spdk_bdev_scsi_unmap_ctx	*ctx = arg;
1399 	struct spdk_scsi_task *task = ctx->task;
1400 	struct spdk_scsi_lun *lun = task->lun;
1401 
1402 	bdev_scsi_unmap(lun->bdev, lun->bdev_desc, lun->io_channel, task, ctx);
1403 }
1404 
1405 static int
1406 bdev_scsi_unmap(struct spdk_bdev *bdev, struct spdk_bdev_desc *bdev_desc,
1407 		struct spdk_io_channel *bdev_ch, struct spdk_scsi_task *task,
1408 		struct spdk_bdev_scsi_unmap_ctx *ctx)
1409 {
1410 	uint8_t				*data;
1411 	int				i, desc_count = -1;
1412 	int				data_len;
1413 	int				rc;
1414 
1415 	assert(task->status == SPDK_SCSI_STATUS_GOOD);
1416 
1417 	if (ctx == NULL) {
1418 		ctx = calloc(1, sizeof(*ctx));
1419 		if (!ctx) {
1420 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1421 						  SPDK_SCSI_SENSE_NO_SENSE,
1422 						  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1423 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1424 			return SPDK_SCSI_TASK_COMPLETE;
1425 		}
1426 
1427 		ctx->task = task;
1428 		ctx->count = 0;
1429 	}
1430 
1431 
1432 	if (task->iovcnt == 1) {
1433 		data = (uint8_t *)task->iovs[0].iov_base;
1434 		data_len = task->iovs[0].iov_len;
1435 		desc_count = __copy_desc(ctx, data, data_len);
1436 	} else {
1437 		data = spdk_scsi_task_gather_data(task, &data_len);
1438 		if (data) {
1439 			desc_count = __copy_desc(ctx, data, data_len);
1440 			free(data);
1441 		}
1442 	}
1443 
1444 	if (desc_count < 0) {
1445 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1446 					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1447 					  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1448 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1449 		free(ctx);
1450 		return SPDK_SCSI_TASK_COMPLETE;
1451 	}
1452 
1453 	for (i = ctx->count; i < desc_count; i++) {
1454 		struct spdk_scsi_unmap_bdesc	*desc;
1455 		uint64_t offset_blocks;
1456 		uint64_t num_blocks;
1457 
1458 		desc = &ctx->desc[i];
1459 
1460 		offset_blocks = from_be64(&desc->lba);
1461 		num_blocks = from_be32(&desc->block_count);
1462 
1463 		if (num_blocks == 0) {
1464 			continue;
1465 		}
1466 
1467 		ctx->count++;
1468 		rc = spdk_bdev_unmap_blocks(bdev_desc, bdev_ch, offset_blocks, num_blocks,
1469 					    bdev_scsi_task_complete_unmap_cmd, ctx);
1470 
1471 		if (rc) {
1472 			if (rc == -ENOMEM) {
1473 				bdev_scsi_queue_io(task, bdev_scsi_unmap_resubmit, ctx);
1474 				/* Unmap was not yet submitted to bdev */
1475 				ctx->count--;
1476 				return SPDK_SCSI_TASK_PENDING;
1477 			}
1478 			SPDK_ERRLOG("SCSI Unmapping failed\n");
1479 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1480 						  SPDK_SCSI_SENSE_NO_SENSE,
1481 						  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1482 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1483 			ctx->count--;
1484 			/* We can't complete here - we may have to wait for previously
1485 			 * submitted unmaps to complete */
1486 			break;
1487 		}
1488 	}
1489 
1490 	if (ctx->count == 0) {
1491 		free(ctx);
1492 		return SPDK_SCSI_TASK_COMPLETE;
1493 	}
1494 
1495 	return SPDK_SCSI_TASK_PENDING;
1496 }
1497 
1498 static int
1499 bdev_scsi_process_block(struct spdk_scsi_task *task)
1500 {
1501 	struct spdk_scsi_lun *lun = task->lun;
1502 	struct spdk_bdev *bdev = lun->bdev;
1503 	uint64_t lba;
1504 	uint32_t xfer_len;
1505 	uint32_t len = 0;
1506 	uint8_t *cdb = task->cdb;
1507 
1508 	/* XXX: We need to support FUA bit for writes! */
1509 	switch (cdb[0]) {
1510 	case SPDK_SBC_READ_6:
1511 	case SPDK_SBC_WRITE_6:
1512 		lba = (uint64_t)cdb[1] << 16;
1513 		lba |= (uint64_t)cdb[2] << 8;
1514 		lba |= (uint64_t)cdb[3];
1515 		xfer_len = cdb[4];
1516 		if (xfer_len == 0) {
1517 			xfer_len = 256;
1518 		}
1519 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1520 					   task, lba, xfer_len,
1521 					   cdb[0] == SPDK_SBC_READ_6);
1522 
1523 	case SPDK_SBC_READ_10:
1524 	case SPDK_SBC_WRITE_10:
1525 		lba = from_be32(&cdb[2]);
1526 		xfer_len = from_be16(&cdb[7]);
1527 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1528 					   task, lba, xfer_len,
1529 					   cdb[0] == SPDK_SBC_READ_10);
1530 
1531 	case SPDK_SBC_READ_12:
1532 	case SPDK_SBC_WRITE_12:
1533 		lba = from_be32(&cdb[2]);
1534 		xfer_len = from_be32(&cdb[6]);
1535 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1536 					   task, lba, xfer_len,
1537 					   cdb[0] == SPDK_SBC_READ_12);
1538 	case SPDK_SBC_READ_16:
1539 	case SPDK_SBC_WRITE_16:
1540 		lba = from_be64(&cdb[2]);
1541 		xfer_len = from_be32(&cdb[10]);
1542 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1543 					   task, lba, xfer_len,
1544 					   cdb[0] == SPDK_SBC_READ_16);
1545 
1546 	case SPDK_SBC_READ_CAPACITY_10: {
1547 		uint64_t num_blocks = spdk_bdev_get_num_blocks(bdev);
1548 		uint8_t buffer[8];
1549 
1550 		if (num_blocks - 1 > 0xffffffffULL) {
1551 			memset(buffer, 0xff, 4);
1552 		} else {
1553 			to_be32(buffer, num_blocks - 1);
1554 		}
1555 		to_be32(&buffer[4], spdk_bdev_get_data_block_size(bdev));
1556 
1557 		len = spdk_min(task->length, sizeof(buffer));
1558 		if (spdk_scsi_task_scatter_data(task, buffer, len) < 0) {
1559 			break;
1560 		}
1561 
1562 		task->data_transferred = len;
1563 		task->status = SPDK_SCSI_STATUS_GOOD;
1564 		break;
1565 	}
1566 
1567 	case SPDK_SPC_SERVICE_ACTION_IN_16:
1568 		switch (cdb[1] & 0x1f) { /* SERVICE ACTION */
1569 		case SPDK_SBC_SAI_READ_CAPACITY_16: {
1570 			uint8_t buffer[32] = {0};
1571 			uint32_t lbppb, lbppbe;
1572 
1573 			to_be64(&buffer[0], spdk_bdev_get_num_blocks(bdev) - 1);
1574 			to_be32(&buffer[8], spdk_bdev_get_data_block_size(bdev));
1575 			lbppb = spdk_bdev_get_physical_block_size(bdev) / spdk_bdev_get_data_block_size(bdev);
1576 			lbppbe = spdk_u32log2(lbppb);
1577 			if (lbppbe > 0xf) {
1578 				SPDK_ERRLOG("lbppbe(0x%x) > 0xf\n", lbppbe);
1579 			} else {
1580 				buffer[13] = lbppbe;
1581 			}
1582 			/*
1583 			 * Set the TPE bit to 1 to indicate thin provisioning.
1584 			 * The position of TPE bit is the 7th bit in 14th byte
1585 			 * in READ CAPACITY (16) parameter data.
1586 			 */
1587 			if (spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) {
1588 				buffer[14] |= 1 << 7;
1589 			}
1590 
1591 			len = spdk_min(from_be32(&cdb[10]), sizeof(buffer));
1592 			if (spdk_scsi_task_scatter_data(task, buffer, len) < 0) {
1593 				break;
1594 			}
1595 
1596 			task->data_transferred = len;
1597 			task->status = SPDK_SCSI_STATUS_GOOD;
1598 			break;
1599 		}
1600 
1601 		default:
1602 			return SPDK_SCSI_TASK_UNKNOWN;
1603 		}
1604 		break;
1605 
1606 	case SPDK_SBC_SYNCHRONIZE_CACHE_10:
1607 	case SPDK_SBC_SYNCHRONIZE_CACHE_16:
1608 		if (cdb[0] == SPDK_SBC_SYNCHRONIZE_CACHE_10) {
1609 			lba = from_be32(&cdb[2]);
1610 			len = from_be16(&cdb[7]);
1611 		} else {
1612 			lba = from_be64(&cdb[2]);
1613 			len = from_be32(&cdb[10]);
1614 		}
1615 
1616 		if (len == 0) {
1617 			len = spdk_bdev_get_num_blocks(bdev) - lba;
1618 		}
1619 
1620 		return bdev_scsi_sync(bdev, lun->bdev_desc, lun->io_channel, task, lba, len);
1621 		break;
1622 
1623 	case SPDK_SBC_UNMAP:
1624 		return bdev_scsi_unmap(bdev, lun->bdev_desc, lun->io_channel, task, NULL);
1625 
1626 	default:
1627 		return SPDK_SCSI_TASK_UNKNOWN;
1628 	}
1629 
1630 	return SPDK_SCSI_TASK_COMPLETE;
1631 }
1632 
1633 static void
1634 bdev_scsi_process_block_resubmit(void *arg)
1635 {
1636 	struct spdk_scsi_task *task = arg;
1637 
1638 	bdev_scsi_process_block(task);
1639 }
1640 
1641 static int
1642 bdev_scsi_check_len(struct spdk_scsi_task *task, int len, int min_len)
1643 {
1644 	if (len >= min_len) {
1645 		return 0;
1646 	}
1647 
1648 	/* INVALID FIELD IN CDB */
1649 	spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1650 				  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1651 				  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1652 				  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1653 	return -1;
1654 }
1655 
1656 static int
1657 bdev_scsi_process_primary(struct spdk_scsi_task *task)
1658 {
1659 	struct spdk_scsi_lun *lun = task->lun;
1660 	struct spdk_bdev *bdev = lun->bdev;
1661 	int alloc_len = -1;
1662 	int data_len = -1;
1663 	uint8_t *cdb = task->cdb;
1664 	uint8_t *data = NULL;
1665 	int rc = 0;
1666 	int pllen, md = 0;
1667 	int llba;
1668 	int dbd, pc, page, subpage;
1669 	int cmd_parsed = 0;
1670 
1671 	switch (cdb[0]) {
1672 	case SPDK_SPC_INQUIRY:
1673 		alloc_len = from_be16(&cdb[3]);
1674 		data_len = spdk_max(4096, alloc_len);
1675 		data = calloc(1, data_len);
1676 		assert(data != NULL);
1677 		rc = bdev_scsi_inquiry(bdev, task, cdb, data, data_len);
1678 		data_len = spdk_min(rc, data_len);
1679 		if (rc < 0) {
1680 			break;
1681 		}
1682 
1683 		SPDK_LOGDUMP(scsi, "INQUIRY", data, data_len);
1684 		break;
1685 
1686 	case SPDK_SPC_REPORT_LUNS: {
1687 		int sel;
1688 
1689 		sel = cdb[2];
1690 		SPDK_DEBUGLOG(scsi, "sel=%x\n", sel);
1691 
1692 		alloc_len = from_be32(&cdb[6]);
1693 		rc = bdev_scsi_check_len(task, alloc_len, 16);
1694 		if (rc < 0) {
1695 			break;
1696 		}
1697 
1698 		data_len = spdk_max(4096, alloc_len);
1699 		data = calloc(1, data_len);
1700 		assert(data != NULL);
1701 		rc = bdev_scsi_report_luns(task->lun, sel, data, data_len);
1702 		data_len = rc;
1703 		if (rc < 0) {
1704 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1705 						  SPDK_SCSI_SENSE_NO_SENSE,
1706 						  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1707 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1708 			break;
1709 		}
1710 
1711 		SPDK_LOGDUMP(scsi, "REPORT LUNS", data, data_len);
1712 		break;
1713 	}
1714 
1715 	case SPDK_SPC_MODE_SELECT_6:
1716 	case SPDK_SPC_MODE_SELECT_10:
1717 		if (cdb[0] == SPDK_SPC_MODE_SELECT_6) {
1718 			/* MODE_SELECT(6) must have at least a 4 byte header. */
1719 			md = 4;
1720 			pllen = cdb[4];
1721 		} else {
1722 			/* MODE_SELECT(10) must have at least an 8 byte header. */
1723 			md = 8;
1724 			pllen = from_be16(&cdb[7]);
1725 		}
1726 
1727 		if (pllen == 0) {
1728 			break;
1729 		}
1730 
1731 		rc = bdev_scsi_check_len(task, pllen, md);
1732 		if (rc < 0) {
1733 			break;
1734 		}
1735 
1736 		data = spdk_scsi_task_gather_data(task, &rc);
1737 		if (rc < 0) {
1738 			break;
1739 		}
1740 		data_len = rc;
1741 
1742 		rc = bdev_scsi_check_len(task, data_len, spdk_max(pllen, md));
1743 		if (rc < 0) {
1744 			break;
1745 		}
1746 
1747 		rc = pllen;
1748 		data_len = 0;
1749 		break;
1750 
1751 	case SPDK_SPC_MODE_SENSE_6:
1752 		alloc_len = cdb[4];
1753 		md = 6;
1754 	/* FALLTHROUGH */
1755 	case SPDK_SPC_MODE_SENSE_10:
1756 		llba = 0;
1757 
1758 		if (md == 0) {
1759 			alloc_len = from_be16(&cdb[7]);
1760 			llba = !!(cdb[1] & 0x10);
1761 			md = 10;
1762 		}
1763 
1764 		dbd = !!(cdb[1] & 0x8);
1765 		pc = (cdb[2] & 0xc0) >> 6;
1766 		page = cdb[2] & 0x3f;
1767 		subpage = cdb[3];
1768 
1769 		/* First call with no buffer to discover needed buffer size */
1770 		rc = bdev_scsi_mode_sense(bdev, md,
1771 					  cdb, dbd, llba, pc,
1772 					  page, subpage,
1773 					  NULL, task);
1774 		if (rc < 0) {
1775 			break;
1776 		}
1777 
1778 		data_len = rc;
1779 		data = calloc(1, data_len);
1780 		assert(data != NULL);
1781 
1782 		/* First call with no buffer to discover needed buffer size */
1783 		rc = bdev_scsi_mode_sense(bdev, md,
1784 					  cdb, dbd, llba, pc,
1785 					  page, subpage,
1786 					  data, task);
1787 		if (rc < 0) {
1788 			/* INVALID FIELD IN CDB */
1789 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1790 						  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1791 						  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1792 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1793 			break;
1794 		}
1795 		break;
1796 
1797 	case SPDK_SPC_REQUEST_SENSE: {
1798 		int desc;
1799 		int sk, asc, ascq;
1800 
1801 		desc = cdb[1] & 0x1;
1802 		if (desc != 0) {
1803 			/* INVALID FIELD IN CDB */
1804 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1805 						  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1806 						  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1807 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1808 			break;
1809 		}
1810 
1811 		alloc_len = cdb[4];
1812 
1813 		/* NO ADDITIONAL SENSE INFORMATION */
1814 		sk = SPDK_SCSI_SENSE_NO_SENSE;
1815 		asc = 0x00;
1816 		ascq = 0x00;
1817 
1818 		spdk_scsi_task_build_sense_data(task, sk, asc, ascq);
1819 
1820 		data_len = task->sense_data_len;
1821 		data = calloc(1, data_len);
1822 		assert(data != NULL);
1823 		memcpy(data, task->sense_data, data_len);
1824 		break;
1825 	}
1826 
1827 	case SPDK_SPC_LOG_SELECT:
1828 		SPDK_DEBUGLOG(scsi, "LOG_SELECT\n");
1829 		cmd_parsed = 1;
1830 	/* FALLTHROUGH */
1831 	case SPDK_SPC_LOG_SENSE:
1832 		if (!cmd_parsed) {
1833 			SPDK_DEBUGLOG(scsi, "LOG_SENSE\n");
1834 		}
1835 
1836 		/* INVALID COMMAND OPERATION CODE */
1837 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1838 					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1839 					  SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE,
1840 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1841 		rc = -1;
1842 		break;
1843 
1844 	case SPDK_SPC_TEST_UNIT_READY:
1845 		SPDK_DEBUGLOG(scsi, "TEST_UNIT_READY\n");
1846 		cmd_parsed = 1;
1847 	/* FALLTHROUGH */
1848 	case SPDK_SBC_START_STOP_UNIT:
1849 		if (!cmd_parsed) {
1850 			SPDK_DEBUGLOG(scsi, "START_STOP_UNIT\n");
1851 		}
1852 
1853 		rc = 0;
1854 		break;
1855 
1856 	case SPDK_SPC_PERSISTENT_RESERVE_OUT:
1857 		pllen = from_be32(&cdb[5]);
1858 		rc = bdev_scsi_check_len(task, pllen, 24);
1859 		if (rc < 0) {
1860 			break;
1861 		}
1862 
1863 		data = spdk_scsi_task_gather_data(task, &rc);
1864 		if (rc < 0) {
1865 			break;
1866 		}
1867 		data_len = rc;
1868 		if (data_len < 24) {
1869 			rc = -1;
1870 			break;
1871 		}
1872 
1873 		rc = scsi_pr_out(task, cdb, data, data_len);
1874 		if (rc < 0) {
1875 			break;
1876 		}
1877 		rc = pllen;
1878 		data_len = 0;
1879 		break;
1880 
1881 	case SPDK_SPC_PERSISTENT_RESERVE_IN:
1882 		alloc_len = from_be16(&cdb[7]);
1883 		data_len = alloc_len;
1884 		data = calloc(1, data_len);
1885 		assert(data != NULL);
1886 		rc = scsi_pr_in(task, cdb, data, data_len);
1887 		break;
1888 
1889 	case SPDK_SPC2_RESERVE_6:
1890 	case SPDK_SPC2_RESERVE_10:
1891 		rc = scsi2_reserve(task, cdb);
1892 		if (rc == 0) {
1893 			if (cdb[0] == SPDK_SPC2_RESERVE_10) {
1894 				rc = from_be16(&cdb[7]);
1895 			}
1896 			data_len = 0;
1897 		}
1898 		break;
1899 
1900 	case SPDK_SPC2_RELEASE_6:
1901 	case SPDK_SPC2_RELEASE_10:
1902 		rc = scsi2_release(task);
1903 		break;
1904 
1905 	default:
1906 		return SPDK_SCSI_TASK_UNKNOWN;
1907 	}
1908 
1909 	if (rc >= 0 && data_len > 0) {
1910 		assert(alloc_len >= 0);
1911 		spdk_scsi_task_scatter_data(task, data, spdk_min(alloc_len, data_len));
1912 		rc = spdk_min(data_len, alloc_len);
1913 	}
1914 
1915 	if (rc >= 0) {
1916 		task->data_transferred = rc;
1917 		task->status = SPDK_SCSI_STATUS_GOOD;
1918 	}
1919 
1920 	if (data) {
1921 		free(data);
1922 	}
1923 
1924 	return SPDK_SCSI_TASK_COMPLETE;
1925 }
1926 
1927 int
1928 bdev_scsi_execute(struct spdk_scsi_task *task)
1929 {
1930 	int rc;
1931 
1932 	if ((rc = bdev_scsi_process_block(task)) == SPDK_SCSI_TASK_UNKNOWN) {
1933 		if ((rc = bdev_scsi_process_primary(task)) == SPDK_SCSI_TASK_UNKNOWN) {
1934 			SPDK_DEBUGLOG(scsi, "unsupported SCSI OP=0x%x\n", task->cdb[0]);
1935 			/* INVALID COMMAND OPERATION CODE */
1936 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1937 						  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1938 						  SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE,
1939 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1940 			return SPDK_SCSI_TASK_COMPLETE;
1941 		}
1942 	}
1943 
1944 	return rc;
1945 }
1946 
1947 static void
1948 bdev_scsi_reset_resubmit(void *arg)
1949 {
1950 	struct spdk_scsi_task *task = arg;
1951 
1952 	bdev_scsi_reset(task);
1953 }
1954 
1955 void
1956 bdev_scsi_reset(struct spdk_scsi_task *task)
1957 {
1958 	struct spdk_scsi_lun *lun = task->lun;
1959 	int rc;
1960 
1961 	rc = spdk_bdev_reset(lun->bdev_desc, lun->io_channel, bdev_scsi_task_complete_reset,
1962 			     task);
1963 	if (rc == -ENOMEM) {
1964 		bdev_scsi_queue_io(task, bdev_scsi_reset_resubmit, task);
1965 	}
1966 }
1967 
1968 bool
1969 bdev_scsi_get_dif_ctx(struct spdk_bdev *bdev, struct spdk_scsi_task *task,
1970 		      struct spdk_dif_ctx *dif_ctx)
1971 {
1972 	uint32_t ref_tag = 0, dif_check_flags = 0, data_offset;
1973 	uint8_t *cdb;
1974 	int rc;
1975 
1976 	if (spdk_likely(spdk_bdev_get_md_size(bdev) == 0)) {
1977 		return false;
1978 	}
1979 
1980 	cdb = task->cdb;
1981 	data_offset = task->offset;
1982 
1983 	/* We use lower 32 bits of LBA as Reference. Tag */
1984 	switch (cdb[0]) {
1985 	case SPDK_SBC_READ_6:
1986 	case SPDK_SBC_WRITE_6:
1987 		ref_tag = (uint32_t)cdb[1] << 16;
1988 		ref_tag |= (uint32_t)cdb[2] << 8;
1989 		ref_tag |= (uint32_t)cdb[3];
1990 		break;
1991 	case SPDK_SBC_READ_10:
1992 	case SPDK_SBC_WRITE_10:
1993 	case SPDK_SBC_READ_12:
1994 	case SPDK_SBC_WRITE_12:
1995 		ref_tag = from_be32(&cdb[2]);
1996 		break;
1997 	case SPDK_SBC_READ_16:
1998 	case SPDK_SBC_WRITE_16:
1999 		ref_tag = (uint32_t)from_be64(&cdb[2]);
2000 		break;
2001 	default:
2002 		return false;
2003 	}
2004 
2005 	if (spdk_bdev_is_dif_check_enabled(bdev, SPDK_DIF_CHECK_TYPE_REFTAG)) {
2006 		dif_check_flags |= SPDK_DIF_FLAGS_REFTAG_CHECK;
2007 	}
2008 
2009 	if (spdk_bdev_is_dif_check_enabled(bdev, SPDK_DIF_CHECK_TYPE_GUARD)) {
2010 		dif_check_flags |= SPDK_DIF_FLAGS_GUARD_CHECK;
2011 	}
2012 
2013 	rc = spdk_dif_ctx_init(dif_ctx,
2014 			       spdk_bdev_get_block_size(bdev),
2015 			       spdk_bdev_get_md_size(bdev),
2016 			       spdk_bdev_is_md_interleaved(bdev),
2017 			       spdk_bdev_is_dif_head_of_md(bdev),
2018 			       spdk_bdev_get_dif_type(bdev),
2019 			       dif_check_flags,
2020 			       ref_tag, 0, 0, data_offset, 0);
2021 
2022 	return (rc == 0) ? true : false;
2023 }
2024