qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 13/17] vmdk: Implement .bdrv_co_pwritev() int


From: Fam Zheng
Subject: Re: [Qemu-devel] [PATCH v2 13/17] vmdk: Implement .bdrv_co_pwritev() interface
Date: Fri, 29 Apr 2016 11:08:24 +0800
User-agent: Mutt/1.6.0 (2016-04-01)

On Thu, 04/28 15:16, Kevin Wolf wrote:
> +typedef struct VmdkWriteCompressedCo {
> +    BlockDriverState *bs;
> +    int64_t sector_num;
> +    const uint8_t *buf;
> +    int nb_sectors;
> +    int ret;
> +} VmdkWriteCompressedCo;
> +
> +static void vmdk_co_write_compressed(void *opaque)
> +{
> +    VmdkWriteCompressedCo *co = opaque;
> +    QEMUIOVector local_qiov;
> +    uint64_t offset = co->sector_num * BDRV_SECTOR_SIZE;
> +    uint64_t bytes = co->nb_sectors * BDRV_SECTOR_SIZE;
> +
> +    struct iovec iov = (struct iovec) {
> +        .iov_base   = (uint8_t*) co->buf,
> +        .iov_len    = bytes,
> +    };
> +    qemu_iovec_init_external(&local_qiov, &iov, 1);
> +
> +    co->ret = vmdk_pwritev(co->bs, offset, bytes, &local_qiov, false, false);

Should it acquire s->lock?

> +}
> +
>  static int vmdk_write_compressed(BlockDriverState *bs,
>                                   int64_t sector_num,
>                                   const uint8_t *buf,
>                                   int nb_sectors)
>  {
>      BDRVVmdkState *s = bs->opaque;
> +
>      if (s->num_extents == 1 && s->extents[0].compressed) {
> -        return vmdk_write(bs, sector_num, buf, nb_sectors, false, false);
> +        Coroutine *co;
> +        AioContext *aio_context = bdrv_get_aio_context(bs);
> +        VmdkWriteCompressedCo data = {
> +            .bs         = bs,
> +            .sector_num = sector_num,
> +            .buf        = buf,
> +            .nb_sectors = nb_sectors,
> +            .ret        = -EINPROGRESS,
> +        };
> +        co = qemu_coroutine_create(vmdk_co_write_compressed);
> +        qemu_coroutine_enter(co, &data);
> +        while (data.ret == -EINPROGRESS) {
> +            aio_poll(aio_context, true);
> +        }
> +        return data.ret;

Don't you have a plan to make the creation of coroutine for compressed write in
in block layer?  Or will bdrv_co_pwritev gain a "compressed" flag
(BDRV_REQ_COMPRESSED) in the future?

Fam

>      } else {
>          return -ENOTSUP;
>      }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]