From 54847dbb3050d9ec9dd786d572d9c1dff0757d4d Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Thu, 10 Dec 2015 15:14:00 +0100 Subject: [PATCH 28/48] savevm-async: migration and bdrv_open update --- savevm-async.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/savevm-async.c b/savevm-async.c index 9704a41..6ac03af 100644 --- a/savevm-async.c +++ b/savevm-async.c @@ -154,10 +154,10 @@ static int block_state_close(void *opaque) return bdrv_flush(snap_state.bs); } -static int block_state_put_buffer(void *opaque, const uint8_t *buf, - int64_t pos, int size) +static ssize_t block_state_put_buffer(void *opaque, const uint8_t *buf, + int64_t pos, size_t size) { - int ret; + ssize_t ret; assert(pos == snap_state.bs_pos); @@ -201,12 +201,13 @@ static void process_savevm_co(void *opaque) } while (snap_state.state == SAVE_STATE_ACTIVE) { - uint64_t pending_size; + uint64_t pending_size, pend_post, pend_nonpost; - pending_size = qemu_savevm_state_pending(snap_state.file, 0); + qemu_savevm_state_pending(snap_state.file, 0, &pend_nonpost, &pend_post); + pending_size = pend_post + pend_nonpost; if (pending_size) { - ret = qemu_savevm_state_iterate(snap_state.file); + ret = qemu_savevm_state_iterate(snap_state.file, false); if (ret < 0) { save_snapshot_error("qemu_savevm_state_iterate error %d", ret); break; @@ -217,7 +218,7 @@ static void process_savevm_co(void *opaque) if (store_and_stop()) break; DPRINTF("savevm inerate finished\n"); - qemu_savevm_state_complete_precopy(snap_state.file); + qemu_savevm_state_complete_precopy(snap_state.file, false); DPRINTF("save complete\n"); save_snapshot_completed(); break; @@ -250,7 +251,6 @@ static const QEMUFileOps block_file_ops = { void qmp_savevm_start(bool has_statefile, const char *statefile, Error **errp) { - BlockDriver *drv = NULL; Error *local_err = NULL; int bdrv_oflags = BDRV_O_RDWR | BDRV_O_RESIZE; @@ -289,7 +289,7 @@ void qmp_savevm_start(bool has_statefile, const char *statefile, Error **errp) QDict *options = NULL; options = qdict_new(); qdict_put(options, "driver", qstring_from_str("raw")); - ret = bdrv_open(&snap_state.bs, statefile, NULL, options, bdrv_oflags, drv, &local_err); + ret = bdrv_open(&snap_state.bs, statefile, NULL, options, bdrv_oflags, &local_err); if (ret < 0) { error_set(errp, ERROR_CLASS_GENERIC_ERROR, "failed to open '%s'", statefile); goto restart; @@ -454,8 +454,8 @@ void qmp_delete_drive_snapshot(const char *device, const char *name, } } -static int loadstate_get_buffer(void *opaque, uint8_t *buf, int64_t pos, - int size) +static ssize_t loadstate_get_buffer(void *opaque, uint8_t *buf, int64_t pos, + size_t size) { BlockDriverState *bs = (BlockDriverState *)opaque; int64_t maxlen = bdrv_getlength(bs); @@ -478,7 +478,6 @@ static const QEMUFileOps loadstate_file_ops = { int load_state_from_blockdev(const char *filename) { BlockDriverState *bs = NULL; - BlockDriver *drv = NULL; Error *local_err = NULL; Error *blocker = NULL; @@ -486,7 +485,7 @@ int load_state_from_blockdev(const char *filename) int ret; bs = bdrv_new(); - ret = bdrv_open(&bs, filename, NULL, NULL, 0, drv, &local_err); + ret = bdrv_open(&bs, filename, NULL, NULL, 0, &local_err); error_setg(&blocker, "block device is in use by load state"); bdrv_op_block_all(bs, blocker); -- 2.1.4