mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 04:06:46 +00:00 
			
		
		
		
	 190b9a8b55
			
		
	
	
		190b9a8b55
		
	
	
	
	
		
			
			This commit introduces six replication interfaces(for block, network etc). Firstly we can use replication_(new/remove) to create/destroy replication instances, then in migration we can use replication_(start/stop/do_checkpoint /get_error)_all to handle all replication operations. More detail please refer to replication.h Signed-off-by: Wen Congyang <wency@cn.fujitsu.com> Signed-off-by: Changlong Xie <xiecl.fnst@cn.fujitsu.com> Signed-off-by: Wang WeiWei <wangww.fnst@cn.fujitsu.com> Signed-off-by: zhanghailiang <zhang.zhanghailiang@huawei.com> Signed-off-by: Gonglei <arei.gonglei@huawei.com> Message-id: 1469602913-20979-9-git-send-email-xiecl.fnst@cn.fujitsu.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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;
 | |
|         }
 | |
|     }
 | |
| }
 |