xref: /spdk/lib/scsi/scsi_bdev.c (revision 956f5e5be9b5933c3fb22832bae5a91d48f59d9c)
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 identifier 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], blocks);
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_NOTICELOG("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			desc_count;
1332 	uint32_t			count;
1333 };
1334 
1335 static int _bdev_scsi_unmap(struct spdk_bdev_scsi_unmap_ctx *ctx);
1336 
1337 static void
1338 bdev_scsi_task_complete_unmap_cmd(struct spdk_bdev_io *bdev_io, bool success,
1339 				  void *cb_arg)
1340 {
1341 	struct spdk_bdev_scsi_unmap_ctx *ctx = cb_arg;
1342 	struct spdk_scsi_task *task = ctx->task;
1343 	int sc, sk, asc, ascq;
1344 
1345 	ctx->count--;
1346 
1347 	if (task->status == SPDK_SCSI_STATUS_GOOD) {
1348 		spdk_bdev_io_get_scsi_status(bdev_io, &sc, &sk, &asc, &ascq);
1349 		spdk_scsi_task_set_status(task, sc, sk, asc, ascq);
1350 	}
1351 
1352 	spdk_bdev_free_io(bdev_io);
1353 
1354 	if (ctx->count == 0) {
1355 		scsi_lun_complete_task(task->lun, task);
1356 		free(ctx);
1357 	}
1358 }
1359 
1360 static int
1361 __copy_desc(struct spdk_bdev_scsi_unmap_ctx *ctx, uint8_t *data, size_t data_len)
1362 {
1363 	uint16_t	desc_data_len;
1364 	uint16_t	desc_count;
1365 
1366 	if (!data) {
1367 		return -EINVAL;
1368 	}
1369 
1370 	if (data_len < 8) {
1371 		/* We can't even get the reported length, so fail. */
1372 		return -EINVAL;
1373 	}
1374 
1375 	desc_data_len = from_be16(&data[2]);
1376 	desc_count = desc_data_len / 16;
1377 
1378 	if (desc_data_len > (data_len - 8)) {
1379 		SPDK_ERRLOG("Error - desc_data_len (%u) > data_len (%zu) - 8\n",
1380 			    desc_data_len, data_len);
1381 		return -EINVAL;
1382 	}
1383 
1384 	if (desc_count > DEFAULT_MAX_UNMAP_BLOCK_DESCRIPTOR_COUNT) {
1385 		SPDK_ERRLOG("desc_count (%u) greater than max allowed (%u)\n",
1386 			    desc_count, DEFAULT_MAX_UNMAP_BLOCK_DESCRIPTOR_COUNT);
1387 		return -EINVAL;
1388 	}
1389 
1390 	memcpy(ctx->desc, &data[8], desc_data_len);
1391 	return desc_count;
1392 }
1393 
1394 static void
1395 bdev_scsi_unmap_resubmit(void *arg)
1396 {
1397 	struct spdk_bdev_scsi_unmap_ctx	*ctx = arg;
1398 
1399 	_bdev_scsi_unmap(ctx);
1400 }
1401 
1402 static int
1403 _bdev_scsi_unmap(struct spdk_bdev_scsi_unmap_ctx *ctx)
1404 {
1405 	struct spdk_scsi_task *task = ctx->task;
1406 	struct spdk_scsi_lun *lun = task->lun;
1407 	uint32_t i;
1408 	int rc;
1409 
1410 	for (i = ctx->count; i < ctx->desc_count; i++) {
1411 		struct spdk_scsi_unmap_bdesc	*desc;
1412 		uint64_t offset_blocks;
1413 		uint64_t num_blocks;
1414 
1415 		desc = &ctx->desc[i];
1416 
1417 		offset_blocks = from_be64(&desc->lba);
1418 		num_blocks = from_be32(&desc->block_count);
1419 
1420 		if (num_blocks == 0) {
1421 			continue;
1422 		}
1423 
1424 		ctx->count++;
1425 		rc = spdk_bdev_unmap_blocks(lun->bdev_desc,
1426 					    lun->io_channel,
1427 					    offset_blocks,
1428 					    num_blocks,
1429 					    bdev_scsi_task_complete_unmap_cmd,
1430 					    ctx);
1431 
1432 		if (rc) {
1433 			if (rc == -ENOMEM) {
1434 				bdev_scsi_queue_io(task, bdev_scsi_unmap_resubmit, ctx);
1435 				/* Unmap was not yet submitted to bdev */
1436 				ctx->count--;
1437 				return SPDK_SCSI_TASK_PENDING;
1438 			}
1439 			SPDK_ERRLOG("SCSI Unmapping failed\n");
1440 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1441 						  SPDK_SCSI_SENSE_NO_SENSE,
1442 						  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1443 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1444 			ctx->count--;
1445 			/* We can't complete here - we may have to wait for previously
1446 			 * submitted unmaps to complete */
1447 			break;
1448 		}
1449 	}
1450 
1451 	if (ctx->count == 0) {
1452 		free(ctx);
1453 		return SPDK_SCSI_TASK_COMPLETE;
1454 	}
1455 
1456 	return SPDK_SCSI_TASK_PENDING;
1457 }
1458 
1459 static int
1460 bdev_scsi_unmap(struct spdk_bdev *bdev, struct spdk_scsi_task *task)
1461 {
1462 	struct spdk_bdev_scsi_unmap_ctx	*ctx;
1463 	uint8_t				*data;
1464 	int				desc_count = -1;
1465 	int				data_len;
1466 
1467 	assert(task->status == SPDK_SCSI_STATUS_GOOD);
1468 
1469 	ctx = calloc(1, sizeof(*ctx));
1470 	if (!ctx) {
1471 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1472 					  SPDK_SCSI_SENSE_NO_SENSE,
1473 					  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1474 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1475 		return SPDK_SCSI_TASK_COMPLETE;
1476 	}
1477 
1478 	ctx->task = task;
1479 	ctx->count = 0;
1480 
1481 	if (task->iovcnt == 1) {
1482 		data = (uint8_t *)task->iovs[0].iov_base;
1483 		data_len = task->iovs[0].iov_len;
1484 		desc_count = __copy_desc(ctx, data, data_len);
1485 	} else {
1486 		data = spdk_scsi_task_gather_data(task, &data_len);
1487 		if (data) {
1488 			desc_count = __copy_desc(ctx, data, data_len);
1489 			free(data);
1490 		}
1491 	}
1492 
1493 	if (desc_count < 0) {
1494 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1495 					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1496 					  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1497 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1498 		free(ctx);
1499 		return SPDK_SCSI_TASK_COMPLETE;
1500 	}
1501 
1502 	ctx->desc_count = desc_count;
1503 
1504 	return _bdev_scsi_unmap(ctx);
1505 }
1506 
1507 static int
1508 bdev_scsi_process_block(struct spdk_scsi_task *task)
1509 {
1510 	struct spdk_scsi_lun *lun = task->lun;
1511 	struct spdk_bdev *bdev = lun->bdev;
1512 	uint64_t lba;
1513 	uint32_t xfer_len;
1514 	uint32_t len = 0;
1515 	uint8_t *cdb = task->cdb;
1516 
1517 	/* XXX: We need to support FUA bit for writes! */
1518 	switch (cdb[0]) {
1519 	case SPDK_SBC_READ_6:
1520 	case SPDK_SBC_WRITE_6:
1521 		lba = (uint64_t)cdb[1] << 16;
1522 		lba |= (uint64_t)cdb[2] << 8;
1523 		lba |= (uint64_t)cdb[3];
1524 		xfer_len = cdb[4];
1525 		if (xfer_len == 0) {
1526 			xfer_len = 256;
1527 		}
1528 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1529 					   task, lba, xfer_len,
1530 					   cdb[0] == SPDK_SBC_READ_6);
1531 
1532 	case SPDK_SBC_READ_10:
1533 	case SPDK_SBC_WRITE_10:
1534 		lba = from_be32(&cdb[2]);
1535 		xfer_len = from_be16(&cdb[7]);
1536 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1537 					   task, lba, xfer_len,
1538 					   cdb[0] == SPDK_SBC_READ_10);
1539 
1540 	case SPDK_SBC_READ_12:
1541 	case SPDK_SBC_WRITE_12:
1542 		lba = from_be32(&cdb[2]);
1543 		xfer_len = from_be32(&cdb[6]);
1544 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1545 					   task, lba, xfer_len,
1546 					   cdb[0] == SPDK_SBC_READ_12);
1547 	case SPDK_SBC_READ_16:
1548 	case SPDK_SBC_WRITE_16:
1549 		lba = from_be64(&cdb[2]);
1550 		xfer_len = from_be32(&cdb[10]);
1551 		return bdev_scsi_readwrite(bdev, lun->bdev_desc, lun->io_channel,
1552 					   task, lba, xfer_len,
1553 					   cdb[0] == SPDK_SBC_READ_16);
1554 
1555 	case SPDK_SBC_READ_CAPACITY_10: {
1556 		uint64_t num_blocks = spdk_bdev_get_num_blocks(bdev);
1557 		uint8_t buffer[8];
1558 
1559 		if (num_blocks - 1 > 0xffffffffULL) {
1560 			memset(buffer, 0xff, 4);
1561 		} else {
1562 			to_be32(buffer, num_blocks - 1);
1563 		}
1564 		to_be32(&buffer[4], spdk_bdev_get_data_block_size(bdev));
1565 
1566 		len = spdk_min(task->length, sizeof(buffer));
1567 		if (spdk_scsi_task_scatter_data(task, buffer, len) < 0) {
1568 			break;
1569 		}
1570 
1571 		task->data_transferred = len;
1572 		task->status = SPDK_SCSI_STATUS_GOOD;
1573 		break;
1574 	}
1575 
1576 	case SPDK_SPC_SERVICE_ACTION_IN_16:
1577 		switch (cdb[1] & 0x1f) { /* SERVICE ACTION */
1578 		case SPDK_SBC_SAI_READ_CAPACITY_16: {
1579 			uint8_t buffer[32] = {0};
1580 			uint32_t lbppb, lbppbe;
1581 
1582 			to_be64(&buffer[0], spdk_bdev_get_num_blocks(bdev) - 1);
1583 			to_be32(&buffer[8], spdk_bdev_get_data_block_size(bdev));
1584 			lbppb = spdk_bdev_get_physical_block_size(bdev) / spdk_bdev_get_data_block_size(bdev);
1585 			lbppbe = spdk_u32log2(lbppb);
1586 			if (lbppbe > 0xf) {
1587 				SPDK_ERRLOG("lbppbe(0x%x) > 0xf\n", lbppbe);
1588 			} else {
1589 				buffer[13] = lbppbe;
1590 			}
1591 			/*
1592 			 * Set the TPE bit to 1 to indicate thin provisioning.
1593 			 * The position of TPE bit is the 7th bit in 14th byte
1594 			 * in READ CAPACITY (16) parameter data.
1595 			 */
1596 			if (spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) {
1597 				buffer[14] |= 1 << 7;
1598 			}
1599 
1600 			len = spdk_min(from_be32(&cdb[10]), sizeof(buffer));
1601 			if (spdk_scsi_task_scatter_data(task, buffer, len) < 0) {
1602 				break;
1603 			}
1604 
1605 			task->data_transferred = len;
1606 			task->status = SPDK_SCSI_STATUS_GOOD;
1607 			break;
1608 		}
1609 
1610 		default:
1611 			return SPDK_SCSI_TASK_UNKNOWN;
1612 		}
1613 		break;
1614 
1615 	case SPDK_SBC_SYNCHRONIZE_CACHE_10:
1616 	case SPDK_SBC_SYNCHRONIZE_CACHE_16:
1617 		if (cdb[0] == SPDK_SBC_SYNCHRONIZE_CACHE_10) {
1618 			lba = from_be32(&cdb[2]);
1619 			len = from_be16(&cdb[7]);
1620 		} else {
1621 			lba = from_be64(&cdb[2]);
1622 			len = from_be32(&cdb[10]);
1623 		}
1624 
1625 		if (len == 0) {
1626 			len = spdk_bdev_get_num_blocks(bdev) - lba;
1627 		}
1628 
1629 		return bdev_scsi_sync(bdev, lun->bdev_desc, lun->io_channel, task, lba, len);
1630 		break;
1631 
1632 	case SPDK_SBC_UNMAP:
1633 		return bdev_scsi_unmap(bdev, task);
1634 
1635 	default:
1636 		return SPDK_SCSI_TASK_UNKNOWN;
1637 	}
1638 
1639 	return SPDK_SCSI_TASK_COMPLETE;
1640 }
1641 
1642 static void
1643 bdev_scsi_process_block_resubmit(void *arg)
1644 {
1645 	struct spdk_scsi_task *task = arg;
1646 
1647 	bdev_scsi_process_block(task);
1648 }
1649 
1650 static int
1651 bdev_scsi_check_len(struct spdk_scsi_task *task, int len, int min_len)
1652 {
1653 	if (len >= min_len) {
1654 		return 0;
1655 	}
1656 
1657 	/* INVALID FIELD IN CDB */
1658 	spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1659 				  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1660 				  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1661 				  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1662 	return -1;
1663 }
1664 
1665 static int
1666 bdev_scsi_process_primary(struct spdk_scsi_task *task)
1667 {
1668 	struct spdk_scsi_lun *lun = task->lun;
1669 	struct spdk_bdev *bdev = lun->bdev;
1670 	int alloc_len = -1;
1671 	int data_len = -1;
1672 	uint8_t *cdb = task->cdb;
1673 	uint8_t *data = NULL;
1674 	int rc = 0;
1675 	int pllen, md = 0;
1676 	int llba;
1677 	int dbd, pc, page, subpage;
1678 	int cmd_parsed = 0;
1679 
1680 	switch (cdb[0]) {
1681 	case SPDK_SPC_INQUIRY:
1682 		alloc_len = from_be16(&cdb[3]);
1683 		data_len = spdk_max(4096, alloc_len);
1684 		data = calloc(1, data_len);
1685 		assert(data != NULL);
1686 		rc = bdev_scsi_inquiry(bdev, task, cdb, data, data_len);
1687 		data_len = spdk_min(rc, data_len);
1688 		if (rc < 0) {
1689 			break;
1690 		}
1691 
1692 		SPDK_LOGDUMP(scsi, "INQUIRY", data, data_len);
1693 		break;
1694 
1695 	case SPDK_SPC_REPORT_LUNS: {
1696 		int sel;
1697 
1698 		sel = cdb[2];
1699 		SPDK_DEBUGLOG(scsi, "sel=%x\n", sel);
1700 
1701 		alloc_len = from_be32(&cdb[6]);
1702 		rc = bdev_scsi_check_len(task, alloc_len, 16);
1703 		if (rc < 0) {
1704 			break;
1705 		}
1706 
1707 		data_len = spdk_max(4096, alloc_len);
1708 		data = calloc(1, data_len);
1709 		assert(data != NULL);
1710 		rc = bdev_scsi_report_luns(task->lun, sel, data, data_len);
1711 		data_len = rc;
1712 		if (rc < 0) {
1713 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1714 						  SPDK_SCSI_SENSE_NO_SENSE,
1715 						  SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE,
1716 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1717 			break;
1718 		}
1719 
1720 		SPDK_LOGDUMP(scsi, "REPORT LUNS", data, data_len);
1721 		break;
1722 	}
1723 
1724 	case SPDK_SPC_MODE_SELECT_6:
1725 	case SPDK_SPC_MODE_SELECT_10:
1726 		if (cdb[0] == SPDK_SPC_MODE_SELECT_6) {
1727 			/* MODE_SELECT(6) must have at least a 4 byte header. */
1728 			md = 4;
1729 			pllen = cdb[4];
1730 		} else {
1731 			/* MODE_SELECT(10) must have at least an 8 byte header. */
1732 			md = 8;
1733 			pllen = from_be16(&cdb[7]);
1734 		}
1735 
1736 		if (pllen == 0) {
1737 			break;
1738 		}
1739 
1740 		rc = bdev_scsi_check_len(task, pllen, md);
1741 		if (rc < 0) {
1742 			break;
1743 		}
1744 
1745 		data = spdk_scsi_task_gather_data(task, &rc);
1746 		if (rc < 0) {
1747 			break;
1748 		}
1749 		data_len = rc;
1750 
1751 		rc = bdev_scsi_check_len(task, data_len, spdk_max(pllen, md));
1752 		if (rc < 0) {
1753 			break;
1754 		}
1755 
1756 		rc = pllen;
1757 		data_len = 0;
1758 		break;
1759 
1760 	case SPDK_SPC_MODE_SENSE_6:
1761 		alloc_len = cdb[4];
1762 		md = 6;
1763 	/* FALLTHROUGH */
1764 	case SPDK_SPC_MODE_SENSE_10:
1765 		llba = 0;
1766 
1767 		if (md == 0) {
1768 			alloc_len = from_be16(&cdb[7]);
1769 			llba = !!(cdb[1] & 0x10);
1770 			md = 10;
1771 		}
1772 
1773 		dbd = !!(cdb[1] & 0x8);
1774 		pc = (cdb[2] & 0xc0) >> 6;
1775 		page = cdb[2] & 0x3f;
1776 		subpage = cdb[3];
1777 
1778 		/* First call with no buffer to discover needed buffer size */
1779 		rc = bdev_scsi_mode_sense(bdev, md,
1780 					  cdb, dbd, llba, pc,
1781 					  page, subpage,
1782 					  NULL, task);
1783 		if (rc < 0) {
1784 			break;
1785 		}
1786 
1787 		data_len = rc;
1788 		data = calloc(1, data_len);
1789 		assert(data != NULL);
1790 
1791 		/* First call with no buffer to discover needed buffer size */
1792 		rc = bdev_scsi_mode_sense(bdev, md,
1793 					  cdb, dbd, llba, pc,
1794 					  page, subpage,
1795 					  data, task);
1796 		if (rc < 0) {
1797 			/* INVALID FIELD IN CDB */
1798 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1799 						  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1800 						  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1801 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1802 			break;
1803 		}
1804 		break;
1805 
1806 	case SPDK_SPC_REQUEST_SENSE: {
1807 		int desc;
1808 		int sk, asc, ascq;
1809 
1810 		desc = cdb[1] & 0x1;
1811 		if (desc != 0) {
1812 			/* INVALID FIELD IN CDB */
1813 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1814 						  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1815 						  SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
1816 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1817 			break;
1818 		}
1819 
1820 		alloc_len = cdb[4];
1821 
1822 		/* NO ADDITIONAL SENSE INFORMATION */
1823 		sk = SPDK_SCSI_SENSE_NO_SENSE;
1824 		asc = 0x00;
1825 		ascq = 0x00;
1826 
1827 		spdk_scsi_task_build_sense_data(task, sk, asc, ascq);
1828 
1829 		data_len = task->sense_data_len;
1830 		data = calloc(1, data_len);
1831 		assert(data != NULL);
1832 		memcpy(data, task->sense_data, data_len);
1833 		break;
1834 	}
1835 
1836 	case SPDK_SPC_LOG_SELECT:
1837 		SPDK_DEBUGLOG(scsi, "LOG_SELECT\n");
1838 		cmd_parsed = 1;
1839 	/* FALLTHROUGH */
1840 	case SPDK_SPC_LOG_SENSE:
1841 		if (!cmd_parsed) {
1842 			SPDK_DEBUGLOG(scsi, "LOG_SENSE\n");
1843 		}
1844 
1845 		/* INVALID COMMAND OPERATION CODE */
1846 		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1847 					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1848 					  SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE,
1849 					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1850 		rc = -1;
1851 		break;
1852 
1853 	case SPDK_SPC_TEST_UNIT_READY:
1854 		SPDK_DEBUGLOG(scsi, "TEST_UNIT_READY\n");
1855 		cmd_parsed = 1;
1856 	/* FALLTHROUGH */
1857 	case SPDK_SBC_START_STOP_UNIT:
1858 		if (!cmd_parsed) {
1859 			SPDK_DEBUGLOG(scsi, "START_STOP_UNIT\n");
1860 		}
1861 
1862 		rc = 0;
1863 		break;
1864 
1865 	case SPDK_SPC_PERSISTENT_RESERVE_OUT:
1866 		pllen = from_be32(&cdb[5]);
1867 		rc = bdev_scsi_check_len(task, pllen, 24);
1868 		if (rc < 0) {
1869 			break;
1870 		}
1871 
1872 		data = spdk_scsi_task_gather_data(task, &rc);
1873 		if (rc < 0) {
1874 			break;
1875 		}
1876 		data_len = rc;
1877 		if (data_len < 24) {
1878 			rc = -1;
1879 			break;
1880 		}
1881 
1882 		rc = scsi_pr_out(task, cdb, data, data_len);
1883 		if (rc < 0) {
1884 			break;
1885 		}
1886 		rc = pllen;
1887 		data_len = 0;
1888 		break;
1889 
1890 	case SPDK_SPC_PERSISTENT_RESERVE_IN:
1891 		alloc_len = from_be16(&cdb[7]);
1892 		data_len = alloc_len;
1893 		data = calloc(1, data_len);
1894 		assert(data != NULL);
1895 		rc = scsi_pr_in(task, cdb, data, data_len);
1896 		break;
1897 
1898 	case SPDK_SPC2_RESERVE_6:
1899 	case SPDK_SPC2_RESERVE_10:
1900 		rc = scsi2_reserve(task, cdb);
1901 		if (rc == 0) {
1902 			if (cdb[0] == SPDK_SPC2_RESERVE_10) {
1903 				rc = from_be16(&cdb[7]);
1904 			}
1905 			data_len = 0;
1906 		}
1907 		break;
1908 
1909 	case SPDK_SPC2_RELEASE_6:
1910 	case SPDK_SPC2_RELEASE_10:
1911 		rc = scsi2_release(task);
1912 		break;
1913 
1914 	default:
1915 		return SPDK_SCSI_TASK_UNKNOWN;
1916 	}
1917 
1918 	if (rc >= 0 && data_len > 0) {
1919 		assert(alloc_len >= 0);
1920 		spdk_scsi_task_scatter_data(task, data, spdk_min(alloc_len, data_len));
1921 		rc = spdk_min(data_len, alloc_len);
1922 	}
1923 
1924 	if (rc >= 0) {
1925 		task->data_transferred = rc;
1926 		task->status = SPDK_SCSI_STATUS_GOOD;
1927 	}
1928 
1929 	if (data) {
1930 		free(data);
1931 	}
1932 
1933 	return SPDK_SCSI_TASK_COMPLETE;
1934 }
1935 
1936 int
1937 bdev_scsi_execute(struct spdk_scsi_task *task)
1938 {
1939 	int rc;
1940 
1941 	if ((rc = bdev_scsi_process_block(task)) == SPDK_SCSI_TASK_UNKNOWN) {
1942 		if ((rc = bdev_scsi_process_primary(task)) == SPDK_SCSI_TASK_UNKNOWN) {
1943 			SPDK_DEBUGLOG(scsi, "unsupported SCSI OP=0x%x\n", task->cdb[0]);
1944 			/* INVALID COMMAND OPERATION CODE */
1945 			spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
1946 						  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
1947 						  SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE,
1948 						  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
1949 			return SPDK_SCSI_TASK_COMPLETE;
1950 		}
1951 	}
1952 
1953 	return rc;
1954 }
1955 
1956 static void
1957 bdev_scsi_reset_resubmit(void *arg)
1958 {
1959 	struct spdk_scsi_task *task = arg;
1960 
1961 	bdev_scsi_reset(task);
1962 }
1963 
1964 void
1965 bdev_scsi_reset(struct spdk_scsi_task *task)
1966 {
1967 	struct spdk_scsi_lun *lun = task->lun;
1968 	int rc;
1969 
1970 	rc = spdk_bdev_reset(lun->bdev_desc, lun->io_channel, bdev_scsi_task_complete_reset,
1971 			     task);
1972 	if (rc == -ENOMEM) {
1973 		bdev_scsi_queue_io(task, bdev_scsi_reset_resubmit, task);
1974 	}
1975 }
1976 
1977 bool
1978 bdev_scsi_get_dif_ctx(struct spdk_bdev *bdev, struct spdk_scsi_task *task,
1979 		      struct spdk_dif_ctx *dif_ctx)
1980 {
1981 	uint32_t ref_tag = 0, dif_check_flags = 0, data_offset;
1982 	uint8_t *cdb;
1983 	int rc;
1984 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1985 
1986 	if (spdk_likely(spdk_bdev_get_md_size(bdev) == 0)) {
1987 		return false;
1988 	}
1989 
1990 	cdb = task->cdb;
1991 	data_offset = task->offset;
1992 
1993 	/* We use lower 32 bits of LBA as Reference. Tag */
1994 	switch (cdb[0]) {
1995 	case SPDK_SBC_READ_6:
1996 	case SPDK_SBC_WRITE_6:
1997 		ref_tag = (uint32_t)cdb[1] << 16;
1998 		ref_tag |= (uint32_t)cdb[2] << 8;
1999 		ref_tag |= (uint32_t)cdb[3];
2000 		break;
2001 	case SPDK_SBC_READ_10:
2002 	case SPDK_SBC_WRITE_10:
2003 	case SPDK_SBC_READ_12:
2004 	case SPDK_SBC_WRITE_12:
2005 		ref_tag = from_be32(&cdb[2]);
2006 		break;
2007 	case SPDK_SBC_READ_16:
2008 	case SPDK_SBC_WRITE_16:
2009 		ref_tag = (uint32_t)from_be64(&cdb[2]);
2010 		break;
2011 	default:
2012 		return false;
2013 	}
2014 
2015 	if (spdk_bdev_is_dif_check_enabled(bdev, SPDK_DIF_CHECK_TYPE_REFTAG)) {
2016 		dif_check_flags |= SPDK_DIF_FLAGS_REFTAG_CHECK;
2017 	}
2018 
2019 	if (spdk_bdev_is_dif_check_enabled(bdev, SPDK_DIF_CHECK_TYPE_GUARD)) {
2020 		dif_check_flags |= SPDK_DIF_FLAGS_GUARD_CHECK;
2021 	}
2022 
2023 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2024 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
2025 	rc = spdk_dif_ctx_init(dif_ctx,
2026 			       spdk_bdev_get_block_size(bdev),
2027 			       spdk_bdev_get_md_size(bdev),
2028 			       spdk_bdev_is_md_interleaved(bdev),
2029 			       spdk_bdev_is_dif_head_of_md(bdev),
2030 			       spdk_bdev_get_dif_type(bdev),
2031 			       dif_check_flags,
2032 			       ref_tag, 0, 0, data_offset, 0, &dif_opts);
2033 
2034 	return (rc == 0) ? true : false;
2035 }
2036