Home | History | Annotate | Download | only in block

Lines Matching full:acb

508     QCowAIOCB *acb = (QCowAIOCB *)blockacb;
509 if (acb->hd_aiocb)
510 bdrv_aio_cancel(acb->hd_aiocb);
511 qemu_aio_release(acb);
523 QCowAIOCB *acb;
525 acb = qemu_aio_get(&qcow_aio_pool, bs, cb, opaque);
526 if (!acb)
528 acb->hd_aiocb = NULL;
529 acb->sector_num = sector_num;
530 acb->qiov = qiov;
532 acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
534 qemu_iovec_to_buffer(qiov, acb->buf);
536 acb->buf = (uint8_t *)qiov->iov->iov_base;
538 acb->nb_sectors = nb_sectors;
539 acb->n = 0;
540 acb->cluster_offset = 0;
541 return acb;
546 QCowAIOCB *acb = opaque;
547 BlockDriverState *bs = acb->common.bs;
551 acb->hd_aiocb = NULL;
557 if (!acb->cluster_offset) {
559 } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
563 encrypt_sectors(s, acb->sector_num, acb->buf, acb->buf,
564 acb->n, 0,
569 acb->nb_sectors -= acb->n;
570 acb->sector_num += acb->n;
571 acb->buf += acb->n * 512;
573 if (acb->nb_sectors == 0) {
580 acb->cluster_offset = get_cluster_offset(bs, acb->sector_num << 9,
582 index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
583 acb->n = s->cluster_sectors - index_in_cluster;
584 if (acb->n > acb->nb_sectors)
585 acb->n = acb->nb_sectors;
587 if (!acb->cluster_offset) {
590 acb->hd_iov.iov_base = (void *)acb->buf;
591 acb->hd_iov.iov_len = acb->n * 512;
592 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
593 acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
594 &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
595 if (acb->hd_aiocb == NULL)
599 memset(acb->buf, 0, 512 * acb->n);
602 } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
604 if (decompress_cluster(s, acb->cluster_offset) < 0)
606 memcpy(acb->buf,
607 s->cluster_cache + index_in_cluster * 512, 512 * acb->n);
610 if ((acb->cluster_offset & 511) != 0) {
614 acb->hd_iov.iov_base = (void *)acb->buf;
615 acb->hd_iov.iov_len = acb->n * 512;
616 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
617 acb->hd_aiocb = bdrv_aio_readv(s->hd,
618 (acb->cluster_offset >> 9) + index_in_cluster,
619 &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
620 if (acb->hd_aiocb == NULL)
627 if (acb->qiov->niov > 1) {
628 qemu_iovec_from_buffer(acb->qiov, acb->orig_buf, acb->qiov->size);
629 qemu_vfree(acb->orig_buf);
631 acb->common.cb(acb->common.opaque, ret);
632 qemu_aio_release(acb);
639 QCowAIOCB *acb;
641 acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
642 if (!acb)
645 qcow_aio_read_cb(acb, 0);
646 return &acb->common;
651 QCowAIOCB *acb = opaque;
652 BlockDriverState *bs = acb->common.bs;
658 acb->hd_aiocb = NULL;
663 acb->nb_sectors -= acb->n;
664 acb->sector_num += acb->n;
665 acb->buf += acb->n * 512;
667 if (acb->nb_sectors == 0) {
673 index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
674 acb->n = s->cluster_sectors - index_in_cluster;
675 if (acb->n > acb->nb_sectors)
676 acb->n = acb->nb_sectors;
677 cluster_offset = get_cluster_offset(bs, acb->sector_num << 9, 1, 0,
679 index_in_cluster + acb->n);
685 if (!acb->cluster_data) {
686 acb->cluster_data = qemu_mallocz(s->cluster_size);
687 if (!acb->cluster_data) {
692 encrypt_sectors(s, acb->sector_num, acb->cluster_data, acb->buf,
693 acb->n, 1, &s->aes_encrypt_key);
694 src_buf = acb->cluster_data;
696 src_buf = acb->buf;
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,
704 &acb->hd_qiov, acb->n,
705 qcow_aio_write_cb, acb);
706 if (acb->hd_aiocb == NULL)
711 if (acb->qiov->niov > 1)
712 qemu_vfree(acb->orig_buf);
713 acb->common.cb(acb->common.opaque, ret);
714 qemu_aio_release(acb);
722 QCowAIOCB *acb;
726 acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
727 if (!acb)
731 qcow_aio_write_cb(acb, 0);
732 return &acb->common;