To be used in further commit. Don't worry about some duplication with existing blk_save_vmstate() and blk_load_vmstate(): they will be removed soon.
Note the difference: new functions returns 0 on success. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com> --- include/sysemu/block-backend.h | 3 +++ block/block-backend.c | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index 880e903293..8676bbde5a 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -245,6 +245,9 @@ int blk_pdiscard(BlockBackend *blk, int64_t offset, int bytes); int blk_save_vmstate(BlockBackend *blk, const uint8_t *buf, int64_t pos, int size); int blk_load_vmstate(BlockBackend *blk, uint8_t *buf, int64_t pos, int size); +int blk_co_save_vmstate(BlockBackend *blk, const uint8_t *buf, + int64_t pos, int size); +int blk_co_load_vmstate(BlockBackend *blk, uint8_t *buf, int64_t pos, int size); int blk_probe_blocksizes(BlockBackend *blk, BlockSizes *bsz); int blk_probe_geometry(BlockBackend *blk, HDGeometry *geo); BlockAIOCB *blk_abort_aio_request(BlockBackend *blk, diff --git a/block/block-backend.c b/block/block-backend.c index 413af51f3b..d7f91ce7ad 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -14,6 +14,7 @@ #include "sysemu/block-backend.h" #include "block/block_int.h" #include "block/blockjob.h" +#include "block/coroutines.h" #include "block/throttle-groups.h" #include "hw/qdev-core.h" #include "sysemu/blockdev.h" @@ -2227,6 +2228,42 @@ int blk_load_vmstate(BlockBackend *blk, uint8_t *buf, int64_t pos, int size) return bdrv_load_vmstate(blk_bs(blk), buf, pos, size); } +int blk_co_save_vmstate(BlockBackend *blk, const uint8_t *buf, + int64_t pos, int size) +{ + int ret; + QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, size); + + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + + ret = bdrv_co_writev_vmstate(blk_bs(blk), &qiov, pos); + if (ret < 0) { + return ret; + } + + if (!blk->enable_write_cache) { + ret = bdrv_flush(blk_bs(blk)); + } + + return ret < 0 ? ret : 0; +} + +int blk_co_load_vmstate(BlockBackend *blk, uint8_t *buf, int64_t pos, int size) +{ + int ret; + QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF(qiov, buf, size); + + if (!blk_is_available(blk)) { + return -ENOMEDIUM; + } + + ret = bdrv_co_readv_vmstate(blk_bs(blk), &qiov, pos); + + return ret < 0 ? ret : 0; +} + int blk_probe_blocksizes(BlockBackend *blk, BlockSizes *bsz) { if (!blk_is_available(blk)) { -- 2.29.2