qemu
/
replication.c
107 строк · 2.5 Кб
1/*
2* Replication filter
3*
4* Copyright (c) 2016 HUAWEI TECHNOLOGIES CO., LTD.
5* Copyright (c) 2016 Intel Corporation
6* Copyright (c) 2016 FUJITSU LIMITED
7*
8* Author:
9* Changlong Xie <xiecl.fnst@cn.fujitsu.com>
10*
11* This work is licensed under the terms of the GNU GPL, version 2 or later.
12* See the COPYING file in the top-level directory.
13*/
14
15#include "qemu/osdep.h"
16#include "qapi/error.h"
17#include "block/replication.h"
18
19static QLIST_HEAD(, ReplicationState) replication_states;
20
21ReplicationState *replication_new(void *opaque, ReplicationOps *ops)
22{
23ReplicationState *rs;
24
25assert(ops != NULL);
26rs = g_new0(ReplicationState, 1);
27rs->opaque = opaque;
28rs->ops = ops;
29QLIST_INSERT_HEAD(&replication_states, rs, node);
30
31return rs;
32}
33
34void replication_remove(ReplicationState *rs)
35{
36if (rs) {
37QLIST_REMOVE(rs, node);
38g_free(rs);
39}
40}
41
42/*
43* The caller of the function MUST make sure vm stopped
44*/
45void replication_start_all(ReplicationMode mode, Error **errp)
46{
47ReplicationState *rs, *next;
48Error *local_err = NULL;
49
50QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
51if (rs->ops && rs->ops->start) {
52rs->ops->start(rs, mode, &local_err);
53}
54if (local_err) {
55error_propagate(errp, local_err);
56return;
57}
58}
59}
60
61void replication_do_checkpoint_all(Error **errp)
62{
63ReplicationState *rs, *next;
64Error *local_err = NULL;
65
66QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
67if (rs->ops && rs->ops->checkpoint) {
68rs->ops->checkpoint(rs, &local_err);
69}
70if (local_err) {
71error_propagate(errp, local_err);
72return;
73}
74}
75}
76
77void replication_get_error_all(Error **errp)
78{
79ReplicationState *rs, *next;
80Error *local_err = NULL;
81
82QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
83if (rs->ops && rs->ops->get_error) {
84rs->ops->get_error(rs, &local_err);
85}
86if (local_err) {
87error_propagate(errp, local_err);
88return;
89}
90}
91}
92
93void replication_stop_all(bool failover, Error **errp)
94{
95ReplicationState *rs, *next;
96Error *local_err = NULL;
97
98QLIST_FOREACH_SAFE(rs, &replication_states, node, next) {
99if (rs->ops && rs->ops->stop) {
100rs->ops->stop(rs, failover, &local_err);
101}
102if (local_err) {
103error_propagate(errp, local_err);
104return;
105}
106}
107}
108