bochs_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,

                QEMUIOVector *qiov, int flags)

{

    BDRVBochsState *s = bs->opaque;

    uint64_t sector_num = offset >> BDRV_SECTOR_BITS;

    int nb_sectors = bytes >> BDRV_SECTOR_BITS;

    uint64_t bytes_done = 0;

    QEMUIOVector local_qiov;

    int ret;



    assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);

    assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);



    qemu_iovec_init(&local_qiov, qiov->niov);

    qemu_co_mutex_lock(&s->lock);



    while (nb_sectors > 0) {

        int64_t block_offset = seek_to_sector(bs, sector_num);

        if (block_offset < 0) {

            ret = block_offset;

            goto fail;

        }



        qemu_iovec_reset(&local_qiov);

        qemu_iovec_concat(&local_qiov, qiov, bytes_done, 512);



        if (block_offset > 0) {

            ret = bdrv_co_preadv(bs->file->bs, block_offset, 512,

                                 &local_qiov, 0);

            if (ret < 0) {

                goto fail;

            }

        } else {

            qemu_iovec_memset(&local_qiov, 0, 0, 512);

        }

        nb_sectors--;

        sector_num++;

        bytes_done += 512;

    }



    ret = 0;

fail:

    qemu_co_mutex_unlock(&s->lock);

    qemu_iovec_destroy(&local_qiov);



    return ret;

}

bochs_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes,

                QEMUIOVector *qiov, int flags)

{

    BDRVBochsState *s = bs->opaque;

    uint64_t sector_num = offset >> BDRV_SECTOR_BITS;

    int nb_sectors = bytes >> BDRV_SECTOR_BITS;

    uint64_t bytes_done = 0;

    QEMUIOVector local_qiov;

    int ret;



    assert((offset & (BDRV_SECTOR_SIZE - 1)) == 0);

    assert((bytes & (BDRV_SECTOR_SIZE - 1)) == 0);



    qemu_iovec_init(&local_qiov, qiov->niov);

    qemu_co_mutex_lock(&s->lock);



    while (nb_sectors > 0) {

        int64_t block_offset = seek_to_sector(bs, sector_num);

        if (block_offset < 0) {

            ret = block_offset;

            goto fail;

        }



        qemu_iovec_reset(&local_qiov);

        qemu_iovec_concat(&local_qiov, qiov, bytes_done, 512);



        if (block_offset > 0) {

            ret = bdrv_co_preadv(bs->file->bs, block_offset, 512,

                                 &local_qiov, 0);

            if (ret < 0) {

                goto fail;

            }

        } else {

            qemu_iovec_memset(&local_qiov, 0, 0, 512);

        }

        nb_sectors--;

        sector_num++;

        bytes_done += 512;

    }



    ret = 0;

fail:

    qemu_co_mutex_unlock(&s->lock);

    qemu_iovec_destroy(&local_qiov);



    return ret;

}

FUNC_0(BlockDriverState *VAR_0, uint64_t VAR_1, uint64_t VAR_2,

                QEMUIOVector *VAR_3, int VAR_4)

{

    BDRVBochsState *s = VAR_0->opaque;

    uint64_t sector_num = VAR_1 >> BDRV_SECTOR_BITS;

    int VAR_5 = VAR_2 >> BDRV_SECTOR_BITS;

    uint64_t bytes_done = 0;

    QEMUIOVector local_qiov;

    int VAR_6;



    assert((VAR_1 & (BDRV_SECTOR_SIZE - 1)) == 0);

    assert((VAR_2 & (BDRV_SECTOR_SIZE - 1)) == 0);



    qemu_iovec_init(&local_qiov, VAR_3->niov);

    qemu_co_mutex_lock(&s->lock);



    while (VAR_5 > 0) {

        int64_t block_offset = seek_to_sector(VAR_0, sector_num);

        if (block_offset < 0) {

            VAR_6 = block_offset;

            goto fail;

        }



        qemu_iovec_reset(&local_qiov);

        qemu_iovec_concat(&local_qiov, VAR_3, bytes_done, 512);



        if (block_offset > 0) {

            VAR_6 = bdrv_co_preadv(VAR_0->file->VAR_0, block_offset, 512,

                                 &local_qiov, 0);

            if (VAR_6 < 0) {

                goto fail;

            }

        } else {

            qemu_iovec_memset(&local_qiov, 0, 0, 512);

        }

        VAR_5--;

        sector_num++;

        bytes_done += 512;

    }



    VAR_6 = 0;

fail:

    qemu_co_mutex_unlock(&s->lock);

    qemu_iovec_destroy(&local_qiov);



    return VAR_6;

}

FUNC_0(BlockDriverState *VAR_0, uint64_t VAR_1, uint64_t VAR_2,
QEMUIOVector *VAR_3, int VAR_4)
{ BDRVBochsState *s = VAR_0->opaque; uint64_t sector_num = VAR_1 >> BDRV_SECTOR_BITS; int VAR_5 = VAR_2 >> BDRV_SECTOR_BITS; uint64_t bytes_done = 0; QEMUIOVector local_qiov; int VAR_6; assert((VAR_1 & (BDRV_SECTOR_SIZE - 1)) == 0); assert((VAR_2 & (BDRV_SECTOR_SIZE - 1)) == 0); qemu_iovec_init(&local_qiov, VAR_3->niov); qemu_co_mutex_lock(&s->lock); while (VAR_5 > 0) { int64_t block_offset = seek_to_sector(VAR_0, sector_num); if (block_offset < 0) { VAR_6 = block_offset; goto fail; } qemu_iovec_reset(&local_qiov); qemu_iovec_concat(&local_qiov, VAR_3, bytes_done, 512); if (block_offset > 0) { VAR_6 = bdrv_co_preadv(VAR_0->file->VAR_0, block_offset, 512,
&local_qiov, 0); if (VAR_6 < 0) { goto fail; } } else { qemu_iovec_memset(&local_qiov, 0, 0, 512); } VAR_5--; sector_num++; bytes_done += 512; } VAR_6 = 0; fail:
qemu_co_mutex_unlock(&s->lock); qemu_iovec_destroy(&local_qiov); return VAR_6; }