diff options
| author | Peter Maydell | 2016-09-13 15:31:18 +0200 |
|---|---|---|
| committer | Peter Maydell | 2016-09-13 15:31:18 +0200 |
| commit | 4dfbe3767af503a4cd137b15c8a9d8f30b20a6e9 (patch) | |
| tree | 3e58ae8614b0f372f8fe4f4bb27b85263c3e4934 /replication.c | |
| parent | Merge remote-tracking branch 'remotes/kraxel/tags/pull-vga-20160913-1' into s... (diff) | |
| parent | iothread: Stop threads before main() quits (diff) | |
| download | qemu-4dfbe3767af503a4cd137b15c8a9d8f30b20a6e9.tar.gz qemu-4dfbe3767af503a4cd137b15c8a9d8f30b20a6e9.tar.xz qemu-4dfbe3767af503a4cd137b15c8a9d8f30b20a6e9.zip | |
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-request' into staging
Pull request
v2:
* Fixed qcow2 sanitizer warnings [Peter]
* Renamed get_error test cases to get_error_all to avoid tripping "error:"
grep scripts [Peter]
* Added Fam's iothread stop patch
# gpg: Signature made Tue 13 Sep 2016 11:02:30 BST
# gpg: using RSA key 0x9CA4ABB381AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>"
# Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35 775A 9CA4 ABB3 81AB 73C8
* remotes/stefanha/tags/block-pull-request:
iothread: Stop threads before main() quits
tests: fix qvirtqueue_kick
MAINTAINERS: add maintainer for replication
support replication driver in blockdev-add
tests: add unit test case for replication
replication: Implement new driver for block replication
replication: Introduce new APIs to do replication operation
configure: support replication
mirror: auto complete active commit
docs: block replication's description
block: Link backup into block core
Backup: export interfaces for extra serialization
Backup: clear all bitmap when doing block checkpoint
block: unblock backup operations in backing file
virtio-blk: rename virtio_device_info to virtio_blk_info
linux-aio: process completions from ioq_submit()
linux-aio: split processing events function
linux-aio: consume events in userspace instead of calling io_getevents
qcow2: avoid memcpy(dst, NULL, len)
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'replication.c')
| -rw-r--r-- | replication.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/replication.c b/replication.c new file mode 100644 index 0000000000..be3a42f9c9 --- /dev/null +++ b/replication.c @@ -0,0 +1,107 @@ +/* + * Replication filter + * + * Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD. + * Copyright (c) 2016 Intel Corporation + * Copyright (c) 2016 FUJITSU LIMITED + * + * Author: + * Changlong Xie <xiecl.fnst@cn.fujitsu.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "replication.h" + +static QLIST_HEAD(, ReplicationState) replication_states; + +ReplicationState *replication_new(void *opaque, ReplicationOps *ops) +{ + ReplicationState *rs; + + assert(ops != NULL); + rs = g_new0(ReplicationState, 1); + rs->opaque = opaque; + rs->ops = ops; + QLIST_INSERT_HEAD(&replication_states, rs, node); + + return rs; +} + +void replication_remove(ReplicationState *rs) +{ + if (rs) { + QLIST_REMOVE(rs, node); + g_free(rs); + } +} + +/* + * The caller of the function MUST make sure vm stopped + */ +void replication_start_all(ReplicationMode mode, Error **errp) +{ + ReplicationState *rs, *next; + Error *local_err = NULL; + + QLIST_FOREACH_SAFE(rs, &replication_states, node, next) { + if (rs->ops && rs->ops->start) { + rs->ops->start(rs, mode, &local_err); + } + if (local_err) { + error_propagate(errp, local_err); + return; + } + } +} + +void replication_do_checkpoint_all(Error **errp) +{ + ReplicationState *rs, *next; + Error *local_err = NULL; + + QLIST_FOREACH_SAFE(rs, &replication_states, node, next) { + if (rs->ops && rs->ops->checkpoint) { + rs->ops->checkpoint(rs, &local_err); + } + if (local_err) { + error_propagate(errp, local_err); + return; + } + } +} + +void replication_get_error_all(Error **errp) +{ + ReplicationState *rs, *next; + Error *local_err = NULL; + + QLIST_FOREACH_SAFE(rs, &replication_states, node, next) { + if (rs->ops && rs->ops->get_error) { + rs->ops->get_error(rs, &local_err); + } + if (local_err) { + error_propagate(errp, local_err); + return; + } + } +} + +void replication_stop_all(bool failover, Error **errp) +{ + ReplicationState *rs, *next; + Error *local_err = NULL; + + QLIST_FOREACH_SAFE(rs, &replication_states, node, next) { + if (rs->ops && rs->ops->stop) { + rs->ops->stop(rs, failover, &local_err); + } + if (local_err) { + error_propagate(errp, local_err); + return; + } + } +} |
