Commit ad53089b0d0b4bc0731d978e5713365e1a91ba74
Committed by
Anthony Liguori
1 parent
4099df58
qcow: add qcow_aio_setup helper
[this one is required for [PATCH] fully split aio_pool from BlockDriver, sorry for not sending it out earlier] Add a qcow_aio_setup helper to qcow to shared common code between the aio_readv and aio_writev methods. Based on the function with the same name in qcow2. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
1 changed file
with
29 additions
and
23 deletions
block/qcow.c
... | ... | @@ -503,6 +503,32 @@ typedef struct QCowAIOCB { |
503 | 503 | BlockDriverAIOCB *hd_aiocb; |
504 | 504 | } QCowAIOCB; |
505 | 505 | |
506 | + | |
507 | +static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs, | |
508 | + int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, | |
509 | + BlockDriverCompletionFunc *cb, void *opaque, int is_write) | |
510 | +{ | |
511 | + QCowAIOCB *acb; | |
512 | + | |
513 | + acb = qemu_aio_get(bs, cb, opaque); | |
514 | + if (!acb) | |
515 | + return NULL; | |
516 | + acb->hd_aiocb = NULL; | |
517 | + acb->sector_num = sector_num; | |
518 | + acb->qiov = qiov; | |
519 | + if (qiov->niov > 1) { | |
520 | + acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size); | |
521 | + if (is_write) | |
522 | + qemu_iovec_to_buffer(qiov, acb->buf); | |
523 | + } else { | |
524 | + acb->buf = (uint8_t *)qiov->iov->iov_base; | |
525 | + } | |
526 | + acb->nb_sectors = nb_sectors; | |
527 | + acb->n = 0; | |
528 | + acb->cluster_offset = 0; | |
529 | + return acb; | |
530 | +} | |
531 | + | |
506 | 532 | static void qcow_aio_read_cb(void *opaque, int ret) |
507 | 533 | { |
508 | 534 | QCowAIOCB *acb = opaque; |
... | ... | @@ -600,19 +626,9 @@ static BlockDriverAIOCB *qcow_aio_readv(BlockDriverState *bs, |
600 | 626 | { |
601 | 627 | QCowAIOCB *acb; |
602 | 628 | |
603 | - acb = qemu_aio_get(bs, cb, opaque); | |
629 | + acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0); | |
604 | 630 | if (!acb) |
605 | 631 | return NULL; |
606 | - acb->hd_aiocb = NULL; | |
607 | - acb->sector_num = sector_num; | |
608 | - acb->qiov = qiov; | |
609 | - if (qiov->niov > 1) | |
610 | - acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size); | |
611 | - else | |
612 | - acb->buf = (uint8_t *)qiov->iov->iov_base; | |
613 | - acb->nb_sectors = nb_sectors; | |
614 | - acb->n = 0; | |
615 | - acb->cluster_offset = 0; | |
616 | 632 | |
617 | 633 | qcow_aio_read_cb(acb, 0); |
618 | 634 | return &acb->common; |
... | ... | @@ -695,20 +711,10 @@ static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs, |
695 | 711 | |
696 | 712 | s->cluster_cache_offset = -1; /* disable compressed cache */ |
697 | 713 | |
698 | - acb = qemu_aio_get(bs, cb, opaque); | |
714 | + acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0); | |
699 | 715 | if (!acb) |
700 | 716 | return NULL; |
701 | - acb->hd_aiocb = NULL; | |
702 | - acb->sector_num = sector_num; | |
703 | - acb->qiov = qiov; | |
704 | - if (qiov->niov > 1) { | |
705 | - acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size); | |
706 | - qemu_iovec_to_buffer(qiov, acb->buf); | |
707 | - } else { | |
708 | - acb->buf = (uint8_t *)qiov->iov->iov_base; | |
709 | - } | |
710 | - acb->nb_sectors = nb_sectors; | |
711 | - acb->n = 0; | |
717 | + | |
712 | 718 | |
713 | 719 | qcow_aio_write_cb(acb, 0); |
714 | 720 | return &acb->common; | ... | ... |