Home | History | Annotate | Download | only in block

Lines Matching defs:acb

348     QCowAIOCB *acb = container_of(blockacb, QCowAIOCB, common);
349 if (acb->hd_aiocb)
350 bdrv_aio_cancel(acb->hd_aiocb);
351 qemu_aio_release(acb);
362 QCowAIOCB *acb = opaque;
363 qemu_bh_delete(acb->bh);
364 acb->bh = NULL;
368 static int qcow_schedule_bh(QEMUBHFunc *cb, QCowAIOCB *acb)
370 if (acb->bh)
373 acb->bh = qemu_bh_new(cb, acb);
374 if (!acb->bh)
377 qemu_bh_schedule(acb->bh);
384 QCowAIOCB *acb = opaque;
385 BlockDriverState *bs = acb->common.bs;
389 acb->hd_aiocb = NULL;
394 if (!acb->cluster_offset) {
396 } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
400 qcow2_encrypt_sectors(s, acb->sector_num, acb->buf, acb->buf,
401 acb->cur_nr_sectors, 0,
406 acb->remaining_sectors -= acb->cur_nr_sectors;
407 acb->sector_num += acb->cur_nr_sectors;
408 acb->buf += acb->cur_nr_sectors * 512;
410 if (acb->remaining_sectors == 0) {
417 acb->cur_nr_sectors = acb->remaining_sectors;
418 ret = qcow2_get_cluster_offset(bs, acb->sector_num << 9,
419 &acb->cur_nr_sectors, &acb->cluster_offset);
424 index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
426 if (!acb->cluster_offset) {
429 n1 = qcow2_backing_read1(bs->backing_hd, acb->sector_num,
430 acb->buf, acb->cur_nr_sectors);
432 acb->hd_iov.iov_base = (void *)acb->buf;
433 acb->hd_iov.iov_len = acb->cur_nr_sectors * 512;
434 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
436 acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
437 &acb->hd_qiov, acb->cur_nr_sectors,
438 qcow_aio_read_cb, acb);
439 if (acb->hd_aiocb == NULL)
442 ret = qcow_schedule_bh(qcow_aio_read_bh, acb);
448 memset(acb->buf, 0, 512 * acb->cur_nr_sectors);
449 ret = qcow_schedule_bh(qcow_aio_read_bh, acb);
453 } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
455 if (qcow2_decompress_cluster(bs, acb->cluster_offset) < 0)
457 memcpy(acb->buf, s->cluster_cache + index_in_cluster * 512,
458 512 * acb->cur_nr_sectors);
459 ret = qcow_schedule_bh(qcow_aio_read_bh, acb);
463 if ((acb->cluster_offset & 511) != 0) {
468 acb->hd_iov.iov_base = (void *)acb->buf;
469 acb->hd_iov.iov_len = acb->cur_nr_sectors * 512;
470 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
472 acb->hd_aiocb = bdrv_aio_readv(bs->file,
473 (acb->cluster_offset >> 9) + index_in_cluster,
474 &acb->hd_qiov, acb->cur_nr_sectors,
475 qcow_aio_read_cb, acb);
476 if (acb->hd_aiocb == NULL) {
484 if (acb->qiov->niov > 1) {
485 qemu_iovec_from_buffer(acb->qiov, acb->orig_buf, acb->qiov->size);
486 qemu_vfree(acb->orig_buf);
488 acb->common.cb(acb->common.opaque, ret);
489 qemu_aio_release(acb);
496 QCowAIOCB *acb;
498 acb = qemu_aio_get(&qcow_aio_pool, bs, cb, opaque);
499 if (!acb)
501 acb->hd_aiocb = NULL;
502 acb->sector_num = sector_num;
503 acb->qiov = qiov;
505 acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
507 qemu_iovec_to_buffer(qiov, acb->buf);
509 acb->buf = (uint8_t *)qiov->iov->iov_base;
511 acb->remaining_sectors = nb_sectors;
512 acb->cur_nr_sectors = 0;
513 acb->cluster_offset = 0;
514 acb->l2meta.nb_clusters = 0;
515 QLIST_INIT(&acb->l2meta.dependent_requests);
516 return acb;
523 QCowAIOCB *acb;
525 acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
526 if (!acb)
529 qcow_aio_read_cb(acb, 0);
530 return &acb->common;
556 QCowAIOCB *acb = opaque;
557 BlockDriverState *bs = acb->common.bs;
563 acb->hd_aiocb = NULL;
566 ret = qcow2_alloc_cluster_link_l2(bs, &acb->l2meta);
569 run_dependent_requests(&acb->l2meta);
574 acb->remaining_sectors -= acb->cur_nr_sectors;
575 acb->sector_num += acb->cur_nr_sectors;
576 acb->buf += acb->cur_nr_sectors * 512;
578 if (acb->remaining_sectors == 0) {
584 index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
585 n_end = index_in_cluster + acb->remaining_sectors;
590 ret = qcow2_alloc_cluster_offset(bs, acb->sector_num << 9,
591 index_in_cluster, n_end, &acb->cur_nr_sectors, &acb->l2meta);
596 acb->cluster_offset = acb->l2meta.cluster_offset;
599 if (acb->l2meta.nb_clusters == 0 && acb->l2meta.depends_on != NULL) {
600 QLIST_INSERT_HEAD(&acb->l2meta.depends_on->dependent_requests,
601 acb, next_depend);
605 assert((acb->cluster_offset & 511) == 0);
608 if (!acb->cluster_data) {
609 acb->cluster_data = qemu_mallocz(QCOW_MAX_CRYPT_CLUSTERS *
612 qcow2_encrypt_sectors(s, acb->sector_num, acb->cluster_data, acb->buf,
613 acb->cur_nr_sectors, 1, &s->aes_encrypt_key);
614 src_buf = acb->cluster_data;
616 src_buf = acb->buf;
618 acb->hd_iov.iov_base = (void *)src_buf;
619 acb->hd_iov.iov_len = acb->cur_nr_sectors * 512;
620 qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
622 acb->hd_aiocb = bdrv_aio_writev(bs->file,
623 (acb->cluster_offset >> 9) + index_in_cluster,
624 &acb->hd_qiov, acb->cur_nr_sectors,
625 qcow_aio_write_cb, acb);
626 if (acb->hd_aiocb == NULL) {
634 if (acb->l2meta.nb_clusters != 0) {
635 QLIST_REMOVE(&acb->l2meta, next_in_flight);
638 if (acb->qiov->niov > 1)
639 qemu_vfree(acb->orig_buf);
640 acb->common.cb(acb->common.opaque, ret);
641 qemu_aio_release(acb);
649 QCowAIOCB *acb;
653 acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
654 if (!acb)
657 qcow_aio_write_cb(acb, 0);
658 return &acb->common;