raw_co_writev_flags(BlockDriverState *bs, int64_t sector_num, int nb_sectors,

                    QEMUIOVector *qiov, int flags)

{

    void *buf = NULL;

    BlockDriver *drv;

    QEMUIOVector local_qiov;

    int ret;



    if (bs->probed && sector_num == 0) {

        /* As long as these conditions are true, we can't get partial writes to

         * the probe buffer and can just directly check the request. */

        QEMU_BUILD_BUG_ON(BLOCK_PROBE_BUF_SIZE != 512);

        QEMU_BUILD_BUG_ON(BDRV_SECTOR_SIZE != 512);



        if (nb_sectors == 0) {

            /* qemu_iovec_to_buf() would fail, but we want to return success

             * instead of -EINVAL in this case. */

            return 0;

        }



        buf = qemu_try_blockalign(bs->file->bs, 512);

        if (!buf) {

            ret = -ENOMEM;

            goto fail;

        }



        ret = qemu_iovec_to_buf(qiov, 0, buf, 512);

        if (ret != 512) {

            ret = -EINVAL;

            goto fail;

        }



        drv = bdrv_probe_all(buf, 512, NULL);

        if (drv != bs->drv) {

            ret = -EPERM;

            goto fail;

        }



        /* Use the checked buffer, a malicious guest might be overwriting its

         * original buffer in the background. */

        qemu_iovec_init(&local_qiov, qiov->niov + 1);

        qemu_iovec_add(&local_qiov, buf, 512);

        qemu_iovec_concat(&local_qiov, qiov, 512, qiov->size - 512);

        qiov = &local_qiov;

    }



    BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);

    ret = bdrv_co_pwritev(bs->file->bs, sector_num * BDRV_SECTOR_SIZE,

                          nb_sectors * BDRV_SECTOR_SIZE, qiov, flags);



fail:

    if (qiov == &local_qiov) {

        qemu_iovec_destroy(&local_qiov);

    }

    qemu_vfree(buf);

    return ret;

}

raw_co_writev_flags(BlockDriverState *bs, int64_t sector_num, int nb_sectors,

                    QEMUIOVector *qiov, int flags)

{

    void *buf = NULL;

    BlockDriver *drv;

    QEMUIOVector local_qiov;

    int ret;



    if (bs->probed && sector_num == 0) {

        



        QEMU_BUILD_BUG_ON(BLOCK_PROBE_BUF_SIZE != 512);

        QEMU_BUILD_BUG_ON(BDRV_SECTOR_SIZE != 512);



        if (nb_sectors == 0) {

            



            return 0;

        }



        buf = qemu_try_blockalign(bs->file->bs, 512);

        if (!buf) {

            ret = -ENOMEM;

            goto fail;

        }



        ret = qemu_iovec_to_buf(qiov, 0, buf, 512);

        if (ret != 512) {

            ret = -EINVAL;

            goto fail;

        }



        drv = bdrv_probe_all(buf, 512, NULL);

        if (drv != bs->drv) {

            ret = -EPERM;

            goto fail;

        }



        



        qemu_iovec_init(&local_qiov, qiov->niov + 1);

        qemu_iovec_add(&local_qiov, buf, 512);

        qemu_iovec_concat(&local_qiov, qiov, 512, qiov->size - 512);

        qiov = &local_qiov;

    }



    BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);

    ret = bdrv_co_pwritev(bs->file->bs, sector_num * BDRV_SECTOR_SIZE,

                          nb_sectors * BDRV_SECTOR_SIZE, qiov, flags);



fail:

    if (qiov == &local_qiov) {

        qemu_iovec_destroy(&local_qiov);

    }

    qemu_vfree(buf);

    return ret;

}

FUNC_0(BlockDriverState *VAR_0, int64_t VAR_1, int VAR_2,

                    QEMUIOVector *VAR_3, int VAR_4)

{

    void *VAR_5 = NULL;

    BlockDriver *drv;

    QEMUIOVector local_qiov;

    int VAR_6;



    if (VAR_0->probed && VAR_1 == 0) {

        



        QEMU_BUILD_BUG_ON(BLOCK_PROBE_BUF_SIZE != 512);

        QEMU_BUILD_BUG_ON(BDRV_SECTOR_SIZE != 512);



        if (VAR_2 == 0) {

            



            return 0;

        }



        VAR_5 = qemu_try_blockalign(VAR_0->file->VAR_0, 512);

        if (!VAR_5) {

            VAR_6 = -ENOMEM;

            goto fail;

        }



        VAR_6 = qemu_iovec_to_buf(VAR_3, 0, VAR_5, 512);

        if (VAR_6 != 512) {

            VAR_6 = -EINVAL;

            goto fail;

        }



        drv = bdrv_probe_all(VAR_5, 512, NULL);

        if (drv != VAR_0->drv) {

            VAR_6 = -EPERM;

            goto fail;

        }



        



        qemu_iovec_init(&local_qiov, VAR_3->niov + 1);

        qemu_iovec_add(&local_qiov, VAR_5, 512);

        qemu_iovec_concat(&local_qiov, VAR_3, 512, VAR_3->size - 512);

        VAR_3 = &local_qiov;

    }



    BLKDBG_EVENT(VAR_0->file, BLKDBG_WRITE_AIO);

    VAR_6 = bdrv_co_pwritev(VAR_0->file->VAR_0, VAR_1 * BDRV_SECTOR_SIZE,

                          VAR_2 * BDRV_SECTOR_SIZE, VAR_3, VAR_4);



fail:

    if (VAR_3 == &local_qiov) {

        qemu_iovec_destroy(&local_qiov);

    }

    qemu_vfree(VAR_5);

    return VAR_6;

}

FUNC_0(BlockDriverState *VAR_0, int64_t VAR_1, int VAR_2,
QEMUIOVector *VAR_3, int VAR_4)
{ void *VAR_5 = NULL; BlockDriver *drv; QEMUIOVector local_qiov; int VAR_6; if (VAR_0->probed && VAR_1 == 0) { QEMU_BUILD_BUG_ON(BLOCK_PROBE_BUF_SIZE != 512); QEMU_BUILD_BUG_ON(BDRV_SECTOR_SIZE != 512); if (VAR_2 == 0) { return 0; } VAR_5 = qemu_try_blockalign(VAR_0->file->VAR_0, 512); if (!VAR_5) { VAR_6 = -ENOMEM; goto fail; } VAR_6 = qemu_iovec_to_buf(VAR_3, 0, VAR_5, 512); if (VAR_6 != 512) { VAR_6 = -EINVAL; goto fail; } drv = bdrv_probe_all(VAR_5, 512, NULL); if (drv != VAR_0->drv) { VAR_6 = -EPERM; goto fail; } qemu_iovec_init(&local_qiov, VAR_3->niov + 1); qemu_iovec_add(&local_qiov, VAR_5, 512); qemu_iovec_concat(&local_qiov, VAR_3, 512, VAR_3->size - 512); VAR_3 = &local_qiov; } BLKDBG_EVENT(VAR_0->file, BLKDBG_WRITE_AIO); VAR_6 = bdrv_co_pwritev(VAR_0->file->VAR_0, VAR_1 * BDRV_SECTOR_SIZE,
VAR_2 * BDRV_SECTOR_SIZE, VAR_3, VAR_4); fail:
if (VAR_3 == &local_qiov) { qemu_iovec_destroy(&local_qiov); } qemu_vfree(VAR_5); return VAR_6; }