Commit c87c0672936a5b825c0b95bb1d7f5d6dc92294e4
1 parent
f1b2f712
remove bdrv_aio_read/bdrv_aio_write (Christoph Hellwig)
Always use the vectored APIs to reduce code churn once we switch the BlockDriver API to be vectored. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7019 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
6 changed files
with
119 additions
and
90 deletions
block-qcow.c
| ... | ... | @@ -530,6 +530,8 @@ typedef struct QCowAIOCB { |
| 530 | 530 | int n; |
| 531 | 531 | uint64_t cluster_offset; |
| 532 | 532 | uint8_t *cluster_data; |
| 533 | + struct iovec hd_iov; | |
| 534 | + QEMUIOVector hd_qiov; | |
| 533 | 535 | BlockDriverAIOCB *hd_aiocb; |
| 534 | 536 | } QCowAIOCB; |
| 535 | 537 | |
| ... | ... | @@ -584,8 +586,11 @@ static void qcow_aio_read_cb(void *opaque, int ret) |
| 584 | 586 | if (!acb->cluster_offset) { |
| 585 | 587 | if (bs->backing_hd) { |
| 586 | 588 | /* read from the base image */ |
| 587 | - acb->hd_aiocb = bdrv_aio_read(bs->backing_hd, | |
| 588 | - acb->sector_num, acb->buf, acb->n, qcow_aio_read_cb, acb); | |
| 589 | + acb->hd_iov.iov_base = acb->buf; | |
| 590 | + acb->hd_iov.iov_len = acb->n * 512; | |
| 591 | + qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); | |
| 592 | + acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num, | |
| 593 | + &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb); | |
| 589 | 594 | if (acb->hd_aiocb == NULL) |
| 590 | 595 | goto fail; |
| 591 | 596 | } else { |
| ... | ... | @@ -605,9 +610,12 @@ static void qcow_aio_read_cb(void *opaque, int ret) |
| 605 | 610 | ret = -EIO; |
| 606 | 611 | goto fail; |
| 607 | 612 | } |
| 608 | - acb->hd_aiocb = bdrv_aio_read(s->hd, | |
| 613 | + acb->hd_iov.iov_base = acb->buf; | |
| 614 | + acb->hd_iov.iov_len = acb->n * 512; | |
| 615 | + qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); | |
| 616 | + acb->hd_aiocb = bdrv_aio_readv(s->hd, | |
| 609 | 617 | (acb->cluster_offset >> 9) + index_in_cluster, |
| 610 | - acb->buf, acb->n, qcow_aio_read_cb, acb); | |
| 618 | + &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb); | |
| 611 | 619 | if (acb->hd_aiocb == NULL) |
| 612 | 620 | goto fail; |
| 613 | 621 | } |
| ... | ... | @@ -687,10 +695,14 @@ static void qcow_aio_write_cb(void *opaque, int ret) |
| 687 | 695 | } else { |
| 688 | 696 | src_buf = acb->buf; |
| 689 | 697 | } |
| 690 | - acb->hd_aiocb = bdrv_aio_write(s->hd, | |
| 691 | - (cluster_offset >> 9) + index_in_cluster, | |
| 692 | - src_buf, acb->n, | |
| 693 | - qcow_aio_write_cb, acb); | |
| 698 | + | |
| 699 | + acb->hd_iov.iov_base = (void *)src_buf; | |
| 700 | + acb->hd_iov.iov_len = acb->n * 512; | |
| 701 | + qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); | |
| 702 | + acb->hd_aiocb = bdrv_aio_writev(s->hd, | |
| 703 | + (cluster_offset >> 9) + index_in_cluster, | |
| 704 | + &acb->hd_qiov, acb->n, | |
| 705 | + qcow_aio_write_cb, acb); | |
| 694 | 706 | if (acb->hd_aiocb == NULL) |
| 695 | 707 | goto fail; |
| 696 | 708 | } | ... | ... |
block-qcow2.c
| ... | ... | @@ -1270,6 +1270,8 @@ typedef struct QCowAIOCB { |
| 1270 | 1270 | uint64_t cluster_offset; |
| 1271 | 1271 | uint8_t *cluster_data; |
| 1272 | 1272 | BlockDriverAIOCB *hd_aiocb; |
| 1273 | + struct iovec hd_iov; | |
| 1274 | + QEMUIOVector hd_qiov; | |
| 1273 | 1275 | QEMUBH *bh; |
| 1274 | 1276 | QCowL2Meta l2meta; |
| 1275 | 1277 | } QCowAIOCB; |
| ... | ... | @@ -1347,8 +1349,12 @@ fail: |
| 1347 | 1349 | n1 = backing_read1(bs->backing_hd, acb->sector_num, |
| 1348 | 1350 | acb->buf, acb->n); |
| 1349 | 1351 | if (n1 > 0) { |
| 1350 | - acb->hd_aiocb = bdrv_aio_read(bs->backing_hd, acb->sector_num, | |
| 1351 | - acb->buf, acb->n, qcow_aio_read_cb, acb); | |
| 1352 | + acb->hd_iov.iov_base = acb->buf; | |
| 1353 | + acb->hd_iov.iov_len = acb->n * 512; | |
| 1354 | + qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); | |
| 1355 | + acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num, | |
| 1356 | + &acb->hd_qiov, acb->n, | |
| 1357 | + qcow_aio_read_cb, acb); | |
| 1352 | 1358 | if (acb->hd_aiocb == NULL) |
| 1353 | 1359 | goto fail; |
| 1354 | 1360 | } else { |
| ... | ... | @@ -1377,9 +1383,13 @@ fail: |
| 1377 | 1383 | ret = -EIO; |
| 1378 | 1384 | goto fail; |
| 1379 | 1385 | } |
| 1380 | - acb->hd_aiocb = bdrv_aio_read(s->hd, | |
| 1386 | + | |
| 1387 | + acb->hd_iov.iov_base = acb->buf; | |
| 1388 | + acb->hd_iov.iov_len = acb->n * 512; | |
| 1389 | + qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); | |
| 1390 | + acb->hd_aiocb = bdrv_aio_readv(s->hd, | |
| 1381 | 1391 | (acb->cluster_offset >> 9) + index_in_cluster, |
| 1382 | - acb->buf, acb->n, qcow_aio_read_cb, acb); | |
| 1392 | + &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb); | |
| 1383 | 1393 | if (acb->hd_aiocb == NULL) |
| 1384 | 1394 | goto fail; |
| 1385 | 1395 | } |
| ... | ... | @@ -1476,10 +1486,13 @@ static void qcow_aio_write_cb(void *opaque, int ret) |
| 1476 | 1486 | } else { |
| 1477 | 1487 | src_buf = acb->buf; |
| 1478 | 1488 | } |
| 1479 | - acb->hd_aiocb = bdrv_aio_write(s->hd, | |
| 1480 | - (acb->cluster_offset >> 9) + index_in_cluster, | |
| 1481 | - src_buf, acb->n, | |
| 1482 | - qcow_aio_write_cb, acb); | |
| 1489 | + acb->hd_iov.iov_base = (void *)src_buf; | |
| 1490 | + acb->hd_iov.iov_len = acb->n * 512; | |
| 1491 | + qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); | |
| 1492 | + acb->hd_aiocb = bdrv_aio_writev(s->hd, | |
| 1493 | + (acb->cluster_offset >> 9) + index_in_cluster, | |
| 1494 | + &acb->hd_qiov, acb->n, | |
| 1495 | + qcow_aio_write_cb, acb); | |
| 1483 | 1496 | if (acb->hd_aiocb == NULL) |
| 1484 | 1497 | goto fail; |
| 1485 | 1498 | } | ... | ... |
block.c
| ... | ... | @@ -55,6 +55,12 @@ typedef struct BlockDriverAIOCBSync { |
| 55 | 55 | int ret; |
| 56 | 56 | } BlockDriverAIOCBSync; |
| 57 | 57 | |
| 58 | +static BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, | |
| 59 | + int64_t sector_num, uint8_t *buf, int nb_sectors, | |
| 60 | + BlockDriverCompletionFunc *cb, void *opaque); | |
| 61 | +static BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, | |
| 62 | + int64_t sector_num, const uint8_t *buf, int nb_sectors, | |
| 63 | + BlockDriverCompletionFunc *cb, void *opaque); | |
| 58 | 64 | static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs, |
| 59 | 65 | int64_t sector_num, uint8_t *buf, int nb_sectors, |
| 60 | 66 | BlockDriverCompletionFunc *cb, void *opaque); |
| ... | ... | @@ -1370,7 +1376,7 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, |
| 1370 | 1376 | cb, opaque, 1); |
| 1371 | 1377 | } |
| 1372 | 1378 | |
| 1373 | -BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, | |
| 1379 | +static BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, | |
| 1374 | 1380 | uint8_t *buf, int nb_sectors, |
| 1375 | 1381 | BlockDriverCompletionFunc *cb, void *opaque) |
| 1376 | 1382 | { |
| ... | ... | @@ -1393,7 +1399,7 @@ BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, |
| 1393 | 1399 | return ret; |
| 1394 | 1400 | } |
| 1395 | 1401 | |
| 1396 | -BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, | |
| 1402 | +static BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, | |
| 1397 | 1403 | const uint8_t *buf, int nb_sectors, |
| 1398 | 1404 | BlockDriverCompletionFunc *cb, void *opaque) |
| 1399 | 1405 | { | ... | ... |
block.h
| ... | ... | @@ -96,13 +96,6 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, |
| 96 | 96 | BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, |
| 97 | 97 | QEMUIOVector *iov, int nb_sectors, |
| 98 | 98 | BlockDriverCompletionFunc *cb, void *opaque); |
| 99 | - | |
| 100 | -BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, | |
| 101 | - uint8_t *buf, int nb_sectors, | |
| 102 | - BlockDriverCompletionFunc *cb, void *opaque); | |
| 103 | -BlockDriverAIOCB *bdrv_aio_write(BlockDriverState *bs, int64_t sector_num, | |
| 104 | - const uint8_t *buf, int nb_sectors, | |
| 105 | - BlockDriverCompletionFunc *cb, void *opaque); | |
| 106 | 99 | void bdrv_aio_cancel(BlockDriverAIOCB *acb); |
| 107 | 100 | |
| 108 | 101 | /* sg packet commands */ | ... | ... |
hw/ide.c
| ... | ... | @@ -496,6 +496,8 @@ typedef struct BMDMAState { |
| 496 | 496 | IDEState *ide_if; |
| 497 | 497 | BlockDriverCompletionFunc *dma_cb; |
| 498 | 498 | BlockDriverAIOCB *aiocb; |
| 499 | + struct iovec iov; | |
| 500 | + QEMUIOVector qiov; | |
| 499 | 501 | int64_t sector_num; |
| 500 | 502 | uint32_t nsector; |
| 501 | 503 | } BMDMAState; |
| ... | ... | @@ -1467,9 +1469,11 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) |
| 1467 | 1469 | #ifdef DEBUG_AIO |
| 1468 | 1470 | printf("aio_read_cd: lba=%u n=%d\n", s->lba, n); |
| 1469 | 1471 | #endif |
| 1470 | - bm->aiocb = bdrv_aio_read(s->bs, (int64_t)s->lba << 2, | |
| 1471 | - s->io_buffer + data_offset, n * 4, | |
| 1472 | - ide_atapi_cmd_read_dma_cb, bm); | |
| 1472 | + bm->iov.iov_base = s->io_buffer + data_offset; | |
| 1473 | + bm->iov.iov_len = n * 4 * 512; | |
| 1474 | + qemu_iovec_init_external(&bm->qiov, &bm->iov, 1); | |
| 1475 | + bm->aiocb = bdrv_aio_readv(s->bs, (int64_t)s->lba << 2, &bm->qiov, | |
| 1476 | + n * 4, ide_atapi_cmd_read_dma_cb, bm); | |
| 1473 | 1477 | if (!bm->aiocb) { |
| 1474 | 1478 | /* Note: media not present is the most likely case */ |
| 1475 | 1479 | ide_atapi_cmd_error(s, SENSE_NOT_READY, | ... | ... |
hw/scsi-disk.c
| ... | ... | @@ -52,9 +52,8 @@ typedef struct SCSIRequest { |
| 52 | 52 | /* Both sector and sector_count are in terms of qemu 512 byte blocks. */ |
| 53 | 53 | uint64_t sector; |
| 54 | 54 | uint32_t sector_count; |
| 55 | - /* The amounnt of data in the buffer. */ | |
| 56 | - int buf_len; | |
| 57 | - uint8_t *dma_buf; | |
| 55 | + struct iovec iov; | |
| 56 | + QEMUIOVector qiov; | |
| 58 | 57 | BlockDriverAIOCB *aiocb; |
| 59 | 58 | struct SCSIRequest *next; |
| 60 | 59 | uint32_t status; |
| ... | ... | @@ -89,12 +88,12 @@ static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag) |
| 89 | 88 | free_requests = r->next; |
| 90 | 89 | } else { |
| 91 | 90 | r = qemu_malloc(sizeof(SCSIRequest)); |
| 92 | - r->dma_buf = qemu_memalign(512, SCSI_DMA_BUF_SIZE); | |
| 91 | + r->iov.iov_base = qemu_memalign(512, SCSI_DMA_BUF_SIZE); | |
| 93 | 92 | } |
| 94 | 93 | r->dev = s; |
| 95 | 94 | r->tag = tag; |
| 96 | 95 | r->sector_count = 0; |
| 97 | - r->buf_len = 0; | |
| 96 | + r->iov.iov_len = 0; | |
| 98 | 97 | r->aiocb = NULL; |
| 99 | 98 | r->status = 0; |
| 100 | 99 | |
| ... | ... | @@ -173,9 +172,9 @@ static void scsi_read_complete(void * opaque, int ret) |
| 173 | 172 | scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NO_SENSE); |
| 174 | 173 | return; |
| 175 | 174 | } |
| 176 | - DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->buf_len); | |
| 175 | + DPRINTF("Data ready tag=0x%x len=%d\n", r->tag, r->iov.iov_len); | |
| 177 | 176 | |
| 178 | - s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len); | |
| 177 | + s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->iov.iov_len); | |
| 179 | 178 | } |
| 180 | 179 | |
| 181 | 180 | /* Read more data from scsi device into buffer. */ |
| ... | ... | @@ -193,9 +192,9 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) |
| 193 | 192 | return; |
| 194 | 193 | } |
| 195 | 194 | if (r->sector_count == (uint32_t)-1) { |
| 196 | - DPRINTF("Read buf_len=%d\n", r->buf_len); | |
| 195 | + DPRINTF("Read buf_len=%d\n", r->iov.iov_len); | |
| 197 | 196 | r->sector_count = 0; |
| 198 | - s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->buf_len); | |
| 197 | + s->completion(s->opaque, SCSI_REASON_DATA, r->tag, r->iov.iov_len); | |
| 199 | 198 | return; |
| 200 | 199 | } |
| 201 | 200 | DPRINTF("Read sector_count=%d\n", r->sector_count); |
| ... | ... | @@ -208,9 +207,10 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) |
| 208 | 207 | if (n > SCSI_DMA_BUF_SIZE / 512) |
| 209 | 208 | n = SCSI_DMA_BUF_SIZE / 512; |
| 210 | 209 | |
| 211 | - r->buf_len = n * 512; | |
| 212 | - r->aiocb = bdrv_aio_read(s->bdrv, r->sector, r->dma_buf, n, | |
| 213 | - scsi_read_complete, r); | |
| 210 | + r->iov.iov_len = n * 512; | |
| 211 | + qemu_iovec_init_external(&r->qiov, &r->iov, 1); | |
| 212 | + r->aiocb = bdrv_aio_readv(s->bdrv, r->sector, &r->qiov, n, | |
| 213 | + scsi_read_complete, r); | |
| 214 | 214 | if (r->aiocb == NULL) |
| 215 | 215 | scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR); |
| 216 | 216 | r->sector += n; |
| ... | ... | @@ -250,7 +250,7 @@ static void scsi_write_complete(void * opaque, int ret) |
| 250 | 250 | return; |
| 251 | 251 | } |
| 252 | 252 | |
| 253 | - n = r->buf_len / 512; | |
| 253 | + n = r->iov.iov_len / 512; | |
| 254 | 254 | r->sector += n; |
| 255 | 255 | r->sector_count -= n; |
| 256 | 256 | if (r->sector_count == 0) { |
| ... | ... | @@ -260,7 +260,7 @@ static void scsi_write_complete(void * opaque, int ret) |
| 260 | 260 | if (len > SCSI_DMA_BUF_SIZE) { |
| 261 | 261 | len = SCSI_DMA_BUF_SIZE; |
| 262 | 262 | } |
| 263 | - r->buf_len = len; | |
| 263 | + r->iov.iov_len = len; | |
| 264 | 264 | DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len); |
| 265 | 265 | s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len); |
| 266 | 266 | } |
| ... | ... | @@ -271,10 +271,11 @@ static void scsi_write_request(SCSIRequest *r) |
| 271 | 271 | SCSIDeviceState *s = r->dev; |
| 272 | 272 | uint32_t n; |
| 273 | 273 | |
| 274 | - n = r->buf_len / 512; | |
| 274 | + n = r->iov.iov_len / 512; | |
| 275 | 275 | if (n) { |
| 276 | - r->aiocb = bdrv_aio_write(s->bdrv, r->sector, r->dma_buf, n, | |
| 277 | - scsi_write_complete, r); | |
| 276 | + qemu_iovec_init_external(&r->qiov, &r->iov, 1); | |
| 277 | + r->aiocb = bdrv_aio_writev(s->bdrv, r->sector, &r->qiov, n, | |
| 278 | + scsi_write_complete, r); | |
| 278 | 279 | if (r->aiocb == NULL) |
| 279 | 280 | scsi_command_complete(r, STATUS_CHECK_CONDITION, |
| 280 | 281 | SENSE_HARDWARE_ERROR); |
| ... | ... | @@ -334,7 +335,7 @@ static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag) |
| 334 | 335 | BADF("Bad buffer tag 0x%x\n", tag); |
| 335 | 336 | return NULL; |
| 336 | 337 | } |
| 337 | - return r->dma_buf; | |
| 338 | + return r->iov.iov_base; | |
| 338 | 339 | } |
| 339 | 340 | |
| 340 | 341 | /* Execute a scsi command. Returns the length of the data expected by the |
| ... | ... | @@ -364,7 +365,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 364 | 365 | /* ??? Tags are not unique for different luns. We only implement a |
| 365 | 366 | single lun, so this should not matter. */ |
| 366 | 367 | r = scsi_new_request(s, tag); |
| 367 | - outbuf = r->dma_buf; | |
| 368 | + outbuf = r->iov.iov_base; | |
| 368 | 369 | is_write = 0; |
| 369 | 370 | DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]); |
| 370 | 371 | switch (command >> 5) { |
| ... | ... | @@ -425,10 +426,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 425 | 426 | if (len < 4) |
| 426 | 427 | goto fail; |
| 427 | 428 | memset(outbuf, 0, 4); |
| 428 | - r->buf_len = 4; | |
| 429 | + r->iov.iov_len = 4; | |
| 429 | 430 | if (s->sense == SENSE_NOT_READY && len >= 18) { |
| 430 | 431 | memset(outbuf, 0, 18); |
| 431 | - r->buf_len = 18; | |
| 432 | + r->iov.iov_len = 18; | |
| 432 | 433 | outbuf[7] = 10; |
| 433 | 434 | /* asc 0x3a, ascq 0: Medium not present */ |
| 434 | 435 | outbuf[12] = 0x3a; |
| ... | ... | @@ -461,20 +462,20 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 461 | 462 | DPRINTF("Inquiry EVPD[Supported pages] " |
| 462 | 463 | "buffer size %d\n", len); |
| 463 | 464 | |
| 464 | - r->buf_len = 0; | |
| 465 | + r->iov.iov_len = 0; | |
| 465 | 466 | |
| 466 | 467 | if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) { |
| 467 | - outbuf[r->buf_len++] = 5; | |
| 468 | + outbuf[r->iov.iov_len++] = 5; | |
| 468 | 469 | } else { |
| 469 | - outbuf[r->buf_len++] = 0; | |
| 470 | + outbuf[r->iov.iov_len++] = 0; | |
| 470 | 471 | } |
| 471 | 472 | |
| 472 | - outbuf[r->buf_len++] = 0x00; // this page | |
| 473 | - outbuf[r->buf_len++] = 0x00; | |
| 474 | - outbuf[r->buf_len++] = 3; // number of pages | |
| 475 | - outbuf[r->buf_len++] = 0x00; // list of supported pages (this page) | |
| 476 | - outbuf[r->buf_len++] = 0x80; // unit serial number | |
| 477 | - outbuf[r->buf_len++] = 0x83; // device identification | |
| 473 | + outbuf[r->iov.iov_len++] = 0x00; // this page | |
| 474 | + outbuf[r->iov.iov_len++] = 0x00; | |
| 475 | + outbuf[r->iov.iov_len++] = 3; // number of pages | |
| 476 | + outbuf[r->iov.iov_len++] = 0x00; // list of supported pages (this page) | |
| 477 | + outbuf[r->iov.iov_len++] = 0x80; // unit serial number | |
| 478 | + outbuf[r->iov.iov_len++] = 0x83; // device identification | |
| 478 | 479 | } |
| 479 | 480 | break; |
| 480 | 481 | case 0x80: |
| ... | ... | @@ -491,20 +492,20 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 491 | 492 | DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len); |
| 492 | 493 | l = MIN(len, strlen(s->drive_serial_str)); |
| 493 | 494 | |
| 494 | - r->buf_len = 0; | |
| 495 | + r->iov.iov_len = 0; | |
| 495 | 496 | |
| 496 | 497 | /* Supported page codes */ |
| 497 | 498 | if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) { |
| 498 | - outbuf[r->buf_len++] = 5; | |
| 499 | + outbuf[r->iov.iov_len++] = 5; | |
| 499 | 500 | } else { |
| 500 | - outbuf[r->buf_len++] = 0; | |
| 501 | + outbuf[r->iov.iov_len++] = 0; | |
| 501 | 502 | } |
| 502 | 503 | |
| 503 | - outbuf[r->buf_len++] = 0x80; // this page | |
| 504 | - outbuf[r->buf_len++] = 0x00; | |
| 505 | - outbuf[r->buf_len++] = l; | |
| 506 | - memcpy(&outbuf[r->buf_len], s->drive_serial_str, l); | |
| 507 | - r->buf_len += l; | |
| 504 | + outbuf[r->iov.iov_len++] = 0x80; // this page | |
| 505 | + outbuf[r->iov.iov_len++] = 0x00; | |
| 506 | + outbuf[r->iov.iov_len++] = l; | |
| 507 | + memcpy(&outbuf[r->iov.iov_len], s->drive_serial_str, l); | |
| 508 | + r->iov.iov_len += l; | |
| 508 | 509 | } |
| 509 | 510 | |
| 510 | 511 | break; |
| ... | ... | @@ -518,25 +519,25 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 518 | 519 | |
| 519 | 520 | DPRINTF("Inquiry EVPD[Device identification] " |
| 520 | 521 | "buffer size %d\n", len); |
| 521 | - r->buf_len = 0; | |
| 522 | + r->iov.iov_len = 0; | |
| 522 | 523 | if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) { |
| 523 | - outbuf[r->buf_len++] = 5; | |
| 524 | + outbuf[r->iov.iov_len++] = 5; | |
| 524 | 525 | } else { |
| 525 | - outbuf[r->buf_len++] = 0; | |
| 526 | + outbuf[r->iov.iov_len++] = 0; | |
| 526 | 527 | } |
| 527 | 528 | |
| 528 | - outbuf[r->buf_len++] = 0x83; // this page | |
| 529 | - outbuf[r->buf_len++] = 0x00; | |
| 530 | - outbuf[r->buf_len++] = 3 + id_len; | |
| 529 | + outbuf[r->iov.iov_len++] = 0x83; // this page | |
| 530 | + outbuf[r->iov.iov_len++] = 0x00; | |
| 531 | + outbuf[r->iov.iov_len++] = 3 + id_len; | |
| 531 | 532 | |
| 532 | - outbuf[r->buf_len++] = 0x2; // ASCII | |
| 533 | - outbuf[r->buf_len++] = 0; // not officially assigned | |
| 534 | - outbuf[r->buf_len++] = 0; // reserved | |
| 535 | - outbuf[r->buf_len++] = id_len; // length of data following | |
| 533 | + outbuf[r->iov.iov_len++] = 0x2; // ASCII | |
| 534 | + outbuf[r->iov.iov_len++] = 0; // not officially assigned | |
| 535 | + outbuf[r->iov.iov_len++] = 0; // reserved | |
| 536 | + outbuf[r->iov.iov_len++] = id_len; // length of data following | |
| 536 | 537 | |
| 537 | - memcpy(&outbuf[r->buf_len], | |
| 538 | + memcpy(&outbuf[r->iov.iov_len], | |
| 538 | 539 | bdrv_get_device_name(s->bdrv), id_len); |
| 539 | - r->buf_len += id_len; | |
| 540 | + r->iov.iov_len += id_len; | |
| 540 | 541 | } |
| 541 | 542 | break; |
| 542 | 543 | default: |
| ... | ... | @@ -592,7 +593,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 592 | 593 | outbuf[4] = len - 5; /* Additional Length = (Len - 1) - 4 */ |
| 593 | 594 | /* Sync data transfer and TCQ. */ |
| 594 | 595 | outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0); |
| 595 | - r->buf_len = len; | |
| 596 | + r->iov.iov_len = len; | |
| 596 | 597 | break; |
| 597 | 598 | case 0x16: |
| 598 | 599 | DPRINTF("Reserve(6)\n"); |
| ... | ... | @@ -727,10 +728,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 727 | 728 | p[21] = (16 * 176) & 0xff; |
| 728 | 729 | p += 22; |
| 729 | 730 | } |
| 730 | - r->buf_len = p - outbuf; | |
| 731 | - outbuf[0] = r->buf_len - 4; | |
| 732 | - if (r->buf_len > len) | |
| 733 | - r->buf_len = len; | |
| 731 | + r->iov.iov_len = p - outbuf; | |
| 732 | + outbuf[0] = r->iov.iov_len - 4; | |
| 733 | + if (r->iov.iov_len > len) | |
| 734 | + r->iov.iov_len = len; | |
| 734 | 735 | } |
| 735 | 736 | break; |
| 736 | 737 | case 0x1b: |
| ... | ... | @@ -766,7 +767,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 766 | 767 | outbuf[5] = 0; |
| 767 | 768 | outbuf[6] = s->cluster_size * 2; |
| 768 | 769 | outbuf[7] = 0; |
| 769 | - r->buf_len = 8; | |
| 770 | + r->iov.iov_len = 8; | |
| 770 | 771 | } else { |
| 771 | 772 | notready: |
| 772 | 773 | scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY); |
| ... | ... | @@ -827,7 +828,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 827 | 828 | if (toclen > 0) { |
| 828 | 829 | if (len > toclen) |
| 829 | 830 | len = toclen; |
| 830 | - r->buf_len = len; | |
| 831 | + r->iov.iov_len = len; | |
| 831 | 832 | break; |
| 832 | 833 | } |
| 833 | 834 | error_cmd: |
| ... | ... | @@ -840,7 +841,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 840 | 841 | /* ??? This should probably return much more information. For now |
| 841 | 842 | just return the basic header indicating the CD-ROM profile. */ |
| 842 | 843 | outbuf[7] = 8; // CD-ROM |
| 843 | - r->buf_len = 8; | |
| 844 | + r->iov.iov_len = 8; | |
| 844 | 845 | break; |
| 845 | 846 | case 0x56: |
| 846 | 847 | DPRINTF("Reserve(10)\n"); |
| ... | ... | @@ -877,7 +878,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 877 | 878 | outbuf[10] = s->cluster_size * 2; |
| 878 | 879 | outbuf[11] = 0; |
| 879 | 880 | /* Protection, exponent and lowest lba field left blank. */ |
| 880 | - r->buf_len = len; | |
| 881 | + r->iov.iov_len = len; | |
| 881 | 882 | } else { |
| 882 | 883 | scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY); |
| 883 | 884 | return 0; |
| ... | ... | @@ -892,7 +893,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 892 | 893 | goto fail; |
| 893 | 894 | memset(outbuf, 0, 16); |
| 894 | 895 | outbuf[3] = 8; |
| 895 | - r->buf_len = 16; | |
| 896 | + r->iov.iov_len = 16; | |
| 896 | 897 | break; |
| 897 | 898 | case 0x2f: |
| 898 | 899 | DPRINTF("Verify (sector %d, count %d)\n", lba, len); |
| ... | ... | @@ -906,10 +907,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, |
| 906 | 907 | scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR); |
| 907 | 908 | return 0; |
| 908 | 909 | } |
| 909 | - if (r->sector_count == 0 && r->buf_len == 0) { | |
| 910 | + if (r->sector_count == 0 && r->iov.iov_len == 0) { | |
| 910 | 911 | scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE); |
| 911 | 912 | } |
| 912 | - len = r->sector_count * 512 + r->buf_len; | |
| 913 | + len = r->sector_count * 512 + r->iov.iov_len; | |
| 913 | 914 | if (is_write) { |
| 914 | 915 | return -len; |
| 915 | 916 | } else { | ... | ... |