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