Revision 42496d62

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