This does the first part of the conversion to coroutines, by wrapping bdrv_write implementations to take the write side of the rwlock.
Drivers that implement bdrv_write rather than bdrv_co_writev can then benefit from asynchronous operation (at least if the underlying protocol supports it, which is not the case for raw-win32), even though they still operate with a bounce buffer. Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- block/cow.c | 13 ++++++++++++- block/nbd.c | 13 ++++++++++++- block/vmdk.c | 13 ++++++++++++- block/vpc.c | 13 ++++++++++++- block/vvfat.c | 13 ++++++++++++- 5 files changed, 60 insertions(+), 5 deletions(-) diff --git a/block/cow.c b/block/cow.c index e57378d..bd00042 100644 --- a/block/cow.c +++ b/block/cow.c @@ -226,6 +226,17 @@ static int cow_write(BlockDriverState *bs, int64_t sector_num, return cow_update_bitmap(bs, sector_num, nb_sectors); } +static coroutine_fn int cow_co_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors) +{ + int ret; + BDRVCowState *s = bs->opaque; + qemu_co_mutex_lock(&s->lock); + ret = cow_write(bs, sector_num, buf, nb_sectors); + qemu_co_mutex_unlock(&s->lock); + return ret; +} + static void cow_close(BlockDriverState *bs) { } @@ -320,7 +331,7 @@ static BlockDriver bdrv_cow = { .bdrv_probe = cow_probe, .bdrv_open = cow_open, .bdrv_read = cow_co_read, - .bdrv_write = cow_write, + .bdrv_write = cow_co_write, .bdrv_close = cow_close, .bdrv_create = cow_create, .bdrv_flush = cow_flush, diff --git a/block/nbd.c b/block/nbd.c index d5ba95d..0568d2f 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -251,6 +251,17 @@ static coroutine_fn int nbd_co_read(BlockDriverState *bs, int64_t sector_num, return ret; } +static coroutine_fn int nbd_co_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors) +{ + int ret; + BDRVNBDState *s = bs->opaque; + qemu_co_mutex_lock(&s->lock); + ret = nbd_write(bs, sector_num, buf, nb_sectors); + qemu_co_mutex_unlock(&s->lock); + return ret; +} + static void nbd_close(BlockDriverState *bs) { BDRVNBDState *s = bs->opaque; @@ -272,7 +283,7 @@ static BlockDriver bdrv_nbd = { .instance_size = sizeof(BDRVNBDState), .bdrv_file_open = nbd_open, .bdrv_read = nbd_co_read, - .bdrv_write = nbd_write, + .bdrv_write = nbd_co_write, .bdrv_close = nbd_close, .bdrv_getlength = nbd_getlength, .protocol_name = "nbd", diff --git a/block/vmdk.c b/block/vmdk.c index 0e791f2..3b376ed 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1116,6 +1116,17 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num, return 0; } +static coroutine_fn int vmdk_co_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors) +{ + int ret; + BDRVVmdkState *s = bs->opaque; + qemu_co_mutex_lock(&s->lock); + ret = vmdk_write(bs, sector_num, buf, nb_sectors); + qemu_co_mutex_unlock(&s->lock); + return ret; +} + static int vmdk_create_extent(const char *filename, int64_t filesize, bool flat, bool compress) @@ -1554,7 +1565,7 @@ static BlockDriver bdrv_vmdk = { .bdrv_probe = vmdk_probe, .bdrv_open = vmdk_open, .bdrv_read = vmdk_co_read, - .bdrv_write = vmdk_write, + .bdrv_write = vmdk_co_write, .bdrv_close = vmdk_close, .bdrv_create = vmdk_create, .bdrv_flush = vmdk_flush, diff --git a/block/vpc.c b/block/vpc.c index e91e397..f900693 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -456,6 +456,17 @@ static int vpc_write(BlockDriverState *bs, int64_t sector_num, return 0; } +static coroutine_fn int vpc_co_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors) +{ + int ret; + BDRVVPCState *s = bs->opaque; + qemu_co_mutex_lock(&s->lock); + ret = vpc_write(bs, sector_num, buf, nb_sectors); + qemu_co_mutex_unlock(&s->lock); + return ret; +} + static int vpc_flush(BlockDriverState *bs) { return bdrv_flush(bs->file); @@ -661,7 +672,7 @@ static BlockDriver bdrv_vpc = { .bdrv_probe = vpc_probe, .bdrv_open = vpc_open, .bdrv_read = vpc_co_read, - .bdrv_write = vpc_write, + .bdrv_write = vpc_co_write, .bdrv_flush = vpc_flush, .bdrv_close = vpc_close, .bdrv_create = vpc_create, diff --git a/block/vvfat.c b/block/vvfat.c index 4501ccc..bb9961a 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -2725,6 +2725,17 @@ DLOG(checkpoint()); return 0; } +static coroutine_fn int vvfat_co_write(BlockDriverState *bs, int64_t sector_num, + const uint8_t *buf, int nb_sectors) +{ + int ret; + BDRVVVFATState *s = bs->opaque; + qemu_co_mutex_lock(&s->lock); + ret = vvfat_write(bs, sector_num, buf, nb_sectors); + qemu_co_mutex_unlock(&s->lock); + return ret; +} + static int vvfat_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, int* n) { @@ -2815,7 +2826,7 @@ static BlockDriver bdrv_vvfat = { .instance_size = sizeof(BDRVVVFATState), .bdrv_file_open = vvfat_open, .bdrv_read = vvfat_co_read, - .bdrv_write = vvfat_write, + .bdrv_write = vvfat_co_write, .bdrv_close = vvfat_close, .bdrv_is_allocated = vvfat_is_allocated, .protocol_name = "fat", -- 1.7.6