Revision 42496d62 block/qcow2.c
b/block/qcow2.c | ||
---|---|---|
378 | 378 |
uint64_t bytes_done; |
379 | 379 |
uint64_t cluster_offset; |
380 | 380 |
uint8_t *cluster_data; |
381 |
bool is_write; |
|
381 | 382 |
BlockDriverAIOCB *hd_aiocb; |
382 | 383 |
QEMUIOVector hd_qiov; |
383 | 384 |
QEMUBH *bh; |
... | ... | |
399 | 400 |
}; |
400 | 401 |
|
401 | 402 |
static void qcow2_aio_read_cb(void *opaque, int ret); |
402 |
static void qcow2_aio_read_bh(void *opaque) |
|
403 |
static void qcow2_aio_write_cb(void *opaque, int ret); |
|
404 |
|
|
405 |
static void qcow2_aio_rw_bh(void *opaque) |
|
403 | 406 |
{ |
404 | 407 |
QCowAIOCB *acb = opaque; |
405 | 408 |
qemu_bh_delete(acb->bh); |
406 | 409 |
acb->bh = NULL; |
407 |
qcow2_aio_read_cb(opaque, 0); |
|
410 |
|
|
411 |
if (acb->is_write) { |
|
412 |
qcow2_aio_write_cb(opaque, 0); |
|
413 |
} else { |
|
414 |
qcow2_aio_read_cb(opaque, 0); |
|
415 |
} |
|
408 | 416 |
} |
409 | 417 |
|
410 | 418 |
static int qcow2_schedule_bh(QEMUBHFunc *cb, QCowAIOCB *acb) |
... | ... | |
493 | 501 |
goto done; |
494 | 502 |
} |
495 | 503 |
} else { |
496 |
ret = qcow2_schedule_bh(qcow2_aio_read_bh, acb);
|
|
504 |
ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
|
|
497 | 505 |
if (ret < 0) |
498 | 506 |
goto done; |
499 | 507 |
} |
500 | 508 |
} else { |
501 | 509 |
/* Note: in this case, no need to wait */ |
502 | 510 |
qemu_iovec_memset(&acb->hd_qiov, 0, 512 * acb->cur_nr_sectors); |
503 |
ret = qcow2_schedule_bh(qcow2_aio_read_bh, acb);
|
|
511 |
ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
|
|
504 | 512 |
if (ret < 0) |
505 | 513 |
goto done; |
506 | 514 |
} |
... | ... | |
515 | 523 |
s->cluster_cache + index_in_cluster * 512, |
516 | 524 |
512 * acb->cur_nr_sectors); |
517 | 525 |
|
518 |
ret = qcow2_schedule_bh(qcow2_aio_read_bh, acb);
|
|
526 |
ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
|
|
519 | 527 |
if (ret < 0) |
520 | 528 |
goto done; |
521 | 529 |
} else { |
... | ... | |
572 | 580 |
acb->hd_aiocb = NULL; |
573 | 581 |
acb->sector_num = sector_num; |
574 | 582 |
acb->qiov = qiov; |
583 |
acb->is_write = is_write; |
|
575 | 584 |
|
576 | 585 |
qemu_iovec_init(&acb->hd_qiov, qiov->niov); |
577 | 586 |
|
... | ... | |
591 | 600 |
void *opaque) |
592 | 601 |
{ |
593 | 602 |
QCowAIOCB *acb; |
603 |
int ret; |
|
594 | 604 |
|
595 | 605 |
acb = qcow2_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0); |
596 | 606 |
if (!acb) |
597 | 607 |
return NULL; |
598 | 608 |
|
599 |
qcow2_aio_read_cb(acb, 0); |
|
609 |
ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb); |
|
610 |
if (ret < 0) { |
|
611 |
qemu_iovec_destroy(&acb->hd_qiov); |
|
612 |
qemu_aio_release(acb); |
|
613 |
return NULL; |
|
614 |
} |
|
615 |
|
|
600 | 616 |
return &acb->common; |
601 | 617 |
} |
602 | 618 |
|
603 |
static void qcow2_aio_write_cb(void *opaque, int ret); |
|
604 |
|
|
605 | 619 |
static void run_dependent_requests(QCowL2Meta *m) |
606 | 620 |
{ |
607 | 621 |
QCowAIOCB *req; |
... | ... | |
724 | 738 |
{ |
725 | 739 |
BDRVQcowState *s = bs->opaque; |
726 | 740 |
QCowAIOCB *acb; |
741 |
int ret; |
|
727 | 742 |
|
728 | 743 |
s->cluster_cache_offset = -1; /* disable compressed cache */ |
729 | 744 |
|
... | ... | |
731 | 746 |
if (!acb) |
732 | 747 |
return NULL; |
733 | 748 |
|
734 |
qcow2_aio_write_cb(acb, 0); |
|
749 |
ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb); |
|
750 |
if (ret < 0) { |
|
751 |
qemu_iovec_destroy(&acb->hd_qiov); |
|
752 |
qemu_aio_release(acb); |
|
753 |
return NULL; |
|
754 |
} |
|
755 |
|
|
735 | 756 |
return &acb->common; |
736 | 757 |
} |
737 | 758 |
|
Also available in: Unified diff