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