1 /* 2 * QEMU Block driver for iSCSI images 3 * 4 * Copyright (c) 2010-2011 Ronnie Sahlberg <ronniesahlberg@gmail.com> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 #include "config-host.h" 26 27 #include <poll.h> 28 #include <arpa/inet.h> 29 #include "qemu-common.h" 30 #include "qemu-error.h" 31 #include "block_int.h" 32 #include "trace.h" 33 #include "hw/scsi-defs.h" 34 35 #include <iscsi/iscsi.h> 36 #include <iscsi/scsi-lowlevel.h> 37 38 #ifdef __linux__ 39 #include <scsi/sg.h> 40 #include <hw/scsi-defs.h> 41 #endif 42 43 typedef struct IscsiLun { 44 struct iscsi_context *iscsi; 45 int lun; 46 enum scsi_inquiry_peripheral_device_type type; 47 int block_size; 48 uint64_t num_blocks; 49 int events; 50 } IscsiLun; 51 52 typedef struct IscsiAIOCB { 53 BlockDriverAIOCB common; 54 QEMUIOVector *qiov; 55 QEMUBH *bh; 56 IscsiLun *iscsilun; 57 struct scsi_task *task; 58 uint8_t *buf; 59 int status; 60 int canceled; 61 size_t read_size; 62 size_t read_offset; 63 #ifdef __linux__ 64 sg_io_hdr_t *ioh; 65 #endif 66 } IscsiAIOCB; 67 68 struct IscsiTask { 69 IscsiLun *iscsilun; 70 BlockDriverState *bs; 71 int status; 72 int complete; 73 }; 74 75 static void 76 iscsi_bh_cb(void *p) 77 { 78 IscsiAIOCB *acb = p; 79 80 qemu_bh_delete(acb->bh); 81 82 if (acb->canceled == 0) { 83 acb->common.cb(acb->common.opaque, acb->status); 84 } 85 86 if (acb->task != NULL) { 87 scsi_free_scsi_task(acb->task); 88 acb->task = NULL; 89 } 90 91 qemu_aio_release(acb); 92 } 93 94 static void 95 iscsi_schedule_bh(IscsiAIOCB *acb) 96 { 97 if (acb->bh) { 98 return; 99 } 100 acb->bh = qemu_bh_new(iscsi_bh_cb, acb); 101 qemu_bh_schedule(acb->bh); 102 } 103 104 105 static void 106 iscsi_abort_task_cb(struct iscsi_context *iscsi, int status, void *command_data, 107 void *private_data) 108 { 109 IscsiAIOCB *acb = private_data; 110 111 acb->status = -ECANCELED; 112 iscsi_schedule_bh(acb); 113 } 114 115 static void 116 iscsi_aio_cancel(BlockDriverAIOCB *blockacb) 117 { 118 IscsiAIOCB *acb = (IscsiAIOCB *)blockacb; 119 IscsiLun *iscsilun = acb->iscsilun; 120 121 if (acb->status != -EINPROGRESS) { 122 return; 123 } 124 125 acb->canceled = 1; 126 127 /* send a task mgmt call to the target to cancel the task on the target */ 128 iscsi_task_mgmt_abort_task_async(iscsilun->iscsi, acb->task, 129 iscsi_abort_task_cb, acb); 130 131 while (acb->status == -EINPROGRESS) { 132 qemu_aio_wait(); 133 } 134 } 135 136 static AIOPool iscsi_aio_pool = { 137 .aiocb_size = sizeof(IscsiAIOCB), 138 .cancel = iscsi_aio_cancel, 139 }; 140 141 142 static void iscsi_process_read(void *arg); 143 static void iscsi_process_write(void *arg); 144 145 static int iscsi_process_flush(void *arg) 146 { 147 IscsiLun *iscsilun = arg; 148 149 return iscsi_queue_length(iscsilun->iscsi) > 0; 150 } 151 152 static void 153 iscsi_set_events(IscsiLun *iscsilun) 154 { 155 struct iscsi_context *iscsi = iscsilun->iscsi; 156 int ev; 157 158 /* We always register a read handler. */ 159 ev = POLLIN; 160 ev |= iscsi_which_events(iscsi); 161 if (ev != iscsilun->events) { 162 qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), 163 iscsi_process_read, 164 (ev & POLLOUT) ? iscsi_process_write : NULL, 165 iscsi_process_flush, 166 iscsilun); 167 168 } 169 170 /* If we just added an event, the callback might be delayed 171 * unless we call qemu_notify_event(). 172 */ 173 if (ev & ~iscsilun->events) { 174 qemu_notify_event(); 175 } 176 iscsilun->events = ev; 177 } 178 179 static void 180 iscsi_process_read(void *arg) 181 { 182 IscsiLun *iscsilun = arg; 183 struct iscsi_context *iscsi = iscsilun->iscsi; 184 185 iscsi_service(iscsi, POLLIN); 186 iscsi_set_events(iscsilun); 187 } 188 189 static void 190 iscsi_process_write(void *arg) 191 { 192 IscsiLun *iscsilun = arg; 193 struct iscsi_context *iscsi = iscsilun->iscsi; 194 195 iscsi_service(iscsi, POLLOUT); 196 iscsi_set_events(iscsilun); 197 } 198 199 200 static void 201 iscsi_aio_write16_cb(struct iscsi_context *iscsi, int status, 202 void *command_data, void *opaque) 203 { 204 IscsiAIOCB *acb = opaque; 205 206 trace_iscsi_aio_write16_cb(iscsi, status, acb, acb->canceled); 207 208 g_free(acb->buf); 209 210 if (acb->canceled != 0) { 211 return; 212 } 213 214 acb->status = 0; 215 if (status < 0) { 216 error_report("Failed to write16 data to iSCSI lun. %s", 217 iscsi_get_error(iscsi)); 218 acb->status = -EIO; 219 } 220 221 iscsi_schedule_bh(acb); 222 } 223 224 static int64_t sector_qemu2lun(int64_t sector, IscsiLun *iscsilun) 225 { 226 return sector * BDRV_SECTOR_SIZE / iscsilun->block_size; 227 } 228 229 static BlockDriverAIOCB * 230 iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num, 231 QEMUIOVector *qiov, int nb_sectors, 232 BlockDriverCompletionFunc *cb, 233 void *opaque) 234 { 235 IscsiLun *iscsilun = bs->opaque; 236 struct iscsi_context *iscsi = iscsilun->iscsi; 237 IscsiAIOCB *acb; 238 size_t size; 239 uint32_t num_sectors; 240 uint64_t lba; 241 struct iscsi_data data; 242 243 acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque); 244 trace_iscsi_aio_writev(iscsi, sector_num, nb_sectors, opaque, acb); 245 246 acb->iscsilun = iscsilun; 247 acb->qiov = qiov; 248 249 acb->canceled = 0; 250 acb->bh = NULL; 251 acb->status = -EINPROGRESS; 252 253 /* XXX we should pass the iovec to write16 to avoid the extra copy */ 254 /* this will allow us to get rid of 'buf' completely */ 255 size = nb_sectors * BDRV_SECTOR_SIZE; 256 acb->buf = g_malloc(size); 257 qemu_iovec_to_buf(acb->qiov, 0, acb->buf, size); 258 259 acb->task = malloc(sizeof(struct scsi_task)); 260 if (acb->task == NULL) { 261 error_report("iSCSI: Failed to allocate task for scsi WRITE16 " 262 "command. %s", iscsi_get_error(iscsi)); 263 qemu_aio_release(acb); 264 return NULL; 265 } 266 memset(acb->task, 0, sizeof(struct scsi_task)); 267 268 acb->task->xfer_dir = SCSI_XFER_WRITE; 269 acb->task->cdb_size = 16; 270 acb->task->cdb[0] = 0x8a; 271 if (!(bs->open_flags & BDRV_O_CACHE_WB)) { 272 /* set FUA on writes when cache mode is write through */ 273 acb->task->cdb[1] |= 0x04; 274 } 275 lba = sector_qemu2lun(sector_num, iscsilun); 276 *(uint32_t *)&acb->task->cdb[2] = htonl(lba >> 32); 277 *(uint32_t *)&acb->task->cdb[6] = htonl(lba & 0xffffffff); 278 num_sectors = size / iscsilun->block_size; 279 *(uint32_t *)&acb->task->cdb[10] = htonl(num_sectors); 280 acb->task->expxferlen = size; 281 282 data.data = acb->buf; 283 data.size = size; 284 285 if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, 286 iscsi_aio_write16_cb, 287 &data, 288 acb) != 0) { 289 scsi_free_scsi_task(acb->task); 290 g_free(acb->buf); 291 qemu_aio_release(acb); 292 return NULL; 293 } 294 295 iscsi_set_events(iscsilun); 296 297 return &acb->common; 298 } 299 300 static void 301 iscsi_aio_read16_cb(struct iscsi_context *iscsi, int status, 302 void *command_data, void *opaque) 303 { 304 IscsiAIOCB *acb = opaque; 305 306 trace_iscsi_aio_read16_cb(iscsi, status, acb, acb->canceled); 307 308 if (acb->canceled != 0) { 309 return; 310 } 311 312 acb->status = 0; 313 if (status != 0) { 314 error_report("Failed to read16 data from iSCSI lun. %s", 315 iscsi_get_error(iscsi)); 316 acb->status = -EIO; 317 } 318 319 iscsi_schedule_bh(acb); 320 } 321 322 static BlockDriverAIOCB * 323 iscsi_aio_readv(BlockDriverState *bs, int64_t sector_num, 324 QEMUIOVector *qiov, int nb_sectors, 325 BlockDriverCompletionFunc *cb, 326 void *opaque) 327 { 328 IscsiLun *iscsilun = bs->opaque; 329 struct iscsi_context *iscsi = iscsilun->iscsi; 330 IscsiAIOCB *acb; 331 size_t qemu_read_size; 332 int i; 333 uint64_t lba; 334 uint32_t num_sectors; 335 336 qemu_read_size = BDRV_SECTOR_SIZE * (size_t)nb_sectors; 337 338 acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque); 339 trace_iscsi_aio_readv(iscsi, sector_num, nb_sectors, opaque, acb); 340 341 acb->iscsilun = iscsilun; 342 acb->qiov = qiov; 343 344 acb->canceled = 0; 345 acb->bh = NULL; 346 acb->status = -EINPROGRESS; 347 acb->read_size = qemu_read_size; 348 acb->buf = NULL; 349 350 /* If LUN blocksize is bigger than BDRV_BLOCK_SIZE a read from QEMU 351 * may be misaligned to the LUN, so we may need to read some extra 352 * data. 353 */ 354 acb->read_offset = 0; 355 if (iscsilun->block_size > BDRV_SECTOR_SIZE) { 356 uint64_t bdrv_offset = BDRV_SECTOR_SIZE * sector_num; 357 358 acb->read_offset = bdrv_offset % iscsilun->block_size; 359 } 360 361 num_sectors = (qemu_read_size + iscsilun->block_size 362 + acb->read_offset - 1) 363 / iscsilun->block_size; 364 365 acb->task = malloc(sizeof(struct scsi_task)); 366 if (acb->task == NULL) { 367 error_report("iSCSI: Failed to allocate task for scsi READ16 " 368 "command. %s", iscsi_get_error(iscsi)); 369 qemu_aio_release(acb); 370 return NULL; 371 } 372 memset(acb->task, 0, sizeof(struct scsi_task)); 373 374 acb->task->xfer_dir = SCSI_XFER_READ; 375 lba = sector_qemu2lun(sector_num, iscsilun); 376 acb->task->expxferlen = qemu_read_size; 377 378 switch (iscsilun->type) { 379 case TYPE_DISK: 380 acb->task->cdb_size = 16; 381 acb->task->cdb[0] = 0x88; 382 *(uint32_t *)&acb->task->cdb[2] = htonl(lba >> 32); 383 *(uint32_t *)&acb->task->cdb[6] = htonl(lba & 0xffffffff); 384 *(uint32_t *)&acb->task->cdb[10] = htonl(num_sectors); 385 break; 386 default: 387 acb->task->cdb_size = 10; 388 acb->task->cdb[0] = 0x28; 389 *(uint32_t *)&acb->task->cdb[2] = htonl(lba); 390 *(uint16_t *)&acb->task->cdb[7] = htons(num_sectors); 391 break; 392 } 393 394 if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, 395 iscsi_aio_read16_cb, 396 NULL, 397 acb) != 0) { 398 scsi_free_scsi_task(acb->task); 399 qemu_aio_release(acb); 400 return NULL; 401 } 402 403 for (i = 0; i < acb->qiov->niov; i++) { 404 scsi_task_add_data_in_buffer(acb->task, 405 acb->qiov->iov[i].iov_len, 406 acb->qiov->iov[i].iov_base); 407 } 408 409 iscsi_set_events(iscsilun); 410 411 return &acb->common; 412 } 413 414 415 static void 416 iscsi_synccache10_cb(struct iscsi_context *iscsi, int status, 417 void *command_data, void *opaque) 418 { 419 IscsiAIOCB *acb = opaque; 420 421 if (acb->canceled != 0) { 422 return; 423 } 424 425 acb->status = 0; 426 if (status < 0) { 427 error_report("Failed to sync10 data on iSCSI lun. %s", 428 iscsi_get_error(iscsi)); 429 acb->status = -EIO; 430 } 431 432 iscsi_schedule_bh(acb); 433 } 434 435 static BlockDriverAIOCB * 436 iscsi_aio_flush(BlockDriverState *bs, 437 BlockDriverCompletionFunc *cb, void *opaque) 438 { 439 IscsiLun *iscsilun = bs->opaque; 440 struct iscsi_context *iscsi = iscsilun->iscsi; 441 IscsiAIOCB *acb; 442 443 acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque); 444 445 acb->iscsilun = iscsilun; 446 acb->canceled = 0; 447 acb->bh = NULL; 448 acb->status = -EINPROGRESS; 449 450 acb->task = iscsi_synchronizecache10_task(iscsi, iscsilun->lun, 451 0, 0, 0, 0, 452 iscsi_synccache10_cb, 453 acb); 454 if (acb->task == NULL) { 455 error_report("iSCSI: Failed to send synchronizecache10 command. %s", 456 iscsi_get_error(iscsi)); 457 qemu_aio_release(acb); 458 return NULL; 459 } 460 461 iscsi_set_events(iscsilun); 462 463 return &acb->common; 464 } 465 466 static void 467 iscsi_unmap_cb(struct iscsi_context *iscsi, int status, 468 void *command_data, void *opaque) 469 { 470 IscsiAIOCB *acb = opaque; 471 472 if (acb->canceled != 0) { 473 return; 474 } 475 476 acb->status = 0; 477 if (status < 0) { 478 error_report("Failed to unmap data on iSCSI lun. %s", 479 iscsi_get_error(iscsi)); 480 acb->status = -EIO; 481 } 482 483 iscsi_schedule_bh(acb); 484 } 485 486 static BlockDriverAIOCB * 487 iscsi_aio_discard(BlockDriverState *bs, 488 int64_t sector_num, int nb_sectors, 489 BlockDriverCompletionFunc *cb, void *opaque) 490 { 491 IscsiLun *iscsilun = bs->opaque; 492 struct iscsi_context *iscsi = iscsilun->iscsi; 493 IscsiAIOCB *acb; 494 struct unmap_list list[1]; 495 496 acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque); 497 498 acb->iscsilun = iscsilun; 499 acb->canceled = 0; 500 acb->bh = NULL; 501 acb->status = -EINPROGRESS; 502 503 list[0].lba = sector_qemu2lun(sector_num, iscsilun); 504 list[0].num = nb_sectors * BDRV_SECTOR_SIZE / iscsilun->block_size; 505 506 acb->task = iscsi_unmap_task(iscsi, iscsilun->lun, 507 0, 0, &list[0], 1, 508 iscsi_unmap_cb, 509 acb); 510 if (acb->task == NULL) { 511 error_report("iSCSI: Failed to send unmap command. %s", 512 iscsi_get_error(iscsi)); 513 qemu_aio_release(acb); 514 return NULL; 515 } 516 517 iscsi_set_events(iscsilun); 518 519 return &acb->common; 520 } 521 522 #ifdef __linux__ 523 static void 524 iscsi_aio_ioctl_cb(struct iscsi_context *iscsi, int status, 525 void *command_data, void *opaque) 526 { 527 IscsiAIOCB *acb = opaque; 528 529 if (acb->canceled != 0) { 530 return; 531 } 532 533 acb->status = 0; 534 if (status < 0) { 535 error_report("Failed to ioctl(SG_IO) to iSCSI lun. %s", 536 iscsi_get_error(iscsi)); 537 acb->status = -EIO; 538 } 539 540 acb->ioh->driver_status = 0; 541 acb->ioh->host_status = 0; 542 acb->ioh->resid = 0; 543 544 #define SG_ERR_DRIVER_SENSE 0x08 545 546 if (status == SCSI_STATUS_CHECK_CONDITION && acb->task->datain.size >= 2) { 547 int ss; 548 549 acb->ioh->driver_status |= SG_ERR_DRIVER_SENSE; 550 551 acb->ioh->sb_len_wr = acb->task->datain.size - 2; 552 ss = (acb->ioh->mx_sb_len >= acb->ioh->sb_len_wr) ? 553 acb->ioh->mx_sb_len : acb->ioh->sb_len_wr; 554 memcpy(acb->ioh->sbp, &acb->task->datain.data[2], ss); 555 } 556 557 iscsi_schedule_bh(acb); 558 } 559 560 static BlockDriverAIOCB *iscsi_aio_ioctl(BlockDriverState *bs, 561 unsigned long int req, void *buf, 562 BlockDriverCompletionFunc *cb, void *opaque) 563 { 564 IscsiLun *iscsilun = bs->opaque; 565 struct iscsi_context *iscsi = iscsilun->iscsi; 566 struct iscsi_data data; 567 IscsiAIOCB *acb; 568 569 assert(req == SG_IO); 570 571 acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque); 572 573 acb->iscsilun = iscsilun; 574 acb->canceled = 0; 575 acb->bh = NULL; 576 acb->status = -EINPROGRESS; 577 acb->buf = NULL; 578 acb->ioh = buf; 579 580 acb->task = malloc(sizeof(struct scsi_task)); 581 if (acb->task == NULL) { 582 error_report("iSCSI: Failed to allocate task for scsi command. %s", 583 iscsi_get_error(iscsi)); 584 qemu_aio_release(acb); 585 return NULL; 586 } 587 memset(acb->task, 0, sizeof(struct scsi_task)); 588 589 switch (acb->ioh->dxfer_direction) { 590 case SG_DXFER_TO_DEV: 591 acb->task->xfer_dir = SCSI_XFER_WRITE; 592 break; 593 case SG_DXFER_FROM_DEV: 594 acb->task->xfer_dir = SCSI_XFER_READ; 595 break; 596 default: 597 acb->task->xfer_dir = SCSI_XFER_NONE; 598 break; 599 } 600 601 acb->task->cdb_size = acb->ioh->cmd_len; 602 memcpy(&acb->task->cdb[0], acb->ioh->cmdp, acb->ioh->cmd_len); 603 acb->task->expxferlen = acb->ioh->dxfer_len; 604 605 if (acb->task->xfer_dir == SCSI_XFER_WRITE) { 606 data.data = acb->ioh->dxferp; 607 data.size = acb->ioh->dxfer_len; 608 } 609 if (iscsi_scsi_command_async(iscsi, iscsilun->lun, acb->task, 610 iscsi_aio_ioctl_cb, 611 (acb->task->xfer_dir == SCSI_XFER_WRITE) ? 612 &data : NULL, 613 acb) != 0) { 614 scsi_free_scsi_task(acb->task); 615 qemu_aio_release(acb); 616 return NULL; 617 } 618 619 /* tell libiscsi to read straight into the buffer we got from ioctl */ 620 if (acb->task->xfer_dir == SCSI_XFER_READ) { 621 scsi_task_add_data_in_buffer(acb->task, 622 acb->ioh->dxfer_len, 623 acb->ioh->dxferp); 624 } 625 626 iscsi_set_events(iscsilun); 627 628 return &acb->common; 629 } 630 631 static int iscsi_ioctl(BlockDriverState *bs, unsigned long int req, void *buf) 632 { 633 IscsiLun *iscsilun = bs->opaque; 634 635 switch (req) { 636 case SG_GET_VERSION_NUM: 637 *(int *)buf = 30000; 638 break; 639 case SG_GET_SCSI_ID: 640 ((struct sg_scsi_id *)buf)->scsi_type = iscsilun->type; 641 break; 642 default: 643 return -1; 644 } 645 return 0; 646 } 647 #endif 648 649 static int64_t 650 iscsi_getlength(BlockDriverState *bs) 651 { 652 IscsiLun *iscsilun = bs->opaque; 653 int64_t len; 654 655 len = iscsilun->num_blocks; 656 len *= iscsilun->block_size; 657 658 return len; 659 } 660 661 static void 662 iscsi_readcapacity16_cb(struct iscsi_context *iscsi, int status, 663 void *command_data, void *opaque) 664 { 665 struct IscsiTask *itask = opaque; 666 struct scsi_readcapacity16 *rc16; 667 struct scsi_task *task = command_data; 668 669 if (status != 0) { 670 error_report("iSCSI: Failed to read capacity of iSCSI lun. %s", 671 iscsi_get_error(iscsi)); 672 itask->status = 1; 673 itask->complete = 1; 674 scsi_free_scsi_task(task); 675 return; 676 } 677 678 rc16 = scsi_datain_unmarshall(task); 679 if (rc16 == NULL) { 680 error_report("iSCSI: Failed to unmarshall readcapacity16 data."); 681 itask->status = 1; 682 itask->complete = 1; 683 scsi_free_scsi_task(task); 684 return; 685 } 686 687 itask->iscsilun->block_size = rc16->block_length; 688 itask->iscsilun->num_blocks = rc16->returned_lba + 1; 689 itask->bs->total_sectors = itask->iscsilun->num_blocks * 690 itask->iscsilun->block_size / BDRV_SECTOR_SIZE ; 691 692 itask->status = 0; 693 itask->complete = 1; 694 scsi_free_scsi_task(task); 695 } 696 697 static void 698 iscsi_readcapacity10_cb(struct iscsi_context *iscsi, int status, 699 void *command_data, void *opaque) 700 { 701 struct IscsiTask *itask = opaque; 702 struct scsi_readcapacity10 *rc10; 703 struct scsi_task *task = command_data; 704 705 if (status != 0) { 706 error_report("iSCSI: Failed to read capacity of iSCSI lun. %s", 707 iscsi_get_error(iscsi)); 708 itask->status = 1; 709 itask->complete = 1; 710 scsi_free_scsi_task(task); 711 return; 712 } 713 714 rc10 = scsi_datain_unmarshall(task); 715 if (rc10 == NULL) { 716 error_report("iSCSI: Failed to unmarshall readcapacity10 data."); 717 itask->status = 1; 718 itask->complete = 1; 719 scsi_free_scsi_task(task); 720 return; 721 } 722 723 itask->iscsilun->block_size = rc10->block_size; 724 if (rc10->lba == 0) { 725 /* blank disk loaded */ 726 itask->iscsilun->num_blocks = 0; 727 } else { 728 itask->iscsilun->num_blocks = rc10->lba + 1; 729 } 730 itask->bs->total_sectors = itask->iscsilun->num_blocks * 731 itask->iscsilun->block_size / BDRV_SECTOR_SIZE ; 732 733 itask->status = 0; 734 itask->complete = 1; 735 scsi_free_scsi_task(task); 736 } 737 738 static void 739 iscsi_inquiry_cb(struct iscsi_context *iscsi, int status, void *command_data, 740 void *opaque) 741 { 742 struct IscsiTask *itask = opaque; 743 struct scsi_task *task = command_data; 744 struct scsi_inquiry_standard *inq; 745 746 if (status != 0) { 747 itask->status = 1; 748 itask->complete = 1; 749 scsi_free_scsi_task(task); 750 return; 751 } 752 753 inq = scsi_datain_unmarshall(task); 754 if (inq == NULL) { 755 error_report("iSCSI: Failed to unmarshall inquiry data."); 756 itask->status = 1; 757 itask->complete = 1; 758 scsi_free_scsi_task(task); 759 return; 760 } 761 762 itask->iscsilun->type = inq->periperal_device_type; 763 764 scsi_free_scsi_task(task); 765 766 switch (itask->iscsilun->type) { 767 case TYPE_DISK: 768 task = iscsi_readcapacity16_task(iscsi, itask->iscsilun->lun, 769 iscsi_readcapacity16_cb, opaque); 770 if (task == NULL) { 771 error_report("iSCSI: failed to send readcapacity16 command."); 772 itask->status = 1; 773 itask->complete = 1; 774 return; 775 } 776 break; 777 case TYPE_ROM: 778 task = iscsi_readcapacity10_task(iscsi, itask->iscsilun->lun, 779 0, 0, 780 iscsi_readcapacity10_cb, opaque); 781 if (task == NULL) { 782 error_report("iSCSI: failed to send readcapacity16 command."); 783 itask->status = 1; 784 itask->complete = 1; 785 return; 786 } 787 break; 788 default: 789 itask->status = 0; 790 itask->complete = 1; 791 } 792 } 793 794 static void 795 iscsi_connect_cb(struct iscsi_context *iscsi, int status, void *command_data, 796 void *opaque) 797 { 798 struct IscsiTask *itask = opaque; 799 struct scsi_task *task; 800 801 if (status != 0) { 802 itask->status = 1; 803 itask->complete = 1; 804 return; 805 } 806 807 task = iscsi_inquiry_task(iscsi, itask->iscsilun->lun, 808 0, 0, 36, 809 iscsi_inquiry_cb, opaque); 810 if (task == NULL) { 811 error_report("iSCSI: failed to send inquiry command."); 812 itask->status = 1; 813 itask->complete = 1; 814 return; 815 } 816 } 817 818 static int parse_chap(struct iscsi_context *iscsi, const char *target) 819 { 820 QemuOptsList *list; 821 QemuOpts *opts; 822 const char *user = NULL; 823 const char *password = NULL; 824 825 list = qemu_find_opts("iscsi"); 826 if (!list) { 827 return 0; 828 } 829 830 opts = qemu_opts_find(list, target); 831 if (opts == NULL) { 832 opts = QTAILQ_FIRST(&list->head); 833 if (!opts) { 834 return 0; 835 } 836 } 837 838 user = qemu_opt_get(opts, "user"); 839 if (!user) { 840 return 0; 841 } 842 843 password = qemu_opt_get(opts, "password"); 844 if (!password) { 845 error_report("CHAP username specified but no password was given"); 846 return -1; 847 } 848 849 if (iscsi_set_initiator_username_pwd(iscsi, user, password)) { 850 error_report("Failed to set initiator username and password"); 851 return -1; 852 } 853 854 return 0; 855 } 856 857 static void parse_header_digest(struct iscsi_context *iscsi, const char *target) 858 { 859 QemuOptsList *list; 860 QemuOpts *opts; 861 const char *digest = NULL; 862 863 list = qemu_find_opts("iscsi"); 864 if (!list) { 865 return; 866 } 867 868 opts = qemu_opts_find(list, target); 869 if (opts == NULL) { 870 opts = QTAILQ_FIRST(&list->head); 871 if (!opts) { 872 return; 873 } 874 } 875 876 digest = qemu_opt_get(opts, "header-digest"); 877 if (!digest) { 878 return; 879 } 880 881 if (!strcmp(digest, "CRC32C")) { 882 iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C); 883 } else if (!strcmp(digest, "NONE")) { 884 iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE); 885 } else if (!strcmp(digest, "CRC32C-NONE")) { 886 iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_CRC32C_NONE); 887 } else if (!strcmp(digest, "NONE-CRC32C")) { 888 iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C); 889 } else { 890 error_report("Invalid header-digest setting : %s", digest); 891 } 892 } 893 894 static char *parse_initiator_name(const char *target) 895 { 896 QemuOptsList *list; 897 QemuOpts *opts; 898 const char *name = NULL; 899 const char *iscsi_name = qemu_get_vm_name(); 900 901 list = qemu_find_opts("iscsi"); 902 if (list) { 903 opts = qemu_opts_find(list, target); 904 if (!opts) { 905 opts = QTAILQ_FIRST(&list->head); 906 } 907 if (opts) { 908 name = qemu_opt_get(opts, "initiator-name"); 909 } 910 } 911 912 if (name) { 913 return g_strdup(name); 914 } else { 915 return g_strdup_printf("iqn.2008-11.org.linux-kvm%s%s", 916 iscsi_name ? ":" : "", 917 iscsi_name ? iscsi_name : ""); 918 } 919 } 920 921 /* 922 * We support iscsi url's on the form 923 * iscsi://[<username>%<password>@]<host>[:<port>]/<targetname>/<lun> 924 */ 925 static int iscsi_open(BlockDriverState *bs, const char *filename, int flags) 926 { 927 IscsiLun *iscsilun = bs->opaque; 928 struct iscsi_context *iscsi = NULL; 929 struct iscsi_url *iscsi_url = NULL; 930 struct IscsiTask task; 931 char *initiator_name = NULL; 932 int ret; 933 934 if ((BDRV_SECTOR_SIZE % 512) != 0) { 935 error_report("iSCSI: Invalid BDRV_SECTOR_SIZE. " 936 "BDRV_SECTOR_SIZE(%lld) is not a multiple " 937 "of 512", BDRV_SECTOR_SIZE); 938 return -EINVAL; 939 } 940 941 iscsi_url = iscsi_parse_full_url(iscsi, filename); 942 if (iscsi_url == NULL) { 943 error_report("Failed to parse URL : %s %s", filename, 944 iscsi_get_error(iscsi)); 945 ret = -EINVAL; 946 goto out; 947 } 948 949 memset(iscsilun, 0, sizeof(IscsiLun)); 950 951 initiator_name = parse_initiator_name(iscsi_url->target); 952 953 iscsi = iscsi_create_context(initiator_name); 954 if (iscsi == NULL) { 955 error_report("iSCSI: Failed to create iSCSI context."); 956 ret = -ENOMEM; 957 goto out; 958 } 959 960 if (iscsi_set_targetname(iscsi, iscsi_url->target)) { 961 error_report("iSCSI: Failed to set target name."); 962 ret = -EINVAL; 963 goto out; 964 } 965 966 if (iscsi_url->user != NULL) { 967 ret = iscsi_set_initiator_username_pwd(iscsi, iscsi_url->user, 968 iscsi_url->passwd); 969 if (ret != 0) { 970 error_report("Failed to set initiator username and password"); 971 ret = -EINVAL; 972 goto out; 973 } 974 } 975 976 /* check if we got CHAP username/password via the options */ 977 if (parse_chap(iscsi, iscsi_url->target) != 0) { 978 error_report("iSCSI: Failed to set CHAP user/password"); 979 ret = -EINVAL; 980 goto out; 981 } 982 983 if (iscsi_set_session_type(iscsi, ISCSI_SESSION_NORMAL) != 0) { 984 error_report("iSCSI: Failed to set session type to normal."); 985 ret = -EINVAL; 986 goto out; 987 } 988 989 iscsi_set_header_digest(iscsi, ISCSI_HEADER_DIGEST_NONE_CRC32C); 990 991 /* check if we got HEADER_DIGEST via the options */ 992 parse_header_digest(iscsi, iscsi_url->target); 993 994 task.iscsilun = iscsilun; 995 task.status = 0; 996 task.complete = 0; 997 task.bs = bs; 998 999 iscsilun->iscsi = iscsi; 1000 iscsilun->lun = iscsi_url->lun; 1001 1002 if (iscsi_full_connect_async(iscsi, iscsi_url->portal, iscsi_url->lun, 1003 iscsi_connect_cb, &task) 1004 != 0) { 1005 error_report("iSCSI: Failed to start async connect."); 1006 ret = -EINVAL; 1007 goto out; 1008 } 1009 1010 while (!task.complete) { 1011 iscsi_set_events(iscsilun); 1012 qemu_aio_wait(); 1013 } 1014 if (task.status != 0) { 1015 error_report("iSCSI: Failed to connect to LUN : %s", 1016 iscsi_get_error(iscsi)); 1017 ret = -EINVAL; 1018 goto out; 1019 } 1020 1021 /* Medium changer or tape. We dont have any emulation for this so this must 1022 * be sg ioctl compatible. We force it to be sg, otherwise qemu will try 1023 * to read from the device to guess the image format. 1024 */ 1025 if (iscsilun->type == TYPE_MEDIUM_CHANGER || 1026 iscsilun->type == TYPE_TAPE) { 1027 bs->sg = 1; 1028 } 1029 1030 ret = 0; 1031 1032 out: 1033 if (initiator_name != NULL) { 1034 g_free(initiator_name); 1035 } 1036 if (iscsi_url != NULL) { 1037 iscsi_destroy_url(iscsi_url); 1038 } 1039 1040 if (ret) { 1041 if (iscsi != NULL) { 1042 iscsi_destroy_context(iscsi); 1043 } 1044 memset(iscsilun, 0, sizeof(IscsiLun)); 1045 } 1046 return ret; 1047 } 1048 1049 static void iscsi_close(BlockDriverState *bs) 1050 { 1051 IscsiLun *iscsilun = bs->opaque; 1052 struct iscsi_context *iscsi = iscsilun->iscsi; 1053 1054 qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), NULL, NULL, NULL, NULL); 1055 iscsi_destroy_context(iscsi); 1056 memset(iscsilun, 0, sizeof(IscsiLun)); 1057 } 1058 1059 static BlockDriver bdrv_iscsi = { 1060 .format_name = "iscsi", 1061 .protocol_name = "iscsi", 1062 1063 .instance_size = sizeof(IscsiLun), 1064 .bdrv_file_open = iscsi_open, 1065 .bdrv_close = iscsi_close, 1066 1067 .bdrv_getlength = iscsi_getlength, 1068 1069 .bdrv_aio_readv = iscsi_aio_readv, 1070 .bdrv_aio_writev = iscsi_aio_writev, 1071 .bdrv_aio_flush = iscsi_aio_flush, 1072 1073 .bdrv_aio_discard = iscsi_aio_discard, 1074 1075 #ifdef __linux__ 1076 .bdrv_ioctl = iscsi_ioctl, 1077 .bdrv_aio_ioctl = iscsi_aio_ioctl, 1078 #endif 1079 }; 1080 1081 static void iscsi_block_init(void) 1082 { 1083 bdrv_register(&bdrv_iscsi); 1084 } 1085 1086 block_init(iscsi_block_init); 1087