Lines Matching refs:acb
506 QCowAIOCB *acb = container_of(blockacb, QCowAIOCB, common);
507 if (acb->hd_aiocb)
508 bdrv_aio_cancel(acb->hd_aiocb);
509 qemu_aio_release(acb);
521 QCowAIOCB *acb;
523 acb = qemu_aio_get(&qcow_aio_pool, bs, cb, opaque);
524 if (!acb)
526 acb->hd_aiocb = NULL;
527 acb->sector_num = sector_num;
528 acb->qiov = qiov;
530 acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
532 qemu_iovec_to_buffer(qiov, acb->buf);
534 acb->buf = (uint8_t *)qiov->iov->iov_base;
536 acb->nb_sectors = nb_sectors;
537 acb->n = 0;
538 acb->cluster_offset = 0;
539 return acb;
544 QCowAIOCB *acb = opaque;
545 BlockDriverState *bs = acb->common.bs;
549 acb->hd_aiocb = NULL;
555 if (!acb->cluster_offset) {
557 } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
561 encrypt_sectors(s, acb->sector_num, acb->buf, acb->buf,
562 acb->n, 0,
567 acb->nb_sectors -= acb->n;
568 acb->sector_num += acb->n;
569 acb->buf += acb->n * 512;
571 if (acb->nb_sectors == 0) {
578 acb->cluster_offset = get_cluster_offset(bs, acb->sector_num << 9,
580 index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
581 acb->n = s->cluster_sectors - index_in_cluster;
582 if (acb->n > acb->nb_sectors)
583 acb->n = acb->nb_sectors;
585 if (!acb->cluster_offset) {
588 acb->hd_iov.iov_base = (void *)acb->buf;
589 acb->hd_iov.iov_len = acb->n * 512;
590 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
591 acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
592 &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
593 if (acb->hd_aiocb == NULL)
597 memset(acb->buf, 0, 512 * acb->n);
600 } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
602 if (decompress_cluster(bs, acb->cluster_offset) < 0)
604 memcpy(acb->buf,
605 s->cluster_cache + index_in_cluster * 512, 512 * acb->n);
608 if ((acb->cluster_offset & 511) != 0) {
612 acb->hd_iov.iov_base = (void *)acb->buf;
613 acb->hd_iov.iov_len = acb->n * 512;
614 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
615 acb->hd_aiocb = bdrv_aio_readv(bs->file,
616 (acb->cluster_offset >> 9) + index_in_cluster,
617 &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
618 if (acb->hd_aiocb == NULL)
625 if (acb->qiov->niov > 1) {
626 qemu_iovec_from_buffer(acb->qiov, acb->orig_buf, acb->qiov->size);
627 qemu_vfree(acb->orig_buf);
629 acb->common.cb(acb->common.opaque, ret);
630 qemu_aio_release(acb);
637 QCowAIOCB *acb;
639 acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
640 if (!acb)
643 qcow_aio_read_cb(acb, 0);
644 return &acb->common;
649 QCowAIOCB *acb = opaque;
650 BlockDriverState *bs = acb->common.bs;
656 acb->hd_aiocb = NULL;
661 acb->nb_sectors -= acb->n;
662 acb->sector_num += acb->n;
663 acb->buf += acb->n * 512;
665 if (acb->nb_sectors == 0) {
671 index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
672 acb->n = s->cluster_sectors - index_in_cluster;
673 if (acb->n > acb->nb_sectors)
674 acb->n = acb->nb_sectors;
675 cluster_offset = get_cluster_offset(bs, acb->sector_num << 9, 1, 0,
677 index_in_cluster + acb->n);
683 if (!acb->cluster_data) {
684 acb->cluster_data = qemu_mallocz(s->cluster_size);
685 if (!acb->cluster_data) {
690 encrypt_sectors(s, acb->sector_num, acb->cluster_data, acb->buf,
691 acb->n, 1, &s->aes_encrypt_key);
692 src_buf = acb->cluster_data;
694 src_buf = acb->buf;
697 acb->hd_iov.iov_base = (void *)src_buf;
698 acb->hd_iov.iov_len = acb->n * 512;
699 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
700 acb->hd_aiocb = bdrv_aio_writev(bs->file,
702 &acb->hd_qiov, acb->n,
703 qcow_aio_write_cb, acb);
704 if (acb->hd_aiocb == NULL)
709 if (acb->qiov->niov > 1)
710 qemu_vfree(acb->orig_buf);
711 acb->common.cb(acb->common.opaque, ret);
712 qemu_aio_release(acb);
720 QCowAIOCB *acb;
724 acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
725 if (!acb)
729 qcow_aio_write_cb(acb, 0);
730 return &acb->common;