From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wen Congyang Subject: [RFC Patch v3 04/22] don't touch remus in checkpoint_device Date: Fri, 5 Sep 2014 17:25:39 +0800 Message-ID: <1409909158-19243-5-git-send-email-wency@cn.fujitsu.com> References: <1409909158-19243-1-git-send-email-wency@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1409909158-19243-1-git-send-email-wency@cn.fujitsu.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen devel Cc: Ian Campbell , Wen Congyang , Ian Jackson , Jiang Yunhong , Dong Eddie , Shriram Rajagopalan , Yang Hongyang , Lai Jiangshan List-Id: xen-devel@lists.xenproject.org Checkpoint device is an abstract layer to do checkpoint. COLO can also use it to do checkpoint. But there are still some codes in checkpoint device which touch remus: 1. remus_ops: we use remus ops directly in checkpoint device. Store it in checkpoint device state. 2. concrete layer's private member: add a new structure remus state, and move them to remus state. 3. init/cleanup device subkind: we call (init|cleanup)_subkind_nic and (init|cleanup)_subkind_drbd_disk directly in checkpoint device. Call them before calling libxl__checkpoint_devices_setup() or after calling libxl__checkpoint_devices_teardown(). Signed-off-by: Wen Congyang Cc: Shriram Rajagopalan --- tools/libxl/libxl.c | 2 +- tools/libxl/libxl_checkpoint_device.c | 52 ++------------------ tools/libxl/libxl_dom.c | 3 +- tools/libxl/libxl_internal.h | 37 ++++++++++----- tools/libxl/libxl_netbuffer.c | 51 +++++++++++--------- tools/libxl/libxl_remus.c | 89 +++++++++++++++++++++++++++-------- tools/libxl/libxl_remus.h | 5 +- tools/libxl/libxl_remus_disk_drbd.c | 9 ++-- 8 files changed, 136 insertions(+), 112 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 24e209b..f0cc6ca 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -831,7 +831,7 @@ int libxl_domain_remus_start(libxl_ctx *ctx, libxl_domain_remus_info *info, assert(info); /* Point of no return */ - libxl__remus_setup(egc, dss); + libxl__remus_setup(egc, &dss->rs); return AO_INPROGRESS; out: diff --git a/tools/libxl/libxl_checkpoint_device.c b/tools/libxl/libxl_checkpoint_device.c index 41b9529..9ee5771 100644 --- a/tools/libxl/libxl_checkpoint_device.c +++ b/tools/libxl/libxl_checkpoint_device.c @@ -17,46 +17,6 @@ #include "libxl_internal.h" -extern const libxl__checkpoint_device_instance_ops remus_device_nic; -extern const libxl__checkpoint_device_instance_ops remus_device_drbd_disk; -static const libxl__checkpoint_device_instance_ops *remus_ops[] = { - &remus_device_nic, - &remus_device_drbd_disk, - NULL, -}; - -/*----- helper functions -----*/ - -static int init_device_subkind(libxl__checkpoint_devices_state *cds) -{ - /* init device subkind-specific state in the libxl ctx */ - int rc; - STATE_AO_GC(cds->ao); - - if (libxl__netbuffer_enabled(gc)) { - rc = init_subkind_nic(cds); - if (rc) goto out; - } - - rc = init_subkind_drbd_disk(cds); - if (rc) goto out; - - rc = 0; -out: - return rc; -} - -static void cleanup_device_subkind(libxl__checkpoint_devices_state *cds) -{ - /* cleanup device subkind-specific state in the libxl ctx */ - STATE_AO_GC(cds->ao); - - if (libxl__netbuffer_enabled(gc)) - cleanup_subkind_nic(cds); - - cleanup_subkind_drbd_disk(cds); -} - /*----- setup() and teardown() -----*/ /* callbacks */ @@ -93,14 +53,10 @@ static void checkpoint_devices_setup(libxl__egc *egc, void libxl__checkpoint_devices_setup(libxl__egc *egc, libxl__checkpoint_devices_state *cds) { - int i, rc; + int i; STATE_AO_GC(cds->ao); - rc = init_device_subkind(cds); - if (rc) - goto out; - cds->num_devices = 0; cds->num_nics = 0; cds->num_disks = 0; @@ -133,7 +89,7 @@ void libxl__checkpoint_devices_setup(libxl__egc *egc, return; out: - cds->callback(egc, cds, rc); + cds->callback(egc, cds, 0); } static void checkpoint_devices_setup(libxl__egc *egc, @@ -153,7 +109,7 @@ static void checkpoint_devices_setup(libxl__egc *egc, /* find avaliable ops */ do { - dev->ops = remus_ops[++dev->ops_index]; + dev->ops = cds->ops[++dev->ops_index]; if (!dev->ops) { rc = ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED; goto out; @@ -240,8 +196,6 @@ static void devices_teardown_cb(libxl__egc *egc, cds->disks = NULL; cds->num_disks = 0; - cleanup_device_subkind(cds); - cds->callback(egc, cds, rc); } diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 11a8a66..6488ffd 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -1605,7 +1605,6 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss) dss2->save_dm = 1; if (r_info != NULL) { - dss->interval = r_info->interval; if (libxl_defbool_val(r_info->compression)) dss->xcflags |= XCFLAGS_CHECKPOINT_COMPRESS; } @@ -1787,7 +1786,7 @@ static void domain_suspend_done(libxl__egc *egc, dss2->guest_evtchn.port, &dss2->guest_evtchn_lockfd); if (dss->remus) { - libxl__remus_teardown(egc, dss, rc); + libxl__remus_teardown(egc, &dss->rs, rc); return; } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 628914f..d575a4a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2624,6 +2624,8 @@ struct libxl__checkpoint_devices_state { uint32_t domid; libxl__checkpoint_callback *callback; int device_kind_flags; + /* The ops must be pointer array, and the last ops must be NULL */ + const libxl__checkpoint_device_instance_ops **ops; /*----- private for abstract layer only -----*/ @@ -2644,16 +2646,6 @@ struct libxl__checkpoint_devices_state { int num_disks; libxl__multidev multidev; - - /*----- private for concrete (device-specific) layer only -----*/ - - /* private for nic device subkind ops */ - char *netbufscript; - struct nl_sock *nlsock; - struct nl_cache *qdisc_cache; - - /* private for drbd disk subkind ops */ - char *drbd_probe_script; }; /* @@ -2701,6 +2693,27 @@ _hidden void libxl__checkpoint_devices_preresume(libxl__egc *egc, libxl__checkpoint_devices_state *cds); _hidden void libxl__checkpoint_devices_commit(libxl__egc *egc, libxl__checkpoint_devices_state *cds); + +/*----- Remus related state structure -----*/ +typedef struct libxl__remus_state libxl__remus_state; +struct libxl__remus_state { + /* private */ + libxl__ev_time checkpoint_timeout; /* used for Remus checkpoint */ + int interval; /* checkpoint interval */ + + /* abstract layer */ + libxl__checkpoint_devices_state cds; + + /*----- private for concrete (device-specific) layer only -----*/ + /* private for nic device subkind ops */ + char *netbufscript; + struct nl_sock *nlsock; + struct nl_cache *qdisc_cache; + + /* private for drbd disk subkind ops */ + char *drbd_probe_script; +}; + _hidden int libxl__netbuffer_enabled(libxl__gc *gc); /*----- Domain suspend (save) state structure -----*/ @@ -2764,9 +2777,7 @@ struct libxl__domain_suspend_state { libxl__domain_suspend_state2 dss2; int hvm; int xcflags; - libxl__checkpoint_devices_state cds; - libxl__ev_time checkpoint_timeout; /* used for Remus checkpoint */ - int interval; /* checkpoint interval (for Remus) */ + libxl__remus_state rs; libxl__save_helper_state shs; libxl__logdirty_switch logdirty; /* private for libxl__domain_save_device_model */ diff --git a/tools/libxl/libxl_netbuffer.c b/tools/libxl/libxl_netbuffer.c index 235c75b..df04881 100644 --- a/tools/libxl/libxl_netbuffer.c +++ b/tools/libxl/libxl_netbuffer.c @@ -41,18 +41,19 @@ int libxl__netbuffer_enabled(libxl__gc *gc) int init_subkind_nic(libxl__checkpoint_devices_state *cds) { int rc, ret; - libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, cds); + libxl__remus_state *rs = CONTAINER_OF(cds, *rs, cds); + libxl__domain_suspend_state *dss = CONTAINER_OF(rs, *dss, rs); STATE_AO_GC(cds->ao); - cds->nlsock = nl_socket_alloc(); - if (!cds->nlsock) { + rs->nlsock = nl_socket_alloc(); + if (!rs->nlsock) { LOG(ERROR, "cannot allocate nl socket"); rc = ERROR_FAIL; goto out; } - ret = nl_connect(cds->nlsock, NETLINK_ROUTE); + ret = nl_connect(rs->nlsock, NETLINK_ROUTE); if (ret) { LOG(ERROR, "failed to open netlink socket: %s", nl_geterror(ret)); @@ -61,7 +62,7 @@ int init_subkind_nic(libxl__checkpoint_devices_state *cds) } /* get list of all qdiscs installed on network devs. */ - ret = rtnl_qdisc_alloc_cache(cds->nlsock, &cds->qdisc_cache); + ret = rtnl_qdisc_alloc_cache(rs->nlsock, &rs->qdisc_cache); if (ret) { LOG(ERROR, "failed to allocate qdisc cache: %s", nl_geterror(ret)); @@ -70,10 +71,10 @@ int init_subkind_nic(libxl__checkpoint_devices_state *cds) } if (dss->remus->netbufscript) { - cds->netbufscript = libxl__strdup(gc, dss->remus->netbufscript); + rs->netbufscript = libxl__strdup(gc, dss->remus->netbufscript); } else { - cds->netbufscript = GCSPRINTF("%s/remus-netbuf-setup", - libxl__xen_script_dir_path()); + rs->netbufscript = GCSPRINTF("%s/remus-netbuf-setup", + libxl__xen_script_dir_path()); } rc = 0; @@ -84,20 +85,22 @@ out: void cleanup_subkind_nic(libxl__checkpoint_devices_state *cds) { + libxl__remus_state *rs = CONTAINER_OF(cds, *rs, cds); + STATE_AO_GC(cds->ao); /* free qdisc cache */ - if (cds->qdisc_cache) { - nl_cache_clear(cds->qdisc_cache); - nl_cache_free(cds->qdisc_cache); - cds->qdisc_cache = NULL; + if (rs->qdisc_cache) { + nl_cache_clear(rs->qdisc_cache); + nl_cache_free(rs->qdisc_cache); + rs->qdisc_cache = NULL; } /* close & free nlsock */ - if (cds->nlsock) { - nl_close(cds->nlsock); - nl_socket_free(cds->nlsock); - cds->nlsock = NULL; + if (rs->nlsock) { + nl_close(rs->nlsock); + nl_socket_free(rs->nlsock); + rs->nlsock = NULL; } } @@ -150,13 +153,14 @@ static int init_qdisc(libxl__checkpoint_devices_state *cds, int rc, ret, ifindex; struct rtnl_link *ifb = NULL; struct rtnl_qdisc *qdisc = NULL; + libxl__remus_state *rs = CONTAINER_OF(cds, *rs, cds); STATE_AO_GC(cds->ao); /* Now that we have brought up REMUS_IFB device with plug qdisc for * this vif, so we need to refill the qdisc cache. */ - ret = nl_cache_refill(cds->nlsock, cds->qdisc_cache); + ret = nl_cache_refill(rs->nlsock, rs->qdisc_cache); if (ret) { LOG(ERROR, "cannot refill qdisc cache: %s", nl_geterror(ret)); rc = ERROR_FAIL; @@ -164,7 +168,7 @@ static int init_qdisc(libxl__checkpoint_devices_state *cds, } /* get a handle to the REMUS_IFB interface */ - ret = rtnl_link_get_kernel(cds->nlsock, 0, remus_nic->ifb, &ifb); + ret = rtnl_link_get_kernel(rs->nlsock, 0, remus_nic->ifb, &ifb); if (ret) { LOG(ERROR, "cannot obtain handle for %s: %s", remus_nic->ifb, nl_geterror(ret)); @@ -187,7 +191,7 @@ static int init_qdisc(libxl__checkpoint_devices_state *cds, * There is no need to explicitly free this qdisc as its just a * reference from the qdisc cache we allocated earlier. */ - qdisc = rtnl_qdisc_get_by_parent(cds->qdisc_cache, ifindex, TC_H_ROOT); + qdisc = rtnl_qdisc_get_by_parent(rs->qdisc_cache, ifindex, TC_H_ROOT); if (qdisc) { const char *tc_kind = rtnl_tc_get_kind(TC_CAST(qdisc)); /* Sanity check: Ensure that the root qdisc is a plug qdisc. */ @@ -238,11 +242,12 @@ static void setup_async_exec(libxl__checkpoint_device *dev, char *op) libxl__remus_device_nic *remus_nic = dev->concrete_data; libxl__checkpoint_devices_state *cds = dev->cds; libxl__async_exec_state *aes = &dev->aodev.aes; + libxl__remus_state *rs = CONTAINER_OF(cds, *rs, cds); STATE_AO_GC(cds->ao); /* Convenience aliases */ - char *const script = libxl__strdup(gc, cds->netbufscript); + char *const script = libxl__strdup(gc, rs->netbufscript); const uint32_t domid = cds->domid; const int dev_id = remus_nic->devid; const char *const vif = remus_nic->vif; @@ -333,6 +338,7 @@ static void netbuf_setup_script_cb(libxl__egc *egc, libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev); libxl__remus_device_nic *remus_nic = dev->concrete_data; libxl__checkpoint_devices_state *cds = dev->cds; + libxl__remus_state *rs = CONTAINER_OF(cds, *rs, cds); const char *out_path_base, *hotplug_error = NULL; int rc; @@ -373,7 +379,7 @@ static void netbuf_setup_script_cb(libxl__egc *egc, if (hotplug_error) { LOG(ERROR, "netbuf script %s setup failed for vif %s: %s", - cds->netbufscript, vif, hotplug_error); + rs->netbufscript, vif, hotplug_error); rc = ERROR_FAIL; goto out; } @@ -444,6 +450,7 @@ static int remus_netbuf_op(libxl__remus_device_nic *remus_nic, int buffer_op) { int rc, ret; + libxl__remus_state *rs = CONTAINER_OF(cds, *rs, cds); STATE_AO_GC(cds->ao); @@ -457,7 +464,7 @@ static int remus_netbuf_op(libxl__remus_device_nic *remus_nic, goto out; } - ret = rtnl_qdisc_add(cds->nlsock, remus_nic->qdisc, NLM_F_REQUEST); + ret = rtnl_qdisc_add(rs->nlsock, remus_nic->qdisc, NLM_F_REQUEST); if (ret) { rc = ERROR_FAIL; goto out; diff --git a/tools/libxl/libxl_remus.c b/tools/libxl/libxl_remus.c index 2ffab2a..d501cf5 100644 --- a/tools/libxl/libxl_remus.c +++ b/tools/libxl/libxl_remus.c @@ -18,6 +18,45 @@ #include "libxl_internal.h" #include "libxl_remus.h" +extern const libxl__checkpoint_device_instance_ops remus_device_nic; +extern const libxl__checkpoint_device_instance_ops remus_device_drbd_disk; +static const libxl__checkpoint_device_instance_ops *remus_ops[] = { + &remus_device_nic, + &remus_device_drbd_disk, + NULL, +}; + +/*----- helper functions -----*/ + +static int init_device_subkind(libxl__checkpoint_devices_state *cds) +{ + /* init device subkind-specific state in the libxl ctx */ + int rc; + STATE_AO_GC(cds->ao); + + if (libxl__netbuffer_enabled(gc)) { + rc = init_subkind_nic(cds); + if (rc) goto out; + } + + rc = init_subkind_drbd_disk(cds); + if (rc) goto out; + + rc = 0; +out: + return rc; +} + +static void cleanup_device_subkind(libxl__checkpoint_devices_state *cds) +{ + /* cleanup device subkind-specific state in the libxl ctx */ + STATE_AO_GC(cds->ao); + + if (libxl__netbuffer_enabled(gc)) + cleanup_subkind_nic(cds); + + cleanup_subkind_drbd_disk(cds); +} /*----- remus: setup the environment -----*/ static void libxl__remus_setup_done(libxl__egc *egc, @@ -27,11 +66,12 @@ static void libxl__remus_setup_failed(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc); -void libxl__remus_setup(libxl__egc *egc, - libxl__domain_suspend_state *dss) +void libxl__remus_setup(libxl__egc *egc, libxl__remus_state *rs) { + libxl__domain_suspend_state *dss = CONTAINER_OF(rs, *dss, rs); + /* Convenience aliases */ - libxl__checkpoint_devices_state *const cds = &dss->cds; + libxl__checkpoint_devices_state *const cds = &rs->cds; const libxl_domain_remus_info *const info = dss->remus; STATE_AO_GC(dss->ao); @@ -51,19 +91,24 @@ void libxl__remus_setup(libxl__egc *egc, cds->egc = egc; cds->domid = dss->domid; cds->callback = libxl__remus_setup_done; + cds->ops = remus_ops; + rs->interval = info->interval; + + if (init_device_subkind(cds)) + goto out; libxl__checkpoint_devices_setup(egc, cds); return; out: - libxl__remus_setup_failed(egc, cds, ERROR_FAIL); + dss->callback(egc, dss, ERROR_FAIL); } static void libxl__remus_setup_done(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc) { - libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, cds); + libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, rs.cds); STATE_AO_GC(dss->ao); if (!rc) { @@ -81,13 +126,15 @@ static void libxl__remus_setup_failed(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc) { - libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, cds); + libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, rs.cds); STATE_AO_GC(dss->ao); if (rc) LOG(ERROR, "Remus: failed to teardown device after setup failed" " for guest with domid %u, rc %d", dss->domid, rc); + cleanup_device_subkind(cds); + dss->callback(egc, dss, rc); } @@ -98,9 +145,11 @@ static void remus_teardown_done(libxl__egc *egc, int rc); void libxl__remus_teardown(libxl__egc *egc, - libxl__domain_suspend_state *dss, + libxl__remus_state *rs, int rc) { + libxl__domain_suspend_state *dss = CONTAINER_OF(rs, *dss, rs); + EGC_GC; /* @@ -111,21 +160,23 @@ void libxl__remus_teardown(libxl__egc *egc, */ LOG(WARN, "Remus: Domain suspend terminated with rc %d," " teardown Remus devices...", rc); - dss->cds.callback = remus_teardown_done; - libxl__checkpoint_devices_teardown(egc, &dss->cds); + dss->rs.cds.callback = remus_teardown_done; + libxl__checkpoint_devices_teardown(egc, &dss->rs.cds); } static void remus_teardown_done(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc) { - libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, cds); + libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, rs.cds); STATE_AO_GC(dss->ao); if (rc) LOG(ERROR, "Remus: failed to teardown device for guest with domid %u," " rc %d", dss->domid, rc); + cleanup_device_subkind(cds); + dss->callback(egc, dss, rc); } @@ -158,7 +209,7 @@ static void remus_domain_suspend_callback_common_done(libxl__egc *egc, if (!ok) goto out; - libxl__checkpoint_devices_state *const cds = &dss->cds; + libxl__checkpoint_devices_state *const cds = &dss->rs.cds; cds->callback = remus_devices_postsuspend_cb; libxl__checkpoint_devices_postsuspend(egc, cds); return; @@ -172,7 +223,7 @@ static void remus_devices_postsuspend_cb(libxl__egc *egc, int rc) { int ok = 0; - libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, cds); + libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, rs.cds); if (rc) goto out; @@ -196,7 +247,7 @@ void libxl__remus_domain_resume_callback(void *data) libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); STATE_AO_GC(dss->ao); - libxl__checkpoint_devices_state *const cds = &dss->cds; + libxl__checkpoint_devices_state *const cds = &dss->rs.cds; cds->callback = remus_devices_preresume_cb; libxl__checkpoint_devices_preresume(egc, cds); } @@ -206,7 +257,7 @@ static void remus_devices_preresume_cb(libxl__egc *egc, int rc) { int ok = 0; - libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, cds); + libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, rs.cds); STATE_AO_GC(dss->ao); if (rc) @@ -256,7 +307,7 @@ static void remus_checkpoint_dm_saved(libxl__egc *egc, libxl__domain_suspend_state *dss, int rc) { /* Convenience aliases */ - libxl__checkpoint_devices_state *const cds = &dss->cds; + libxl__checkpoint_devices_state *const cds = &dss->rs.cds; STATE_AO_GC(dss->ao); @@ -278,7 +329,7 @@ static void remus_devices_commit_cb(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc) { - libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, cds); + libxl__domain_suspend_state *dss = CONTAINER_OF(cds, *dss, rs.cds); STATE_AO_GC(dss->ao); @@ -296,9 +347,9 @@ static void remus_devices_commit_cb(libxl__egc *egc, */ /* Set checkpoint interval timeout */ - rc = libxl__ev_time_register_rel(gc, &dss->checkpoint_timeout, + rc = libxl__ev_time_register_rel(gc, &dss->rs.checkpoint_timeout, remus_next_checkpoint, - dss->interval); + dss->rs.interval); if (rc) goto out; @@ -313,7 +364,7 @@ static void remus_next_checkpoint(libxl__egc *egc, libxl__ev_time *ev, const struct timeval *requested_abs) { libxl__domain_suspend_state *dss = - CONTAINER_OF(ev, *dss, checkpoint_timeout); + CONTAINER_OF(ev, *dss, rs.checkpoint_timeout); STATE_AO_GC(dss->ao); diff --git a/tools/libxl/libxl_remus.h b/tools/libxl/libxl_remus.h index 53e5e81..15bbbe8 100644 --- a/tools/libxl/libxl_remus.h +++ b/tools/libxl/libxl_remus.h @@ -16,10 +16,9 @@ #ifndef LIBXL_REMUS_H #define LIBXL_REMUS_H -void libxl__remus_setup(libxl__egc *egc, - libxl__domain_suspend_state *dss); +void libxl__remus_setup(libxl__egc *egc, libxl__remus_state *rs); void libxl__remus_teardown(libxl__egc *egc, - libxl__domain_suspend_state *dss, + libxl__remus_state *rs, int rc); void libxl__remus_domain_suspend_callback(void *data); void libxl__remus_domain_resume_callback(void *data); diff --git a/tools/libxl/libxl_remus_disk_drbd.c b/tools/libxl/libxl_remus_disk_drbd.c index 3f1e16a..586e1b6 100644 --- a/tools/libxl/libxl_remus_disk_drbd.c +++ b/tools/libxl/libxl_remus_disk_drbd.c @@ -28,10 +28,12 @@ typedef struct libxl__remus_drbd_disk { int init_subkind_drbd_disk(libxl__checkpoint_devices_state *cds) { + libxl__remus_state *rs = CONTAINER_OF(cds, *rs, cds); + STATE_AO_GC(cds->ao); - cds->drbd_probe_script = GCSPRINTF("%s/block-drbd-probe", - libxl__xen_script_dir_path()); + rs->drbd_probe_script = GCSPRINTF("%s/block-drbd-probe", + libxl__xen_script_dir_path()); return 0; } @@ -95,6 +97,7 @@ static void match_async_exec(libxl__egc *egc, libxl__checkpoint_device *dev) int arraysize, nr = 0, rc; const libxl_device_disk *disk = dev->backend_dev; libxl__async_exec_state *aes = &dev->aodev.aes; + libxl__remus_state *rs = CONTAINER_OF(dev->cds, *rs, cds); STATE_AO_GC(dev->cds->ao); /* setup env & args */ @@ -106,7 +109,7 @@ static void match_async_exec(libxl__egc *egc, libxl__checkpoint_device *dev) arraysize = 3; nr = 0; GCNEW_ARRAY(aes->args, arraysize); - aes->args[nr++] = dev->cds->drbd_probe_script; + aes->args[nr++] = rs->drbd_probe_script; aes->args[nr++] = disk->pdev_path; aes->args[nr++] = NULL; assert(nr <= arraysize); -- 1.9.3