Commit c87c0672936a5b825c0b95bb1d7f5d6dc92294e4

Authored by aliguori
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
block-qcow.c
@@ -530,6 +530,8 @@ typedef struct QCowAIOCB { @@ -530,6 +530,8 @@ typedef struct QCowAIOCB {
530 int n; 530 int n;
531 uint64_t cluster_offset; 531 uint64_t cluster_offset;
532 uint8_t *cluster_data; 532 uint8_t *cluster_data;
  533 + struct iovec hd_iov;
  534 + QEMUIOVector hd_qiov;
533 BlockDriverAIOCB *hd_aiocb; 535 BlockDriverAIOCB *hd_aiocb;
534 } QCowAIOCB; 536 } QCowAIOCB;
535 537
@@ -584,8 +586,11 @@ static void qcow_aio_read_cb(void *opaque, int ret) @@ -584,8 +586,11 @@ static void qcow_aio_read_cb(void *opaque, int ret)
584 if (!acb->cluster_offset) { 586 if (!acb->cluster_offset) {
585 if (bs->backing_hd) { 587 if (bs->backing_hd) {
586 /* read from the base image */ 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 if (acb->hd_aiocb == NULL) 594 if (acb->hd_aiocb == NULL)
590 goto fail; 595 goto fail;
591 } else { 596 } else {
@@ -605,9 +610,12 @@ static void qcow_aio_read_cb(void *opaque, int ret) @@ -605,9 +610,12 @@ static void qcow_aio_read_cb(void *opaque, int ret)
605 ret = -EIO; 610 ret = -EIO;
606 goto fail; 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 (acb->cluster_offset >> 9) + index_in_cluster, 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 if (acb->hd_aiocb == NULL) 619 if (acb->hd_aiocb == NULL)
612 goto fail; 620 goto fail;
613 } 621 }
@@ -687,10 +695,14 @@ static void qcow_aio_write_cb(void *opaque, int ret) @@ -687,10 +695,14 @@ static void qcow_aio_write_cb(void *opaque, int ret)
687 } else { 695 } else {
688 src_buf = acb->buf; 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 if (acb->hd_aiocb == NULL) 706 if (acb->hd_aiocb == NULL)
695 goto fail; 707 goto fail;
696 } 708 }
block-qcow2.c
@@ -1270,6 +1270,8 @@ typedef struct QCowAIOCB { @@ -1270,6 +1270,8 @@ typedef struct QCowAIOCB {
1270 uint64_t cluster_offset; 1270 uint64_t cluster_offset;
1271 uint8_t *cluster_data; 1271 uint8_t *cluster_data;
1272 BlockDriverAIOCB *hd_aiocb; 1272 BlockDriverAIOCB *hd_aiocb;
  1273 + struct iovec hd_iov;
  1274 + QEMUIOVector hd_qiov;
1273 QEMUBH *bh; 1275 QEMUBH *bh;
1274 QCowL2Meta l2meta; 1276 QCowL2Meta l2meta;
1275 } QCowAIOCB; 1277 } QCowAIOCB;
@@ -1347,8 +1349,12 @@ fail: @@ -1347,8 +1349,12 @@ fail:
1347 n1 = backing_read1(bs->backing_hd, acb->sector_num, 1349 n1 = backing_read1(bs->backing_hd, acb->sector_num,
1348 acb->buf, acb->n); 1350 acb->buf, acb->n);
1349 if (n1 > 0) { 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 if (acb->hd_aiocb == NULL) 1358 if (acb->hd_aiocb == NULL)
1353 goto fail; 1359 goto fail;
1354 } else { 1360 } else {
@@ -1377,9 +1383,13 @@ fail: @@ -1377,9 +1383,13 @@ fail:
1377 ret = -EIO; 1383 ret = -EIO;
1378 goto fail; 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 (acb->cluster_offset >> 9) + index_in_cluster, 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 if (acb->hd_aiocb == NULL) 1393 if (acb->hd_aiocb == NULL)
1384 goto fail; 1394 goto fail;
1385 } 1395 }
@@ -1476,10 +1486,13 @@ static void qcow_aio_write_cb(void *opaque, int ret) @@ -1476,10 +1486,13 @@ static void qcow_aio_write_cb(void *opaque, int ret)
1476 } else { 1486 } else {
1477 src_buf = acb->buf; 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 if (acb->hd_aiocb == NULL) 1496 if (acb->hd_aiocb == NULL)
1484 goto fail; 1497 goto fail;
1485 } 1498 }
@@ -55,6 +55,12 @@ typedef struct BlockDriverAIOCBSync { @@ -55,6 +55,12 @@ typedef struct BlockDriverAIOCBSync {
55 int ret; 55 int ret;
56 } BlockDriverAIOCBSync; 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 static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs, 64 static BlockDriverAIOCB *bdrv_aio_read_em(BlockDriverState *bs,
59 int64_t sector_num, uint8_t *buf, int nb_sectors, 65 int64_t sector_num, uint8_t *buf, int nb_sectors,
60 BlockDriverCompletionFunc *cb, void *opaque); 66 BlockDriverCompletionFunc *cb, void *opaque);
@@ -1370,7 +1376,7 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, @@ -1370,7 +1376,7 @@ BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
1370 cb, opaque, 1); 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 uint8_t *buf, int nb_sectors, 1380 uint8_t *buf, int nb_sectors,
1375 BlockDriverCompletionFunc *cb, void *opaque) 1381 BlockDriverCompletionFunc *cb, void *opaque)
1376 { 1382 {
@@ -1393,7 +1399,7 @@ BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num, @@ -1393,7 +1399,7 @@ BlockDriverAIOCB *bdrv_aio_read(BlockDriverState *bs, int64_t sector_num,
1393 return ret; 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 const uint8_t *buf, int nb_sectors, 1403 const uint8_t *buf, int nb_sectors,
1398 BlockDriverCompletionFunc *cb, void *opaque) 1404 BlockDriverCompletionFunc *cb, void *opaque)
1399 { 1405 {
@@ -96,13 +96,6 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num, @@ -96,13 +96,6 @@ BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
96 BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num, 96 BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
97 QEMUIOVector *iov, int nb_sectors, 97 QEMUIOVector *iov, int nb_sectors,
98 BlockDriverCompletionFunc *cb, void *opaque); 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 void bdrv_aio_cancel(BlockDriverAIOCB *acb); 99 void bdrv_aio_cancel(BlockDriverAIOCB *acb);
107 100
108 /* sg packet commands */ 101 /* sg packet commands */
hw/ide.c
@@ -496,6 +496,8 @@ typedef struct BMDMAState { @@ -496,6 +496,8 @@ typedef struct BMDMAState {
496 IDEState *ide_if; 496 IDEState *ide_if;
497 BlockDriverCompletionFunc *dma_cb; 497 BlockDriverCompletionFunc *dma_cb;
498 BlockDriverAIOCB *aiocb; 498 BlockDriverAIOCB *aiocb;
  499 + struct iovec iov;
  500 + QEMUIOVector qiov;
499 int64_t sector_num; 501 int64_t sector_num;
500 uint32_t nsector; 502 uint32_t nsector;
501 } BMDMAState; 503 } BMDMAState;
@@ -1467,9 +1469,11 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) @@ -1467,9 +1469,11 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
1467 #ifdef DEBUG_AIO 1469 #ifdef DEBUG_AIO
1468 printf("aio_read_cd: lba=%u n=%d\n", s->lba, n); 1470 printf("aio_read_cd: lba=%u n=%d\n", s->lba, n);
1469 #endif 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 if (!bm->aiocb) { 1477 if (!bm->aiocb) {
1474 /* Note: media not present is the most likely case */ 1478 /* Note: media not present is the most likely case */
1475 ide_atapi_cmd_error(s, SENSE_NOT_READY, 1479 ide_atapi_cmd_error(s, SENSE_NOT_READY,
hw/scsi-disk.c
@@ -52,9 +52,8 @@ typedef struct SCSIRequest { @@ -52,9 +52,8 @@ typedef struct SCSIRequest {
52 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */ 52 /* Both sector and sector_count are in terms of qemu 512 byte blocks. */
53 uint64_t sector; 53 uint64_t sector;
54 uint32_t sector_count; 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 BlockDriverAIOCB *aiocb; 57 BlockDriverAIOCB *aiocb;
59 struct SCSIRequest *next; 58 struct SCSIRequest *next;
60 uint32_t status; 59 uint32_t status;
@@ -89,12 +88,12 @@ static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag) @@ -89,12 +88,12 @@ static SCSIRequest *scsi_new_request(SCSIDeviceState *s, uint32_t tag)
89 free_requests = r->next; 88 free_requests = r->next;
90 } else { 89 } else {
91 r = qemu_malloc(sizeof(SCSIRequest)); 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 r->dev = s; 93 r->dev = s;
95 r->tag = tag; 94 r->tag = tag;
96 r->sector_count = 0; 95 r->sector_count = 0;
97 - r->buf_len = 0; 96 + r->iov.iov_len = 0;
98 r->aiocb = NULL; 97 r->aiocb = NULL;
99 r->status = 0; 98 r->status = 0;
100 99
@@ -173,9 +172,9 @@ static void scsi_read_complete(void * opaque, int ret) @@ -173,9 +172,9 @@ static void scsi_read_complete(void * opaque, int ret)
173 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NO_SENSE); 172 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NO_SENSE);
174 return; 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 /* Read more data from scsi device into buffer. */ 180 /* Read more data from scsi device into buffer. */
@@ -193,9 +192,9 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag) @@ -193,9 +192,9 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag)
193 return; 192 return;
194 } 193 }
195 if (r->sector_count == (uint32_t)-1) { 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 r->sector_count = 0; 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 return; 198 return;
200 } 199 }
201 DPRINTF("Read sector_count=%d\n", r->sector_count); 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,9 +207,10 @@ static void scsi_read_data(SCSIDevice *d, uint32_t tag)
208 if (n > SCSI_DMA_BUF_SIZE / 512) 207 if (n > SCSI_DMA_BUF_SIZE / 512)
209 n = SCSI_DMA_BUF_SIZE / 512; 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 if (r->aiocb == NULL) 214 if (r->aiocb == NULL)
215 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR); 215 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
216 r->sector += n; 216 r->sector += n;
@@ -250,7 +250,7 @@ static void scsi_write_complete(void * opaque, int ret) @@ -250,7 +250,7 @@ static void scsi_write_complete(void * opaque, int ret)
250 return; 250 return;
251 } 251 }
252 252
253 - n = r->buf_len / 512; 253 + n = r->iov.iov_len / 512;
254 r->sector += n; 254 r->sector += n;
255 r->sector_count -= n; 255 r->sector_count -= n;
256 if (r->sector_count == 0) { 256 if (r->sector_count == 0) {
@@ -260,7 +260,7 @@ static void scsi_write_complete(void * opaque, int ret) @@ -260,7 +260,7 @@ static void scsi_write_complete(void * opaque, int ret)
260 if (len > SCSI_DMA_BUF_SIZE) { 260 if (len > SCSI_DMA_BUF_SIZE) {
261 len = SCSI_DMA_BUF_SIZE; 261 len = SCSI_DMA_BUF_SIZE;
262 } 262 }
263 - r->buf_len = len; 263 + r->iov.iov_len = len;
264 DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len); 264 DPRINTF("Write complete tag=0x%x more=%d\n", r->tag, len);
265 s->completion(s->opaque, SCSI_REASON_DATA, r->tag, len); 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,10 +271,11 @@ static void scsi_write_request(SCSIRequest *r)
271 SCSIDeviceState *s = r->dev; 271 SCSIDeviceState *s = r->dev;
272 uint32_t n; 272 uint32_t n;
273 273
274 - n = r->buf_len / 512; 274 + n = r->iov.iov_len / 512;
275 if (n) { 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 if (r->aiocb == NULL) 279 if (r->aiocb == NULL)
279 scsi_command_complete(r, STATUS_CHECK_CONDITION, 280 scsi_command_complete(r, STATUS_CHECK_CONDITION,
280 SENSE_HARDWARE_ERROR); 281 SENSE_HARDWARE_ERROR);
@@ -334,7 +335,7 @@ static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag) @@ -334,7 +335,7 @@ static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag)
334 BADF("Bad buffer tag 0x%x\n", tag); 335 BADF("Bad buffer tag 0x%x\n", tag);
335 return NULL; 336 return NULL;
336 } 337 }
337 - return r->dma_buf; 338 + return r->iov.iov_base;
338 } 339 }
339 340
340 /* Execute a scsi command. Returns the length of the data expected by the 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,7 +365,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
364 /* ??? Tags are not unique for different luns. We only implement a 365 /* ??? Tags are not unique for different luns. We only implement a
365 single lun, so this should not matter. */ 366 single lun, so this should not matter. */
366 r = scsi_new_request(s, tag); 367 r = scsi_new_request(s, tag);
367 - outbuf = r->dma_buf; 368 + outbuf = r->iov.iov_base;
368 is_write = 0; 369 is_write = 0;
369 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]); 370 DPRINTF("Command: lun=%d tag=0x%x data=0x%02x", lun, tag, buf[0]);
370 switch (command >> 5) { 371 switch (command >> 5) {
@@ -425,10 +426,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -425,10 +426,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
425 if (len < 4) 426 if (len < 4)
426 goto fail; 427 goto fail;
427 memset(outbuf, 0, 4); 428 memset(outbuf, 0, 4);
428 - r->buf_len = 4; 429 + r->iov.iov_len = 4;
429 if (s->sense == SENSE_NOT_READY && len >= 18) { 430 if (s->sense == SENSE_NOT_READY && len >= 18) {
430 memset(outbuf, 0, 18); 431 memset(outbuf, 0, 18);
431 - r->buf_len = 18; 432 + r->iov.iov_len = 18;
432 outbuf[7] = 10; 433 outbuf[7] = 10;
433 /* asc 0x3a, ascq 0: Medium not present */ 434 /* asc 0x3a, ascq 0: Medium not present */
434 outbuf[12] = 0x3a; 435 outbuf[12] = 0x3a;
@@ -461,20 +462,20 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -461,20 +462,20 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
461 DPRINTF("Inquiry EVPD[Supported pages] " 462 DPRINTF("Inquiry EVPD[Supported pages] "
462 "buffer size %d\n", len); 463 "buffer size %d\n", len);
463 464
464 - r->buf_len = 0; 465 + r->iov.iov_len = 0;
465 466
466 if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) { 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 } else { 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 break; 480 break;
480 case 0x80: 481 case 0x80:
@@ -491,20 +492,20 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -491,20 +492,20 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
491 DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len); 492 DPRINTF("Inquiry EVPD[Serial number] buffer size %d\n", len);
492 l = MIN(len, strlen(s->drive_serial_str)); 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 /* Supported page codes */ 497 /* Supported page codes */
497 if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) { 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 } else { 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 break; 511 break;
@@ -518,25 +519,25 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -518,25 +519,25 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
518 519
519 DPRINTF("Inquiry EVPD[Device identification] " 520 DPRINTF("Inquiry EVPD[Device identification] "
520 "buffer size %d\n", len); 521 "buffer size %d\n", len);
521 - r->buf_len = 0; 522 + r->iov.iov_len = 0;
522 if (bdrv_get_type_hint(s->bdrv) == BDRV_TYPE_CDROM) { 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 } else { 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 bdrv_get_device_name(s->bdrv), id_len); 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 break; 542 break;
542 default: 543 default:
@@ -592,7 +593,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -592,7 +593,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
592 outbuf[4] = len - 5; /* Additional Length = (Len - 1) - 4 */ 593 outbuf[4] = len - 5; /* Additional Length = (Len - 1) - 4 */
593 /* Sync data transfer and TCQ. */ 594 /* Sync data transfer and TCQ. */
594 outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0); 595 outbuf[7] = 0x10 | (s->tcq ? 0x02 : 0);
595 - r->buf_len = len; 596 + r->iov.iov_len = len;
596 break; 597 break;
597 case 0x16: 598 case 0x16:
598 DPRINTF("Reserve(6)\n"); 599 DPRINTF("Reserve(6)\n");
@@ -727,10 +728,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -727,10 +728,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
727 p[21] = (16 * 176) & 0xff; 728 p[21] = (16 * 176) & 0xff;
728 p += 22; 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 break; 736 break;
736 case 0x1b: 737 case 0x1b:
@@ -766,7 +767,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -766,7 +767,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
766 outbuf[5] = 0; 767 outbuf[5] = 0;
767 outbuf[6] = s->cluster_size * 2; 768 outbuf[6] = s->cluster_size * 2;
768 outbuf[7] = 0; 769 outbuf[7] = 0;
769 - r->buf_len = 8; 770 + r->iov.iov_len = 8;
770 } else { 771 } else {
771 notready: 772 notready:
772 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY); 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,7 +828,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
827 if (toclen > 0) { 828 if (toclen > 0) {
828 if (len > toclen) 829 if (len > toclen)
829 len = toclen; 830 len = toclen;
830 - r->buf_len = len; 831 + r->iov.iov_len = len;
831 break; 832 break;
832 } 833 }
833 error_cmd: 834 error_cmd:
@@ -840,7 +841,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -840,7 +841,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
840 /* ??? This should probably return much more information. For now 841 /* ??? This should probably return much more information. For now
841 just return the basic header indicating the CD-ROM profile. */ 842 just return the basic header indicating the CD-ROM profile. */
842 outbuf[7] = 8; // CD-ROM 843 outbuf[7] = 8; // CD-ROM
843 - r->buf_len = 8; 844 + r->iov.iov_len = 8;
844 break; 845 break;
845 case 0x56: 846 case 0x56:
846 DPRINTF("Reserve(10)\n"); 847 DPRINTF("Reserve(10)\n");
@@ -877,7 +878,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -877,7 +878,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
877 outbuf[10] = s->cluster_size * 2; 878 outbuf[10] = s->cluster_size * 2;
878 outbuf[11] = 0; 879 outbuf[11] = 0;
879 /* Protection, exponent and lowest lba field left blank. */ 880 /* Protection, exponent and lowest lba field left blank. */
880 - r->buf_len = len; 881 + r->iov.iov_len = len;
881 } else { 882 } else {
882 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY); 883 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_NOT_READY);
883 return 0; 884 return 0;
@@ -892,7 +893,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag, @@ -892,7 +893,7 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
892 goto fail; 893 goto fail;
893 memset(outbuf, 0, 16); 894 memset(outbuf, 0, 16);
894 outbuf[3] = 8; 895 outbuf[3] = 8;
895 - r->buf_len = 16; 896 + r->iov.iov_len = 16;
896 break; 897 break;
897 case 0x2f: 898 case 0x2f:
898 DPRINTF("Verify (sector %d, count %d)\n", lba, len); 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,10 +907,10 @@ static int32_t scsi_send_command(SCSIDevice *d, uint32_t tag,
906 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR); 907 scsi_command_complete(r, STATUS_CHECK_CONDITION, SENSE_HARDWARE_ERROR);
907 return 0; 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 scsi_command_complete(r, STATUS_GOOD, SENSE_NO_SENSE); 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 if (is_write) { 914 if (is_write) {
914 return -len; 915 return -len;
915 } else { 916 } else {