|
From: | Pavel Butsykin |
Subject: | Re: [Qemu-block] [Qemu-devel] [PATCH v2 13/17] vmdk: Implement .bdrv_co_pwritev() interface |
Date: | Fri, 29 Apr 2016 11:49:04 +0300 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 |
On 29.04.2016 06:08, Fam Zheng wrote:
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?
The write_compressed callback is currently used only for image converting, so I think the lock is not required.
+} + 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?
Actually, I already have these patches as part of the issue of backup compression, hope to send today.
Fam} else { return -ENOTSUP; }
[Prev in Thread] | Current Thread | [Next in Thread] |