All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Campbell <ian.campbell@citrix.com>
To: Yang Hongyang <yanghy@cn.fujitsu.com>
Cc: wei.liu2@citrix.com, wency@cn.fujitsu.com,
	andrew.cooper3@citrix.com, yunhong.jiang@intel.com,
	eddie.dong@intel.com, xen-devel@lists.xen.org,
	guijianfeng@cn.fujitsu.com, rshriram@cs.ubc.ca,
	ian.jackson@eu.citrix.com
Subject: Re: [PATCH v3 COLOPre 24/26] tools/libxl: rename remus device to checkpoint device
Date: Tue, 30 Jun 2015 11:43:29 +0100	[thread overview]
Message-ID: <1435661009.21469.86.camel@citrix.com> (raw)
In-Reply-To: <1435213552-10556-25-git-send-email-yanghy@cn.fujitsu.com>

On Thu, 2015-06-25 at 14:25 +0800, Yang Hongyang wrote:
> This patch is auto generated by the following commands:
>  1. git mv tools/libxl/libxl_remus_device.c tools/libxl/libxl_checkpoint_device.c

Please use the -M option to git format-patch/send-email, which will make
the move and subsequent changes far more apparent.

>  2. perl -pi -e 's/libxl_remus_device/libxl_checkpoint_device/g' tools/libxl/Makefile
>  3. perl -pi -e 's/\blibxl__remus_devices/libxl__checkpoint_devices/g' tools/libxl/*.[ch]
>  4. perl -pi -e 's/\blibxl__remus_device\b/libxl__checkpoint_device/g' tools/libxl/*.[ch]
>  5. perl -pi -e 's/\blibxl__remus_device_instance_ops\b/libxl__checkpoint_device_instance_ops/g' tools/libxl/*.[ch]
>  6. perl -pi -e 's/\blibxl__remus_callback\b/libxl__checkpoint_callback/g' tools/libxl/*.[ch]
>  7. perl -pi -e 's/\bremus_device_init\b/checkpoint_device_init/g' tools/libxl/*.[ch]
>  8. perl -pi -e 's/\bremus_devices_setup\b/checkpoint_devices_setup/g' tools/libxl/*.[ch]
>  9. perl -pi -e 's/\bdefine_remus_checkpoint_api\b/define_checkpoint_api/g' tools/libxl/*.[ch]
> 10. perl -pi -e 's/\brds\b/cds/g' tools/libxl/*.[ch]
> 11. perl -pi -e 's/REMUS_DEVICE/CHECKPOINT_DEVICE/g' tools/libxl/*.[ch] tools/libxl/*.idl
> 12. perl -pi -e 's/REMUS_DEVOPS/CHECKPOINT_DEVOPS/g' tools/libxl/*.[ch] tools/libxl/*.idl
> 13. perl -pi -e 's/\bremus\b/checkpoint/g' tools/libxl/libxl_checkpoint_device.[ch]
> 14. perl -pi -e 's/\bremus device/checkpoint device/g' tools/libxl/libxl_internal.h
> 15. perl -pi -e 's/\bRemus device/checkpoint device/g' tools/libxl/libxl_internal.h
> 16. perl -pi -e 's/\bremus abstract/checkpoint abstract/g' tools/libxl/libxl_internal.h
> 17. perl -pi -e 's/\bremus invocation/checkpoint invocation/g' tools/libxl/libxl_internal.h
> 18. perl -pi -e 's/\blibxl__remus_device_\(/libxl__checkpoint_device_(/g' tools/libxl/libxl_internal.h

Wowza!

> 
> Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
> Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>
> ---
>  tools/libxl/Makefile                  |   2 +-
>  tools/libxl/libxl_checkpoint_device.c | 327 ++++++++++++++++++++++++++++++++++
>  tools/libxl/libxl_internal.h          | 112 ++++++------
>  tools/libxl/libxl_netbuffer.c         | 108 +++++------
>  tools/libxl/libxl_nonetbuffer.c       |  10 +-
>  tools/libxl/libxl_remus.c             |  76 ++++----
>  tools/libxl/libxl_remus_device.c      | 327 ----------------------------------
>  tools/libxl/libxl_remus_disk_drbd.c   |  52 +++---
>  tools/libxl/libxl_types.idl           |   4 +-
>  9 files changed, 509 insertions(+), 509 deletions(-)
>  create mode 100644 tools/libxl/libxl_checkpoint_device.c
>  delete mode 100644 tools/libxl/libxl_remus_device.c
> 
> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> index d61c191..2f4efd4 100644
> --- a/tools/libxl/Makefile
> +++ b/tools/libxl/Makefile
> @@ -56,7 +56,7 @@ else
>  LIBXL_OBJS-y += libxl_nonetbuffer.o
>  endif
>  
> -LIBXL_OBJS-y += libxl_remus.o libxl_remus_device.o libxl_remus_disk_drbd.o
> +LIBXL_OBJS-y += libxl_remus.o libxl_checkpoint_device.o libxl_remus_disk_drbd.o
>  
>  LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o libxl_x86.o libxl_psr.o
>  LIBXL_OBJS-$(CONFIG_ARM) += libxl_nocpuid.o libxl_arm.o libxl_libfdt_compat.o
> diff --git a/tools/libxl/libxl_checkpoint_device.c b/tools/libxl/libxl_checkpoint_device.c
> new file mode 100644
> index 0000000..109cd23
> --- /dev/null
> +++ b/tools/libxl/libxl_checkpoint_device.c
> @@ -0,0 +1,327 @@
> +/*
> + * Copyright (C) 2014 FUJITSU LIMITED
> + * Author: Yang Hongyang <yanghy@cn.fujitsu.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU Lesser General Public License as published
> + * by the Free Software Foundation; version 2.1 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU Lesser General Public License for more details.
> + */
> +
> +#include "libxl_osdeps.h" /* must come before any other headers */
> +
> +#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 */
> +
> +static void all_devices_setup_cb(libxl__egc *egc,
> +                                 libxl__multidev *multidev,
> +                                 int rc);
> +static void device_setup_iterate(libxl__egc *egc,
> +                                 libxl__ao_device *aodev);
> +static void devices_teardown_cb(libxl__egc *egc,
> +                                libxl__multidev *multidev,
> +                                int rc);
> +
> +/* checkpoint device setup and teardown */
> +
> +static libxl__checkpoint_device* checkpoint_device_init(libxl__egc *egc,
> +                                              libxl__checkpoint_devices_state *cds,
> +                                              libxl__device_kind kind,
> +                                              void *libxl_dev)
> +{
> +    libxl__checkpoint_device *dev = NULL;
> +
> +    STATE_AO_GC(cds->ao);
> +    GCNEW(dev);
> +    dev->backend_dev = libxl_dev;
> +    dev->kind = kind;
> +    dev->cds = cds;
> +
> +    return dev;
> +}
> +
> +static void checkpoint_devices_setup(libxl__egc *egc,
> +                                libxl__checkpoint_devices_state *cds);
> +
> +void libxl__checkpoint_devices_setup(libxl__egc *egc, libxl__checkpoint_devices_state *cds)
> +{
> +    int i, rc;
> +
> +    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;
> +
> +    if (cds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VIF))
> +        cds->nics = libxl_device_nic_list(CTX, cds->domid, &cds->num_nics);
> +
> +    if (cds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VBD))
> +        cds->disks = libxl_device_disk_list(CTX, cds->domid, &cds->num_disks);
> +
> +    if (cds->num_nics == 0 && cds->num_disks == 0)
> +        goto out;
> +
> +    GCNEW_ARRAY(cds->devs, cds->num_nics + cds->num_disks);
> +
> +    for (i = 0; i < cds->num_nics; i++) {
> +        cds->devs[cds->num_devices++] = checkpoint_device_init(egc, cds,
> +                                                LIBXL__DEVICE_KIND_VIF,
> +                                                &cds->nics[i]);
> +    }
> +
> +    for (i = 0; i < cds->num_disks; i++) {
> +        cds->devs[cds->num_devices++] = checkpoint_device_init(egc, cds,
> +                                                LIBXL__DEVICE_KIND_VBD,
> +                                                &cds->disks[i]);
> +    }
> +
> +    checkpoint_devices_setup(egc, cds);
> +
> +    return;
> +
> +out:
> +    cds->callback(egc, cds, rc);
> +}
> +
> +static void checkpoint_devices_setup(libxl__egc *egc,
> +                                libxl__checkpoint_devices_state *cds)
> +{
> +    int i, rc;
> +
> +    STATE_AO_GC(cds->ao);
> +
> +    libxl__multidev_begin(ao, &cds->multidev);
> +    cds->multidev.callback = all_devices_setup_cb;
> +    for (i = 0; i < cds->num_devices; i++) {
> +        libxl__checkpoint_device *dev = cds->devs[i];
> +        dev->ops_index = -1;
> +        libxl__multidev_prepare_with_aodev(&cds->multidev, &dev->aodev);
> +
> +        dev->aodev.rc = ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED;
> +        dev->aodev.callback = device_setup_iterate;
> +        device_setup_iterate(egc,&dev->aodev);
> +    }
> +
> +    rc = 0;
> +    libxl__multidev_prepared(egc, &cds->multidev, rc);
> +}
> +
> +
> +static void device_setup_iterate(libxl__egc *egc, libxl__ao_device *aodev)
> +{
> +    libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev);
> +    EGC_GC;
> +
> +    if (aodev->rc != ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED &&
> +        aodev->rc != ERROR_CHECKPOINT_DEVOPS_DOES_NOT_MATCH)
> +        /* might be success or disaster */
> +        goto out;
> +
> +    do {
> +        dev->ops = remus_ops[++dev->ops_index];
> +        if (!dev->ops) {
> +            libxl_device_nic * nic = NULL;
> +            libxl_device_disk * disk = NULL;
> +            uint32_t domid;
> +            int devid;
> +            if (dev->kind == LIBXL__DEVICE_KIND_VIF) {
> +                nic = (libxl_device_nic *)dev->backend_dev;
> +                domid = nic->backend_domid;
> +                devid = nic->devid;
> +            } else if (dev->kind == LIBXL__DEVICE_KIND_VBD) {
> +                disk = (libxl_device_disk *)dev->backend_dev;
> +                domid = disk->backend_domid;
> +                devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
> +            } else {
> +                LOG(ERROR,"device kind not handled by checkpoint: %s",
> +                    libxl__device_kind_to_string(dev->kind));
> +                aodev->rc = ERROR_FAIL;
> +                goto out;
> +            }
> +            LOG(ERROR,"device not handled by checkpoint"
> +                " (device=%s:%"PRId32"/%"PRId32")",
> +                libxl__device_kind_to_string(dev->kind),
> +                domid, devid);
> +            aodev->rc = ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED;
> +            goto out;
> +        }
> +    } while (dev->ops->kind != dev->kind);
> +
> +    /* found the next ops_index to try */
> +    assert(dev->aodev.callback == device_setup_iterate);
> +    dev->ops->setup(egc,dev);
> +    return;
> +
> + out:
> +    libxl__multidev_one_callback(egc,aodev);
> +}
> +
> +static void all_devices_setup_cb(libxl__egc *egc,
> +                                 libxl__multidev *multidev,
> +                                 int rc)
> +{
> +    STATE_AO_GC(multidev->ao);
> +
> +    /* Convenience aliases */
> +    libxl__checkpoint_devices_state *const cds =
> +                            CONTAINER_OF(multidev, *cds, multidev);
> +
> +    cds->callback(egc, cds, rc);
> +}
> +
> +void libxl__checkpoint_devices_teardown(libxl__egc *egc,
> +                                   libxl__checkpoint_devices_state *cds)
> +{
> +    int i;
> +    libxl__checkpoint_device *dev;
> +
> +    STATE_AO_GC(cds->ao);
> +
> +    libxl__multidev_begin(ao, &cds->multidev);
> +    cds->multidev.callback = devices_teardown_cb;
> +    for (i = 0; i < cds->num_devices; i++) {
> +        dev = cds->devs[i];
> +        if (!dev->ops || !dev->matched)
> +            continue;
> +
> +        libxl__multidev_prepare_with_aodev(&cds->multidev, &dev->aodev);
> +        dev->ops->teardown(egc,dev);
> +    }
> +
> +    libxl__multidev_prepared(egc, &cds->multidev, 0);
> +}
> +
> +static void devices_teardown_cb(libxl__egc *egc,
> +                                libxl__multidev *multidev,
> +                                int rc)
> +{
> +    int i;
> +
> +    STATE_AO_GC(multidev->ao);
> +
> +    /* Convenience aliases */
> +    libxl__checkpoint_devices_state *const cds =
> +                            CONTAINER_OF(multidev, *cds, multidev);
> +
> +    /* clean nic */
> +    for (i = 0; i < cds->num_nics; i++)
> +        libxl_device_nic_dispose(&cds->nics[i]);
> +    free(cds->nics);
> +    cds->nics = NULL;
> +    cds->num_nics = 0;
> +
> +    /* clean disk */
> +    for (i = 0; i < cds->num_disks; i++)
> +        libxl_device_disk_dispose(&cds->disks[i]);
> +    free(cds->disks);
> +    cds->disks = NULL;
> +    cds->num_disks = 0;
> +
> +    cleanup_device_subkind(cds);
> +
> +    cds->callback(egc, cds, rc);
> +}
> +
> +/*----- checkpointing APIs -----*/
> +
> +/* callbacks */
> +
> +static void devices_checkpoint_cb(libxl__egc *egc,
> +                                  libxl__multidev *multidev,
> +                                  int rc);
> +
> +/* API implementations */
> +
> +#define define_checkpoint_api(api)                                \
> +void libxl__checkpoint_devices_##api(libxl__egc *egc,                        \
> +                                libxl__checkpoint_devices_state *cds)        \
> +{                                                                       \
> +    int i;                                                              \
> +    libxl__checkpoint_device *dev;                                           \
> +                                                                        \
> +    STATE_AO_GC(cds->ao);                                               \
> +                                                                        \
> +    libxl__multidev_begin(ao, &cds->multidev);                          \
> +    cds->multidev.callback = devices_checkpoint_cb;                     \
> +    for (i = 0; i < cds->num_devices; i++) {                            \
> +        dev = cds->devs[i];                                             \
> +        if (!dev->matched || !dev->ops->api)                            \
> +            continue;                                                   \
> +        libxl__multidev_prepare_with_aodev(&cds->multidev, &dev->aodev);\
> +        dev->ops->api(egc,dev);                                         \
> +    }                                                                   \
> +                                                                        \
> +    libxl__multidev_prepared(egc, &cds->multidev, 0);                   \
> +}
> +
> +define_checkpoint_api(postsuspend);
> +
> +define_checkpoint_api(preresume);
> +
> +define_checkpoint_api(commit);
> +
> +static void devices_checkpoint_cb(libxl__egc *egc,
> +                                  libxl__multidev *multidev,
> +                                  int rc)
> +{
> +    STATE_AO_GC(multidev->ao);
> +
> +    /* Convenience aliases */
> +    libxl__checkpoint_devices_state *const cds =
> +                            CONTAINER_OF(multidev, *cds, multidev);
> +
> +    cds->callback(egc, cds, rc);
> +}
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index bd369f2..ae3b964 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -2651,9 +2651,9 @@ typedef struct libxl__save_helper_state {
>                        * marshalling and xc callback functions */
>  } libxl__save_helper_state;
>  
> -/*----- remus device related state structure -----*/
> +/*----- checkpoint device related state structure -----*/
>  /*
> - * The abstract Remus device layer exposes a common
> + * The abstract checkpoint device layer exposes a common
>   * set of API to [external] libxl for manipulating devices attached to
>   * a guest protected by Remus. The device layer also exposes a set of
>   * [internal] interfaces that every device type must implement.
> @@ -2661,34 +2661,34 @@ typedef struct libxl__save_helper_state {
>   * The following API are exposed to libxl:
>   *
>   * One-time configuration operations:
> - *  +libxl__remus_devices_setup
> + *  +libxl__checkpoint_devices_setup
>   *    > Enable output buffering for NICs, setup disk replication, etc.
> - *  +libxl__remus_devices_teardown
> + *  +libxl__checkpoint_devices_teardown
>   *    > Disable output buffering and disk replication; teardown any
>   *       associated external setups like qdiscs for NICs.
>   *
>   * Operations executed every checkpoint (in order of invocation):
> - *  +libxl__remus_devices_postsuspend
> - *  +libxl__remus_devices_preresume
> - *  +libxl__remus_devices_commit
> + *  +libxl__checkpoint_devices_postsuspend
> + *  +libxl__checkpoint_devices_preresume
> + *  +libxl__checkpoint_devices_commit
>   *
>   * Each device type needs to implement the interfaces specified in
> - * the libxl__remus_device_instance_ops if it wishes to support Remus.
> + * the libxl__checkpoint_device_instance_ops if it wishes to support Remus.
>   *
> - * The high-level control flow through the Remus device layer is shown below:
> + * The high-level control flow through the checkpoint device layer is shown below:
>   *
>   * xl remus
>   *  |->  libxl_domain_remus_start
> - *    |-> libxl__remus_devices_setup
> - *      |-> Per-checkpoint libxl__remus_devices_[postsuspend,preresume,commit]
> + *    |-> libxl__checkpoint_devices_setup
> + *      |-> Per-checkpoint libxl__checkpoint_devices_[postsuspend,preresume,commit]
>   *        ...
>   *        |-> On backup failure, network error or other internal errors:
> - *            libxl__remus_devices_teardown
> + *            libxl__checkpoint_devices_teardown
>   */
>  
> -typedef struct libxl__remus_device libxl__remus_device;
> -typedef struct libxl__remus_devices_state libxl__remus_devices_state;
> -typedef struct libxl__remus_device_instance_ops libxl__remus_device_instance_ops;
> +typedef struct libxl__checkpoint_device libxl__checkpoint_device;
> +typedef struct libxl__checkpoint_devices_state libxl__checkpoint_devices_state;
> +typedef struct libxl__checkpoint_device_instance_ops libxl__checkpoint_device_instance_ops;
>  
>  /*
>   * Interfaces to be implemented by every device subkind that wishes to
> @@ -2698,7 +2698,7 @@ typedef struct libxl__remus_device_instance_ops libxl__remus_device_instance_ops
>   * synchronous and call dev->aodev.callback directly (as the last
>   * thing they do).
>   */
> -struct libxl__remus_device_instance_ops {
> +struct libxl__checkpoint_device_instance_ops {
>      /* the device kind this ops belongs to... */
>      libxl__device_kind kind;
>  
> @@ -2709,12 +2709,12 @@ struct libxl__remus_device_instance_ops {
>       * Asynchronous.
>       */
>  
> -    void (*postsuspend)(libxl__egc *egc, libxl__remus_device *dev);
> -    void (*preresume)(libxl__egc *egc, libxl__remus_device *dev);
> -    void (*commit)(libxl__egc *egc, libxl__remus_device *dev);
> +    void (*postsuspend)(libxl__egc *egc, libxl__checkpoint_device *dev);
> +    void (*preresume)(libxl__egc *egc, libxl__checkpoint_device *dev);
> +    void (*commit)(libxl__egc *egc, libxl__checkpoint_device *dev);
>  
>      /*
> -     * setup() and teardown() are refer to the actual remus device.
> +     * setup() and teardown() are refer to the actual checkpoint device.
>       * Asynchronous.
>       * teardown is called even if setup fails.
>       */
> @@ -2723,45 +2723,45 @@ struct libxl__remus_device_instance_ops {
>       * device. If matched, the device will then be managed with this set of
>       * subkind operations.
>       * Yields 0 if the device successfully set up.
> -     * REMUS_DEVOPS_DOES_NOT_MATCH if the ops does not match the device.
> +     * CHECKPOINT_DEVOPS_DOES_NOT_MATCH if the ops does not match the device.
>       * any other rc indicates failure.
>       */
> -    void (*setup)(libxl__egc *egc, libxl__remus_device *dev);
> -    void (*teardown)(libxl__egc *egc, libxl__remus_device *dev);
> +    void (*setup)(libxl__egc *egc, libxl__checkpoint_device *dev);
> +    void (*teardown)(libxl__egc *egc, libxl__checkpoint_device *dev);
>  };
>  
> -int init_subkind_nic(libxl__remus_devices_state *rds);
> -void cleanup_subkind_nic(libxl__remus_devices_state *rds);
> -int init_subkind_drbd_disk(libxl__remus_devices_state *rds);
> -void cleanup_subkind_drbd_disk(libxl__remus_devices_state *rds);
> +int init_subkind_nic(libxl__checkpoint_devices_state *cds);
> +void cleanup_subkind_nic(libxl__checkpoint_devices_state *cds);
> +int init_subkind_drbd_disk(libxl__checkpoint_devices_state *cds);
> +void cleanup_subkind_drbd_disk(libxl__checkpoint_devices_state *cds);
>  
> -typedef void libxl__remus_callback(libxl__egc *,
> -                                   libxl__remus_devices_state *, int rc);
> +typedef void libxl__checkpoint_callback(libxl__egc *,
> +                                   libxl__checkpoint_devices_state *, int rc);
>  
>  /*
> - * State associated with a remus invocation, including parameters
> - * passed to the remus abstract device layer by the remus
> + * State associated with a checkpoint invocation, including parameters
> + * passed to the checkpoint abstract device layer by the remus
>   * save/restore machinery.
>   */
> -struct libxl__remus_devices_state {
> -    /*---- must be set by caller of libxl__remus_device_(setup|teardown) ----*/
> +struct libxl__checkpoint_devices_state {
> +    /*---- must be set by caller of libxl__checkpoint_device_(setup|teardown) ----*/
>  
>      libxl__ao *ao;
>      uint32_t domid;
> -    libxl__remus_callback *callback;
> +    libxl__checkpoint_callback *callback;
>      int device_kind_flags;
>  
>      /*----- private for abstract layer only -----*/
>  
>      int num_devices;
>      /*
> -     * this array is allocated before setup the remus devices by the
> -     * remus abstract layer.
> -     * devs may be NULL, means there's no remus devices that has been set up.
> +     * this array is allocated before setup the checkpoint devices by the
> +     * checkpoint abstract layer.
> +     * devs may be NULL, means there's no checkpoint devices that has been set up.
>       * the size of this array is 'num_devices', which is the total number
>       * of libxl nic devices and disk devices(num_nics + num_disks).
>       */
> -    libxl__remus_device **devs;
> +    libxl__checkpoint_device **devs;
>  
>      libxl_device_nic *nics;
>      int num_nics;
> @@ -2783,20 +2783,20 @@ struct libxl__remus_devices_state {
>  
>  /*
>   * Information about a single device being handled by remus.
> - * Allocated by the remus abstract layer.
> + * Allocated by the checkpoint abstract layer.
>   */
> -struct libxl__remus_device {
> +struct libxl__checkpoint_device {
>      /*----- shared between abstract and concrete layers -----*/
>      /*
>       * if this is true, that means the subkind ops match the device
>       */
>      bool matched;
>  
> -    /*----- set by remus device abstruct layer -----*/
> -    /* libxl__device_* which this remus device related to */
> +    /*----- set by checkpoint device abstruct layer -----*/
> +    /* libxl__device_* which this checkpoint device related to */
>      const void *backend_dev;
>      libxl__device_kind kind;
> -    libxl__remus_devices_state *rds;
> +    libxl__checkpoint_devices_state *cds;
>      libxl__ao_device aodev;
>  
>      /*----- private for abstract layer only -----*/
> @@ -2807,7 +2807,7 @@ struct libxl__remus_device {
>       * individual devices.
>       */
>      int ops_index;
> -    const libxl__remus_device_instance_ops *ops;
> +    const libxl__checkpoint_device_instance_ops *ops;
>  
>      /*----- private for concrete (device-specific) layer -----*/
>  
> @@ -2815,17 +2815,17 @@ struct libxl__remus_device {
>      void *concrete_data;
>  };
>  
> -/* the following 5 APIs are async ops, call rds->callback when done */
> -_hidden void libxl__remus_devices_setup(libxl__egc *egc,
> -                                        libxl__remus_devices_state *rds);
> -_hidden void libxl__remus_devices_teardown(libxl__egc *egc,
> -                                           libxl__remus_devices_state *rds);
> -_hidden void libxl__remus_devices_postsuspend(libxl__egc *egc,
> -                                              libxl__remus_devices_state *rds);
> -_hidden void libxl__remus_devices_preresume(libxl__egc *egc,
> -                                            libxl__remus_devices_state *rds);
> -_hidden void libxl__remus_devices_commit(libxl__egc *egc,
> -                                         libxl__remus_devices_state *rds);
> +/* the following 5 APIs are async ops, call cds->callback when done */
> +_hidden void libxl__checkpoint_devices_setup(libxl__egc *egc,
> +                                        libxl__checkpoint_devices_state *cds);
> +_hidden void libxl__checkpoint_devices_teardown(libxl__egc *egc,
> +                                           libxl__checkpoint_devices_state *cds);
> +_hidden void libxl__checkpoint_devices_postsuspend(libxl__egc *egc,
> +                                              libxl__checkpoint_devices_state *cds);
> +_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);
>  _hidden int libxl__netbuffer_enabled(libxl__gc *gc);
>  
>  /*----- Legacy conversion helper -----*/
> @@ -2959,7 +2959,7 @@ struct libxl__domain_save_state {
>      libxl__domain_suspend_state dsps;
>      int hvm;
>      int xcflags;
> -    libxl__remus_devices_state rds;
> +    libxl__checkpoint_devices_state cds;
>      libxl__ev_time checkpoint_timeout; /* used for Remus checkpoint */
>      int interval; /* checkpoint interval (for Remus) */
>      libxl__save_helper_state shs;
> diff --git a/tools/libxl/libxl_netbuffer.c b/tools/libxl/libxl_netbuffer.c
> index 71c6531..86afba6 100644
> --- a/tools/libxl/libxl_netbuffer.c
> +++ b/tools/libxl/libxl_netbuffer.c
> @@ -38,21 +38,21 @@ int libxl__netbuffer_enabled(libxl__gc *gc)
>      return 1;
>  }
>  
> -int init_subkind_nic(libxl__remus_devices_state *rds)
> +int init_subkind_nic(libxl__checkpoint_devices_state *cds)
>  {
>      int rc, ret;
> -    libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds);
> +    libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds);
>  
> -    STATE_AO_GC(rds->ao);
> +    STATE_AO_GC(cds->ao);
>  
> -    rds->nlsock = nl_socket_alloc();
> -    if (!rds->nlsock) {
> +    cds->nlsock = nl_socket_alloc();
> +    if (!cds->nlsock) {
>          LOG(ERROR, "cannot allocate nl socket");
>          rc = ERROR_FAIL;
>          goto out;
>      }
>  
> -    ret = nl_connect(rds->nlsock, NETLINK_ROUTE);
> +    ret = nl_connect(cds->nlsock, NETLINK_ROUTE);
>      if (ret) {
>          LOG(ERROR, "failed to open netlink socket: %s",
>              nl_geterror(ret));
> @@ -61,7 +61,7 @@ int init_subkind_nic(libxl__remus_devices_state *rds)
>      }
>  
>      /* get list of all qdiscs installed on network devs. */
> -    ret = rtnl_qdisc_alloc_cache(rds->nlsock, &rds->qdisc_cache);
> +    ret = rtnl_qdisc_alloc_cache(cds->nlsock, &cds->qdisc_cache);
>      if (ret) {
>          LOG(ERROR, "failed to allocate qdisc cache: %s",
>              nl_geterror(ret));
> @@ -70,9 +70,9 @@ int init_subkind_nic(libxl__remus_devices_state *rds)
>      }
>  
>      if (dss->remus->netbufscript) {
> -        rds->netbufscript = libxl__strdup(gc, dss->remus->netbufscript);
> +        cds->netbufscript = libxl__strdup(gc, dss->remus->netbufscript);
>      } else {
> -        rds->netbufscript = GCSPRINTF("%s/remus-netbuf-setup",
> +        cds->netbufscript = GCSPRINTF("%s/remus-netbuf-setup",
>                                        libxl__xen_script_dir_path());
>      }
>  
> @@ -82,22 +82,22 @@ out:
>      return rc;
>  }
>  
> -void cleanup_subkind_nic(libxl__remus_devices_state *rds)
> +void cleanup_subkind_nic(libxl__checkpoint_devices_state *cds)
>  {
> -    STATE_AO_GC(rds->ao);
> +    STATE_AO_GC(cds->ao);
>  
>      /* free qdisc cache */
> -    if (rds->qdisc_cache) {
> -        nl_cache_clear(rds->qdisc_cache);
> -        nl_cache_free(rds->qdisc_cache);
> -        rds->qdisc_cache = NULL;
> +    if (cds->qdisc_cache) {
> +        nl_cache_clear(cds->qdisc_cache);
> +        nl_cache_free(cds->qdisc_cache);
> +        cds->qdisc_cache = NULL;
>      }
>  
>      /* close & free nlsock */
> -    if (rds->nlsock) {
> -        nl_close(rds->nlsock);
> -        nl_socket_free(rds->nlsock);
> -        rds->nlsock = NULL;
> +    if (cds->nlsock) {
> +        nl_close(cds->nlsock);
> +        nl_socket_free(cds->nlsock);
> +        cds->nlsock = NULL;
>      }
>  }
>  
> @@ -111,17 +111,17 @@ void cleanup_subkind_nic(libxl__remus_devices_state *rds)
>   * it must ONLY be used for remus because if driver domains
>   * were in use it would constitute a security vulnerability.
>   */
> -static const char *get_vifname(libxl__remus_device *dev,
> +static const char *get_vifname(libxl__checkpoint_device *dev,
>                                 const libxl_device_nic *nic)
>  {
>      const char *vifname = NULL;
>      const char *path;
>      int rc;
>  
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      /* Convenience aliases */
> -    const uint32_t domid = dev->rds->domid;
> +    const uint32_t domid = dev->cds->domid;
>  
>      path = GCSPRINTF("%s/backend/vif/%d/%d/vifname",
>                       libxl__xs_get_dompath(gc, 0), domid, nic->devid);
> @@ -144,19 +144,19 @@ static void free_qdisc(libxl__remus_device_nic *remus_nic)
>      remus_nic->qdisc = NULL;
>  }
>  
> -static int init_qdisc(libxl__remus_devices_state *rds,
> +static int init_qdisc(libxl__checkpoint_devices_state *cds,
>                        libxl__remus_device_nic *remus_nic)
>  {
>      int rc, ret, ifindex;
>      struct rtnl_link *ifb = NULL;
>      struct rtnl_qdisc *qdisc = NULL;
>  
> -    STATE_AO_GC(rds->ao);
> +    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(rds->nlsock, rds->qdisc_cache);
> +    ret = nl_cache_refill(cds->nlsock, cds->qdisc_cache);
>      if (ret) {
>          LOG(ERROR, "cannot refill qdisc cache: %s", nl_geterror(ret));
>          rc = ERROR_FAIL;
> @@ -164,7 +164,7 @@ static int init_qdisc(libxl__remus_devices_state *rds,
>      }
>  
>      /* get a handle to the REMUS_IFB interface */
> -    ret = rtnl_link_get_kernel(rds->nlsock, 0, remus_nic->ifb, &ifb);
> +    ret = rtnl_link_get_kernel(cds->nlsock, 0, remus_nic->ifb, &ifb);
>      if (ret) {
>          LOG(ERROR, "cannot obtain handle for %s: %s", remus_nic->ifb,
>              nl_geterror(ret));
> @@ -187,7 +187,7 @@ static int init_qdisc(libxl__remus_devices_state *rds,
>       * 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(rds->qdisc_cache, ifindex, TC_H_ROOT);
> +    qdisc = rtnl_qdisc_get_by_parent(cds->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. */
> @@ -231,19 +231,19 @@ static void netbuf_teardown_script_cb(libxl__egc *egc,
>   * $REMUS_IFB (for teardown)
>   * setup/teardown as command line arg.
>   */
> -static void setup_async_exec(libxl__remus_device *dev, char *op)
> +static void setup_async_exec(libxl__checkpoint_device *dev, char *op)
>  {
>      int arraysize, nr = 0;
>      char **env = NULL, **args = NULL;
>      libxl__remus_device_nic *remus_nic = dev->concrete_data;
> -    libxl__remus_devices_state *rds = dev->rds;
> +    libxl__checkpoint_devices_state *cds = dev->cds;
>      libxl__async_exec_state *aes = &dev->aodev.aes;
>  
> -    STATE_AO_GC(rds->ao);
> +    STATE_AO_GC(cds->ao);
>  
>      /* Convenience aliases */
> -    char *const script = libxl__strdup(gc, rds->netbufscript);
> -    const uint32_t domid = rds->domid;
> +    char *const script = libxl__strdup(gc, cds->netbufscript);
> +    const uint32_t domid = cds->domid;
>      const int dev_id = remus_nic->devid;
>      const char *const vif = remus_nic->vif;
>      const char *const ifb = remus_nic->ifb;
> @@ -269,7 +269,7 @@ static void setup_async_exec(libxl__remus_device *dev, char *op)
>      args[nr++] = NULL;
>      assert(nr == arraysize);
>  
> -    aes->ao = dev->rds->ao;
> +    aes->ao = dev->cds->ao;
>      aes->what = GCSPRINTF("%s %s", args[0], args[1]);
>      aes->env = env;
>      aes->args = args;
> @@ -286,13 +286,13 @@ static void setup_async_exec(libxl__remus_device *dev, char *op)
>  
>  /* setup() and teardown() */
>  
> -static void nic_setup(libxl__egc *egc, libxl__remus_device *dev)
> +static void nic_setup(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
>      int rc;
>      libxl__remus_device_nic *remus_nic;
>      const libxl_device_nic *nic = dev->backend_dev;
>  
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      /*
>       * thers's no subkind of nic devices, so nic ops is always matched
> @@ -330,16 +330,16 @@ static void netbuf_setup_script_cb(libxl__egc *egc,
>                                     int status)
>  {
>      libxl__ao_device *aodev = CONTAINER_OF(aes, *aodev, aes);
> -    libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev);
> +    libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev);
>      libxl__remus_device_nic *remus_nic = dev->concrete_data;
> -    libxl__remus_devices_state *rds = dev->rds;
> +    libxl__checkpoint_devices_state *cds = dev->cds;
>      const char *out_path_base, *hotplug_error = NULL;
>      int rc;
>  
> -    STATE_AO_GC(rds->ao);
> +    STATE_AO_GC(cds->ao);
>  
>      /* Convenience aliases */
> -    const uint32_t domid = rds->domid;
> +    const uint32_t domid = cds->domid;
>      const int devid = remus_nic->devid;
>      const char *const vif = remus_nic->vif;
>      const char **const ifb = &remus_nic->ifb;
> @@ -373,7 +373,7 @@ static void netbuf_setup_script_cb(libxl__egc *egc,
>  
>      if (hotplug_error) {
>          LOG(ERROR, "netbuf script %s setup failed for vif %s: %s",
> -            rds->netbufscript, vif, hotplug_error);
> +            cds->netbufscript, vif, hotplug_error);
>          rc = ERROR_FAIL;
>          goto out;
>      }
> @@ -384,17 +384,17 @@ static void netbuf_setup_script_cb(libxl__egc *egc,
>      }
>  
>      LOG(DEBUG, "%s will buffer packets from vif %s", *ifb, vif);
> -    rc = init_qdisc(rds, remus_nic);
> +    rc = init_qdisc(cds, remus_nic);
>  
>  out:
>      aodev->rc = rc;
>      aodev->callback(egc, aodev);
>  }
>  
> -static void nic_teardown(libxl__egc *egc, libxl__remus_device *dev)
> +static void nic_teardown(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
>      int rc;
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      setup_async_exec(dev, "teardown");
>  
> @@ -415,7 +415,7 @@ static void netbuf_teardown_script_cb(libxl__egc *egc,
>  {
>      int rc;
>      libxl__ao_device *aodev = CONTAINER_OF(aes, *aodev, aes);
> -    libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev);
> +    libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev);
>      libxl__remus_device_nic *remus_nic = dev->concrete_data;
>  
>      if (status)
> @@ -440,12 +440,12 @@ enum {
>  /* API implementations */
>  
>  static int remus_netbuf_op(libxl__remus_device_nic *remus_nic,
> -                           libxl__remus_devices_state *rds,
> +                           libxl__checkpoint_devices_state *cds,
>                             int buffer_op)
>  {
>      int rc, ret;
>  
> -    STATE_AO_GC(rds->ao);
> +    STATE_AO_GC(cds->ao);
>  
>      if (buffer_op == tc_buffer_start)
>          ret = rtnl_qdisc_plug_buffer(remus_nic->qdisc);
> @@ -457,7 +457,7 @@ static int remus_netbuf_op(libxl__remus_device_nic *remus_nic,
>          goto out;
>      }
>  
> -    ret = rtnl_qdisc_add(rds->nlsock, remus_nic->qdisc, NLM_F_REQUEST);
> +    ret = rtnl_qdisc_add(cds->nlsock, remus_nic->qdisc, NLM_F_REQUEST);
>      if (ret) {
>          rc = ERROR_FAIL;
>          goto out;
> @@ -474,33 +474,33 @@ out:
>      return rc;
>  }
>  
> -static void nic_postsuspend(libxl__egc *egc, libxl__remus_device *dev)
> +static void nic_postsuspend(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
>      int rc;
>      libxl__remus_device_nic *remus_nic = dev->concrete_data;
>  
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
> -    rc = remus_netbuf_op(remus_nic, dev->rds, tc_buffer_start);
> +    rc = remus_netbuf_op(remus_nic, dev->cds, tc_buffer_start);
>  
>      dev->aodev.rc = rc;
>      dev->aodev.callback(egc, &dev->aodev);
>  }
>  
> -static void nic_commit(libxl__egc *egc, libxl__remus_device *dev)
> +static void nic_commit(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
>      int rc;
>      libxl__remus_device_nic *remus_nic = dev->concrete_data;
>  
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
> -    rc = remus_netbuf_op(remus_nic, dev->rds, tc_buffer_release);
> +    rc = remus_netbuf_op(remus_nic, dev->cds, tc_buffer_release);
>  
>      dev->aodev.rc = rc;
>      dev->aodev.callback(egc, &dev->aodev);
>  }
>  
> -const libxl__remus_device_instance_ops remus_device_nic = {
> +const libxl__checkpoint_device_instance_ops remus_device_nic = {
>      .kind = LIBXL__DEVICE_KIND_VIF,
>      .setup = nic_setup,
>      .teardown = nic_teardown,
> diff --git a/tools/libxl/libxl_nonetbuffer.c b/tools/libxl/libxl_nonetbuffer.c
> index 3c659c2..4b68152 100644
> --- a/tools/libxl/libxl_nonetbuffer.c
> +++ b/tools/libxl/libxl_nonetbuffer.c
> @@ -22,25 +22,25 @@ int libxl__netbuffer_enabled(libxl__gc *gc)
>      return 0;
>  }
>  
> -int init_subkind_nic(libxl__remus_devices_state *rds)
> +int init_subkind_nic(libxl__checkpoint_devices_state *cds)
>  {
>      return 0;
>  }
>  
> -void cleanup_subkind_nic(libxl__remus_devices_state *rds)
> +void cleanup_subkind_nic(libxl__checkpoint_devices_state *cds)
>  {
>      return;
>  }
>  
> -static void nic_setup(libxl__egc *egc, libxl__remus_device *dev)
> +static void nic_setup(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      dev->aodev.rc = ERROR_FAIL;
>      dev->aodev.callback(egc, &dev->aodev);
>  }
>  
> -const libxl__remus_device_instance_ops remus_device_nic = {
> +const libxl__checkpoint_device_instance_ops remus_device_nic = {
>      .kind = LIBXL__DEVICE_KIND_VIF,
>      .setup = nic_setup,
>  };
> diff --git a/tools/libxl/libxl_remus.c b/tools/libxl/libxl_remus.c
> index 0c449ad..fe4acc8 100644
> --- a/tools/libxl/libxl_remus.c
> +++ b/tools/libxl/libxl_remus.c
> @@ -20,14 +20,14 @@
>  /*----- Remus setup and teardown -----*/
>  
>  static void remus_setup_done(libxl__egc *egc,
> -                             libxl__remus_devices_state *rds, int rc);
> +                             libxl__checkpoint_devices_state *cds, int rc);
>  static void remus_setup_failed(libxl__egc *egc,
> -                               libxl__remus_devices_state *rds, int rc);
> +                               libxl__checkpoint_devices_state *cds, int rc);
>  
>  void libxl__remus_setup(libxl__egc *egc, libxl__domain_save_state *dss)
>  {
>      /* Convenience aliases */
> -    libxl__remus_devices_state *const rds = &dss->rds;
> +    libxl__checkpoint_devices_state *const cds = &dss->cds;
>      const libxl_domain_remus_info *const info = dss->remus;
>  
>      STATE_AO_GC(dss->ao);
> @@ -37,17 +37,17 @@ void libxl__remus_setup(libxl__egc *egc, libxl__domain_save_state *dss)
>              LOG(ERROR, "Remus: No support for network buffering");
>              goto out;
>          }
> -        rds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VIF);
> +        cds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VIF);
>      }
>  
>      if (libxl_defbool_val(info->diskbuf))
> -        rds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VBD);
> +        cds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VBD);
>  
> -    rds->ao = ao;
> -    rds->domid = dss->domid;
> -    rds->callback = remus_setup_done;
> +    cds->ao = ao;
> +    cds->domid = dss->domid;
> +    cds->callback = remus_setup_done;
>  
> -    libxl__remus_devices_setup(egc, rds);
> +    libxl__checkpoint_devices_setup(egc, cds);
>      return;
>  
>  out:
> @@ -55,9 +55,9 @@ out:
>  }
>  
>  static void remus_setup_done(libxl__egc *egc,
> -                             libxl__remus_devices_state *rds, int rc)
> +                                   libxl__checkpoint_devices_state *cds, int rc)
>  {
> -    libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds);
> +    libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds);
>      STATE_AO_GC(dss->ao);
>  
>      if (!rc) {
> @@ -67,14 +67,14 @@ static void remus_setup_done(libxl__egc *egc,
>  
>      LOG(ERROR, "Remus: failed to setup device for guest with domid %u, rc %d",
>          dss->domid, rc);
> -    rds->callback = remus_setup_failed;
> -    libxl__remus_devices_teardown(egc, rds);
> +    cds->callback = remus_setup_failed;
> +    libxl__checkpoint_devices_teardown(egc, cds);
>  }
>  
>  static void remus_setup_failed(libxl__egc *egc,
> -                               libxl__remus_devices_state *rds, int rc)
> +                               libxl__checkpoint_devices_state *cds, int rc)
>  {
> -    libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds);
> +    libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds);
>      STATE_AO_GC(dss->ao);
>  
>      if (rc)
> @@ -85,7 +85,7 @@ static void remus_setup_failed(libxl__egc *egc,
>  }
>  
>  static void remus_teardown_done(libxl__egc *egc,
> -                                libxl__remus_devices_state *rds,
> +                                libxl__checkpoint_devices_state *cds,
>                                  int rc);
>  void libxl__remus_teardown(libxl__egc *egc,
>                             libxl__domain_save_state *dss,
> @@ -95,15 +95,15 @@ void libxl__remus_teardown(libxl__egc *egc,
>  
>      LOG(WARN, "Remus: Domain suspend terminated with rc %d,"
>          " teardown Remus devices...", rc);
> -    dss->rds.callback = remus_teardown_done;
> -    libxl__remus_devices_teardown(egc, &dss->rds);
> +    dss->cds.callback = remus_teardown_done;
> +    libxl__checkpoint_devices_teardown(egc, &dss->cds);
>  }
>  
>  static void remus_teardown_done(libxl__egc *egc,
> -                                libxl__remus_devices_state *rds,
> +                                libxl__checkpoint_devices_state *cds,
>                                  int rc)
>  {
> -    libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds);
> +    libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds);
>      STATE_AO_GC(dss->ao);
>  
>      if (rc)
> @@ -118,10 +118,10 @@ static void remus_teardown_done(libxl__egc *egc,
>  static void remus_domain_suspend_callback_common_done(libxl__egc *egc,
>                                  libxl__domain_suspend_state *dsps, int ok);
>  static void remus_devices_postsuspend_cb(libxl__egc *egc,
> -                                         libxl__remus_devices_state *rds,
> +                                         libxl__checkpoint_devices_state *cds,
>                                           int rc);
>  static void remus_devices_preresume_cb(libxl__egc *egc,
> -                                       libxl__remus_devices_state *rds,
> +                                       libxl__checkpoint_devices_state *cds,
>                                         int rc);
>  
>  void libxl__remus_domain_suspend_callback(void *data)
> @@ -143,9 +143,9 @@ static void remus_domain_suspend_callback_common_done(libxl__egc *egc,
>      if (!ok)
>          goto out;
>  
> -    libxl__remus_devices_state *const rds = &dss->rds;
> -    rds->callback = remus_devices_postsuspend_cb;
> -    libxl__remus_devices_postsuspend(egc, rds);
> +    libxl__checkpoint_devices_state *const cds = &dss->cds;
> +    cds->callback = remus_devices_postsuspend_cb;
> +    libxl__checkpoint_devices_postsuspend(egc, cds);
>      return;
>  
>  out:
> @@ -153,11 +153,11 @@ out:
>  }
>  
>  static void remus_devices_postsuspend_cb(libxl__egc *egc,
> -                                         libxl__remus_devices_state *rds,
> +                                         libxl__checkpoint_devices_state *cds,
>                                           int rc)
>  {
>      int ok = 0;
> -    libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds);
> +    libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds);
>  
>      if (rc)
>          goto out;
> @@ -175,17 +175,17 @@ void libxl__remus_domain_resume_callback(void *data)
>      libxl__domain_save_state *dss = CONTAINER_OF(shs, *dss, shs);
>      STATE_AO_GC(dss->ao);
>  
> -    libxl__remus_devices_state *const rds = &dss->rds;
> -    rds->callback = remus_devices_preresume_cb;
> -    libxl__remus_devices_preresume(egc, rds);
> +    libxl__checkpoint_devices_state *const cds = &dss->cds;
> +    cds->callback = remus_devices_preresume_cb;
> +    libxl__checkpoint_devices_preresume(egc, cds);
>  }
>  
>  static void remus_devices_preresume_cb(libxl__egc *egc,
> -                                       libxl__remus_devices_state *rds,
> +                                       libxl__checkpoint_devices_state *cds,
>                                         int rc)
>  {
>      int ok = 0;
> -    libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds);
> +    libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds);
>      STATE_AO_GC(dss->ao);
>  
>      if (rc)
> @@ -207,7 +207,7 @@ out:
>  static void remus_checkpoint_stream_written(
>                      libxl__egc *egc, libxl__stream_write_state *stream, int rc);
>  static void remus_devices_commit_cb(libxl__egc *egc,
> -                                    libxl__remus_devices_state *rds,
> +                                    libxl__checkpoint_devices_state *cds,
>                                      int rc);
>  static void remus_next_checkpoint(libxl__egc *egc, libxl__ev_time *ev,
>                                    const struct timeval *requested_abs);
> @@ -229,7 +229,7 @@ static void remus_checkpoint_stream_written(
>      libxl__domain_save_state *dss = CONTAINER_OF(stream, *dss, sws);
>  
>      /* Convenience aliases */
> -    libxl__remus_devices_state *const rds = &dss->rds;
> +    libxl__checkpoint_devices_state *const cds = &dss->cds;
>  
>      STATE_AO_GC(dss->ao);
>  
> @@ -238,8 +238,8 @@ static void remus_checkpoint_stream_written(
>          goto out;
>      }
>  
> -    rds->callback = remus_devices_commit_cb;
> -    libxl__remus_devices_commit(egc, rds);
> +    cds->callback = remus_devices_commit_cb;
> +    libxl__checkpoint_devices_commit(egc, cds);
>  
>      return;
>  
> @@ -248,10 +248,10 @@ out:
>  }
>  
>  static void remus_devices_commit_cb(libxl__egc *egc,
> -                                    libxl__remus_devices_state *rds,
> +                                    libxl__checkpoint_devices_state *cds,
>                                      int rc)
>  {
> -    libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds);
> +    libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds);
>  
>      STATE_AO_GC(dss->ao);
>  
> diff --git a/tools/libxl/libxl_remus_device.c b/tools/libxl/libxl_remus_device.c
> deleted file mode 100644
> index a6cb7f6..0000000
> --- a/tools/libxl/libxl_remus_device.c
> +++ /dev/null
> @@ -1,327 +0,0 @@
> -/*
> - * Copyright (C) 2014 FUJITSU LIMITED
> - * Author: Yang Hongyang <yanghy@cn.fujitsu.com>
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU Lesser General Public License as published
> - * by the Free Software Foundation; version 2.1 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU Lesser General Public License for more details.
> - */
> -
> -#include "libxl_osdeps.h" /* must come before any other headers */
> -
> -#include "libxl_internal.h"
> -
> -extern const libxl__remus_device_instance_ops remus_device_nic;
> -extern const libxl__remus_device_instance_ops remus_device_drbd_disk;
> -static const libxl__remus_device_instance_ops *remus_ops[] = {
> -    &remus_device_nic,
> -    &remus_device_drbd_disk,
> -    NULL,
> -};
> -
> -/*----- helper functions -----*/
> -
> -static int init_device_subkind(libxl__remus_devices_state *rds)
> -{
> -    /* init device subkind-specific state in the libxl ctx */
> -    int rc;
> -    STATE_AO_GC(rds->ao);
> -
> -    if (libxl__netbuffer_enabled(gc)) {
> -        rc = init_subkind_nic(rds);
> -        if (rc) goto out;
> -    }
> -
> -    rc = init_subkind_drbd_disk(rds);
> -    if (rc) goto out;
> -
> -    rc = 0;
> -out:
> -    return rc;
> -}
> -
> -static void cleanup_device_subkind(libxl__remus_devices_state *rds)
> -{
> -    /* cleanup device subkind-specific state in the libxl ctx */
> -    STATE_AO_GC(rds->ao);
> -
> -    if (libxl__netbuffer_enabled(gc))
> -        cleanup_subkind_nic(rds);
> -
> -    cleanup_subkind_drbd_disk(rds);
> -}
> -
> -/*----- setup() and teardown() -----*/
> -
> -/* callbacks */
> -
> -static void all_devices_setup_cb(libxl__egc *egc,
> -                                 libxl__multidev *multidev,
> -                                 int rc);
> -static void device_setup_iterate(libxl__egc *egc,
> -                                 libxl__ao_device *aodev);
> -static void devices_teardown_cb(libxl__egc *egc,
> -                                libxl__multidev *multidev,
> -                                int rc);
> -
> -/* remus device setup and teardown */
> -
> -static libxl__remus_device* remus_device_init(libxl__egc *egc,
> -                                              libxl__remus_devices_state *rds,
> -                                              libxl__device_kind kind,
> -                                              void *libxl_dev)
> -{
> -    libxl__remus_device *dev = NULL;
> -
> -    STATE_AO_GC(rds->ao);
> -    GCNEW(dev);
> -    dev->backend_dev = libxl_dev;
> -    dev->kind = kind;
> -    dev->rds = rds;
> -
> -    return dev;
> -}
> -
> -static void remus_devices_setup(libxl__egc *egc,
> -                                libxl__remus_devices_state *rds);
> -
> -void libxl__remus_devices_setup(libxl__egc *egc, libxl__remus_devices_state *rds)
> -{
> -    int i, rc;
> -
> -    STATE_AO_GC(rds->ao);
> -
> -    rc = init_device_subkind(rds);
> -    if (rc)
> -        goto out;
> -
> -    rds->num_devices = 0;
> -    rds->num_nics = 0;
> -    rds->num_disks = 0;
> -
> -    if (rds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VIF))
> -        rds->nics = libxl_device_nic_list(CTX, rds->domid, &rds->num_nics);
> -
> -    if (rds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VBD))
> -        rds->disks = libxl_device_disk_list(CTX, rds->domid, &rds->num_disks);
> -
> -    if (rds->num_nics == 0 && rds->num_disks == 0)
> -        goto out;
> -
> -    GCNEW_ARRAY(rds->devs, rds->num_nics + rds->num_disks);
> -
> -    for (i = 0; i < rds->num_nics; i++) {
> -        rds->devs[rds->num_devices++] = remus_device_init(egc, rds,
> -                                                LIBXL__DEVICE_KIND_VIF,
> -                                                &rds->nics[i]);
> -    }
> -
> -    for (i = 0; i < rds->num_disks; i++) {
> -        rds->devs[rds->num_devices++] = remus_device_init(egc, rds,
> -                                                LIBXL__DEVICE_KIND_VBD,
> -                                                &rds->disks[i]);
> -    }
> -
> -    remus_devices_setup(egc, rds);
> -
> -    return;
> -
> -out:
> -    rds->callback(egc, rds, rc);
> -}
> -
> -static void remus_devices_setup(libxl__egc *egc,
> -                                libxl__remus_devices_state *rds)
> -{
> -    int i, rc;
> -
> -    STATE_AO_GC(rds->ao);
> -
> -    libxl__multidev_begin(ao, &rds->multidev);
> -    rds->multidev.callback = all_devices_setup_cb;
> -    for (i = 0; i < rds->num_devices; i++) {
> -        libxl__remus_device *dev = rds->devs[i];
> -        dev->ops_index = -1;
> -        libxl__multidev_prepare_with_aodev(&rds->multidev, &dev->aodev);
> -
> -        dev->aodev.rc = ERROR_REMUS_DEVICE_NOT_SUPPORTED;
> -        dev->aodev.callback = device_setup_iterate;
> -        device_setup_iterate(egc,&dev->aodev);
> -    }
> -
> -    rc = 0;
> -    libxl__multidev_prepared(egc, &rds->multidev, rc);
> -}
> -
> -
> -static void device_setup_iterate(libxl__egc *egc, libxl__ao_device *aodev)
> -{
> -    libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev);
> -    EGC_GC;
> -
> -    if (aodev->rc != ERROR_REMUS_DEVICE_NOT_SUPPORTED &&
> -        aodev->rc != ERROR_REMUS_DEVOPS_DOES_NOT_MATCH)
> -        /* might be success or disaster */
> -        goto out;
> -
> -    do {
> -        dev->ops = remus_ops[++dev->ops_index];
> -        if (!dev->ops) {
> -            libxl_device_nic * nic = NULL;
> -            libxl_device_disk * disk = NULL;
> -            uint32_t domid;
> -            int devid;
> -            if (dev->kind == LIBXL__DEVICE_KIND_VIF) {
> -                nic = (libxl_device_nic *)dev->backend_dev;
> -                domid = nic->backend_domid;
> -                devid = nic->devid;
> -            } else if (dev->kind == LIBXL__DEVICE_KIND_VBD) {
> -                disk = (libxl_device_disk *)dev->backend_dev;
> -                domid = disk->backend_domid;
> -                devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
> -            } else {
> -                LOG(ERROR,"device kind not handled by remus: %s",
> -                    libxl__device_kind_to_string(dev->kind));
> -                aodev->rc = ERROR_FAIL;
> -                goto out;
> -            }
> -            LOG(ERROR,"device not handled by remus"
> -                " (device=%s:%"PRId32"/%"PRId32")",
> -                libxl__device_kind_to_string(dev->kind),
> -                domid, devid);
> -            aodev->rc = ERROR_REMUS_DEVICE_NOT_SUPPORTED;
> -            goto out;
> -        }
> -    } while (dev->ops->kind != dev->kind);
> -
> -    /* found the next ops_index to try */
> -    assert(dev->aodev.callback == device_setup_iterate);
> -    dev->ops->setup(egc,dev);
> -    return;
> -
> - out:
> -    libxl__multidev_one_callback(egc,aodev);
> -}
> -
> -static void all_devices_setup_cb(libxl__egc *egc,
> -                                 libxl__multidev *multidev,
> -                                 int rc)
> -{
> -    STATE_AO_GC(multidev->ao);
> -
> -    /* Convenience aliases */
> -    libxl__remus_devices_state *const rds =
> -                            CONTAINER_OF(multidev, *rds, multidev);
> -
> -    rds->callback(egc, rds, rc);
> -}
> -
> -void libxl__remus_devices_teardown(libxl__egc *egc,
> -                                   libxl__remus_devices_state *rds)
> -{
> -    int i;
> -    libxl__remus_device *dev;
> -
> -    STATE_AO_GC(rds->ao);
> -
> -    libxl__multidev_begin(ao, &rds->multidev);
> -    rds->multidev.callback = devices_teardown_cb;
> -    for (i = 0; i < rds->num_devices; i++) {
> -        dev = rds->devs[i];
> -        if (!dev->ops || !dev->matched)
> -            continue;
> -
> -        libxl__multidev_prepare_with_aodev(&rds->multidev, &dev->aodev);
> -        dev->ops->teardown(egc,dev);
> -    }
> -
> -    libxl__multidev_prepared(egc, &rds->multidev, 0);
> -}
> -
> -static void devices_teardown_cb(libxl__egc *egc,
> -                                libxl__multidev *multidev,
> -                                int rc)
> -{
> -    int i;
> -
> -    STATE_AO_GC(multidev->ao);
> -
> -    /* Convenience aliases */
> -    libxl__remus_devices_state *const rds =
> -                            CONTAINER_OF(multidev, *rds, multidev);
> -
> -    /* clean nic */
> -    for (i = 0; i < rds->num_nics; i++)
> -        libxl_device_nic_dispose(&rds->nics[i]);
> -    free(rds->nics);
> -    rds->nics = NULL;
> -    rds->num_nics = 0;
> -
> -    /* clean disk */
> -    for (i = 0; i < rds->num_disks; i++)
> -        libxl_device_disk_dispose(&rds->disks[i]);
> -    free(rds->disks);
> -    rds->disks = NULL;
> -    rds->num_disks = 0;
> -
> -    cleanup_device_subkind(rds);
> -
> -    rds->callback(egc, rds, rc);
> -}
> -
> -/*----- checkpointing APIs -----*/
> -
> -/* callbacks */
> -
> -static void devices_checkpoint_cb(libxl__egc *egc,
> -                                  libxl__multidev *multidev,
> -                                  int rc);
> -
> -/* API implementations */
> -
> -#define define_remus_checkpoint_api(api)                                \
> -void libxl__remus_devices_##api(libxl__egc *egc,                        \
> -                                libxl__remus_devices_state *rds)        \
> -{                                                                       \
> -    int i;                                                              \
> -    libxl__remus_device *dev;                                           \
> -                                                                        \
> -    STATE_AO_GC(rds->ao);                                               \
> -                                                                        \
> -    libxl__multidev_begin(ao, &rds->multidev);                          \
> -    rds->multidev.callback = devices_checkpoint_cb;                     \
> -    for (i = 0; i < rds->num_devices; i++) {                            \
> -        dev = rds->devs[i];                                             \
> -        if (!dev->matched || !dev->ops->api)                            \
> -            continue;                                                   \
> -        libxl__multidev_prepare_with_aodev(&rds->multidev, &dev->aodev);\
> -        dev->ops->api(egc,dev);                                         \
> -    }                                                                   \
> -                                                                        \
> -    libxl__multidev_prepared(egc, &rds->multidev, 0);                   \
> -}
> -
> -define_remus_checkpoint_api(postsuspend);
> -
> -define_remus_checkpoint_api(preresume);
> -
> -define_remus_checkpoint_api(commit);
> -
> -static void devices_checkpoint_cb(libxl__egc *egc,
> -                                  libxl__multidev *multidev,
> -                                  int rc)
> -{
> -    STATE_AO_GC(multidev->ao);
> -
> -    /* Convenience aliases */
> -    libxl__remus_devices_state *const rds =
> -                            CONTAINER_OF(multidev, *rds, multidev);
> -
> -    rds->callback(egc, rds, rc);
> -}
> diff --git a/tools/libxl/libxl_remus_disk_drbd.c b/tools/libxl/libxl_remus_disk_drbd.c
> index afe9b61..50b897d 100644
> --- a/tools/libxl/libxl_remus_disk_drbd.c
> +++ b/tools/libxl/libxl_remus_disk_drbd.c
> @@ -26,30 +26,30 @@ typedef struct libxl__remus_drbd_disk {
>      int ackwait;
>  } libxl__remus_drbd_disk;
>  
> -int init_subkind_drbd_disk(libxl__remus_devices_state *rds)
> +int init_subkind_drbd_disk(libxl__checkpoint_devices_state *cds)
>  {
> -    STATE_AO_GC(rds->ao);
> +    STATE_AO_GC(cds->ao);
>  
> -    rds->drbd_probe_script = GCSPRINTF("%s/block-drbd-probe",
> +    cds->drbd_probe_script = GCSPRINTF("%s/block-drbd-probe",
>                                         libxl__xen_script_dir_path());
>  
>      return 0;
>  }
>  
> -void cleanup_subkind_drbd_disk(libxl__remus_devices_state *rds)
> +void cleanup_subkind_drbd_disk(libxl__checkpoint_devices_state *cds)
>  {
>      return;
>  }
>  
>  /*----- helper functions, for async calls -----*/
>  static void drbd_async_call(libxl__egc *egc,
> -                            libxl__remus_device *dev,
> -                            void func(libxl__remus_device *),
> +                            libxl__checkpoint_device *dev,
> +                            void func(libxl__checkpoint_device *),
>                              libxl__ev_child_callback callback)
>  {
>      int pid = -1, rc;
>      libxl__ao_device *aodev = &dev->aodev;
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      /* Fork and call */
>      pid = libxl__ev_child_fork(gc, &aodev->child, callback);
> @@ -82,21 +82,21 @@ static void match_async_exec_cb(libxl__egc *egc,
>  
>  /* implementations */
>  
> -static void match_async_exec(libxl__egc *egc, libxl__remus_device *dev);
> +static void match_async_exec(libxl__egc *egc, libxl__checkpoint_device *dev);
>  
> -static void drbd_setup(libxl__egc *egc, libxl__remus_device *dev)
> +static void drbd_setup(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      match_async_exec(egc, dev);
>  }
>  
> -static void match_async_exec(libxl__egc *egc, libxl__remus_device *dev)
> +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;
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      /* setup env & args */
>      arraysize = 1;
> @@ -107,12 +107,12 @@ static void match_async_exec(libxl__egc *egc, libxl__remus_device *dev)
>      arraysize = 3;
>      nr = 0;
>      GCNEW_ARRAY(aes->args, arraysize);
> -    aes->args[nr++] = dev->rds->drbd_probe_script;
> +    aes->args[nr++] = dev->cds->drbd_probe_script;
>      aes->args[nr++] = disk->pdev_path;
>      aes->args[nr++] = NULL;
>      assert(nr <= arraysize);
>  
> -    aes->ao = dev->rds->ao;
> +    aes->ao = dev->cds->ao;
>      aes->what = GCSPRINTF("%s %s", aes->args[0], aes->args[1]);
>      aes->timeout_ms = LIBXL_HOTPLUG_TIMEOUT * 1000;
>      aes->callback = match_async_exec_cb;
> @@ -137,14 +137,14 @@ static void match_async_exec_cb(libxl__egc *egc,
>  {
>      int rc;
>      libxl__ao_device *aodev = CONTAINER_OF(aes, *aodev, aes);
> -    libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev);
> +    libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev);
>      libxl__remus_drbd_disk *drbd_disk;
>      const libxl_device_disk *disk = dev->backend_dev;
>  
>      STATE_AO_GC(aodev->ao);
>  
>      if (status) {
> -        rc = ERROR_REMUS_DEVOPS_DOES_NOT_MATCH;
> +        rc = ERROR_CHECKPOINT_DEVOPS_DOES_NOT_MATCH;
>          /* BUG: seems to assume that any exit status means `no match' */
>          /* BUG: exit status will have been logged as an error */
>          goto out;
> @@ -169,10 +169,10 @@ out:
>      aodev->callback(egc, aodev);
>  }
>  
> -static void drbd_teardown(libxl__egc *egc, libxl__remus_device *dev)
> +static void drbd_teardown(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
>      libxl__remus_drbd_disk *drbd_disk = dev->concrete_data;
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      close(drbd_disk->ctl_fd);
>      dev->aodev.rc = 0;
> @@ -189,9 +189,9 @@ static void checkpoint_async_call_done(libxl__egc *egc,
>  /* API implementations */
>  
>  /* this op will not wait and block, so implement as sync op */
> -static void drbd_postsuspend(libxl__egc *egc, libxl__remus_device *dev)
> +static void drbd_postsuspend(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      libxl__remus_drbd_disk *rdd = dev->concrete_data;
>  
> @@ -205,16 +205,16 @@ static void drbd_postsuspend(libxl__egc *egc, libxl__remus_device *dev)
>  }
>  
> 
> -static void drbd_preresume_async(libxl__remus_device *dev);
> +static void drbd_preresume_async(libxl__checkpoint_device *dev);
>  
> -static void drbd_preresume(libxl__egc *egc, libxl__remus_device *dev)
> +static void drbd_preresume(libxl__egc *egc, libxl__checkpoint_device *dev)
>  {
> -    STATE_AO_GC(dev->rds->ao);
> +    STATE_AO_GC(dev->cds->ao);
>  
>      drbd_async_call(egc, dev, drbd_preresume_async, checkpoint_async_call_done);
>  }
>  
> -static void drbd_preresume_async(libxl__remus_device *dev)
> +static void drbd_preresume_async(libxl__checkpoint_device *dev)
>  {
>      libxl__remus_drbd_disk *rdd = dev->concrete_data;
>      int ackwait = rdd->ackwait;
> @@ -233,7 +233,7 @@ static void checkpoint_async_call_done(libxl__egc *egc,
>  {
>      int rc;
>      libxl__ao_device *aodev = CONTAINER_OF(child, *aodev, child);
> -    libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev);
> +    libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev);
>      libxl__remus_drbd_disk *rdd = dev->concrete_data;
>  
>      STATE_AO_GC(aodev->ao);
> @@ -251,7 +251,7 @@ out:
>      aodev->callback(egc, aodev);
>  }
>  
> -const libxl__remus_device_instance_ops remus_device_drbd_disk = {
> +const libxl__checkpoint_device_instance_ops remus_device_drbd_disk = {
>      .kind = LIBXL__DEVICE_KIND_VBD,
>      .setup = drbd_setup,
>      .teardown = drbd_teardown,
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 5c7b82d..e05d12b 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -61,8 +61,8 @@ libxl_error = Enumeration("error", [
>      (-15, "LOCK_FAIL"),
>      (-16, "JSON_CONFIG_EMPTY"),
>      (-17, "DEVICE_EXISTS"),
> -    (-18, "REMUS_DEVOPS_DOES_NOT_MATCH"),
> -    (-19, "REMUS_DEVICE_NOT_SUPPORTED"),
> +    (-18, "CHECKPOINT_DEVOPS_DOES_NOT_MATCH"),
> +    (-19, "CHECKPOINT_DEVICE_NOT_SUPPORTED"),
>      (-20, "VNUMA_CONFIG_INVALID"),
>      (-21, "DOMAIN_NOTFOUND"),
>      ], value_namespace = "")

  reply	other threads:[~2015-06-30 10:43 UTC|newest]

Thread overview: 103+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-25  6:25 [PATCH v3 COLOPre 00/26] Prerequisite patches for COLO Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 01/26] tools/libxl: rename libxl__domain_suspend to libxl__domain_save Yang Hongyang
2015-06-29 15:43   ` Ian Campbell
2015-06-30  9:32     ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 02/26] tools/libxl: move domain suspend code into libxl_dom_suspend.c Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 03/26] tools/libxl: move domain resume " Yang Hongyang
2015-06-29 15:44   ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 04/26] tools/libxl: move remus code into libxl_remus.c Yang Hongyang
2015-06-29 15:48   ` Ian Campbell
2015-06-30  9:36     ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 05/26] tools/libxl: move save/restore code into libxl_dom_save.c Yang Hongyang
2015-06-29 15:49   ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 06/26] libxl/save: Refactor libxl__domain_suspend_state Yang Hongyang
2015-06-29 16:01   ` Ian Campbell
2015-06-30  9:43     ` Yang Hongyang
2015-06-30  9:50       ` Ian Campbell
2015-06-30 10:05         ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 07/26] libxc/restore: fix error handle of process_record Yang Hongyang
2015-06-29 16:07   ` Ian Campbell
2015-06-30  9:45     ` Yang Hongyang
2015-07-03  3:12       ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 08/26] tools/libxc: support to resume uncooperative HVM guests Yang Hongyang
2015-06-29 16:27   ` Ian Campbell
2015-06-30 10:08     ` Wen Congyang
2015-06-30 10:59       ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 09/26] tools/libxl: introduce enum type libxl_checkpointed_stream Yang Hongyang
2015-06-29 16:30   ` Ian Campbell
2015-06-30  9:53     ` Yang Hongyang
2015-06-30 10:52       ` Ian Campbell
2015-07-01  2:05         ` Yang Hongyang
2015-07-01 10:36           ` Ian Campbell
2015-07-01 13:43             ` Yang Hongyang
2015-07-01 14:09               ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 10/26] migration/save: pass checkpointed_stream from libxl to libxc Yang Hongyang
2015-06-29 16:33   ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 11/26] tools/libxl: introduce a new API libxl__domain_restore() to load qemu state Yang Hongyang
2015-06-29 16:38   ` Ian Campbell
2015-06-30 10:04     ` Yang Hongyang
2015-06-30 10:54       ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 12/26] tools/libxl: Update libxl_domain_unpause() to support qemu-xen Yang Hongyang
2015-06-30 10:00   ` Ian Campbell
2015-07-01  2:10     ` Yang Hongyang
2015-07-01 10:38       ` Ian Campbell
2015-07-01 13:38         ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 13/26] tools/libxl: introduce libxl__domain_common_switch_qemu_logdirty() Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 14/26] tools/libxl: export logdirty_init Yang Hongyang
2015-06-30 10:01   ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 15/26] tools/libxl: Add back channel to allow migration target send data back Yang Hongyang
2015-06-30 10:07   ` Ian Campbell
2015-07-01  2:28     ` Yang Hongyang
2015-07-01 10:40       ` Ian Campbell
2015-07-01 13:46         ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 16/26] tools/libx{l, c}: add back channel to libxc Yang Hongyang
2015-06-30 10:10   ` Ian Campbell
2015-07-01  2:38     ` Yang Hongyang
2015-07-01 10:42       ` Ian Campbell
2015-07-01 11:01         ` Andrew Cooper
2015-07-01 11:21           ` Ian Campbell
2015-07-01 12:07             ` Ian Jackson
2015-07-01 13:56               ` Yang Hongyang
2015-07-01 13:58                 ` Ian Jackson
2015-07-01 14:21               ` Ian Campbell
2015-07-01 13:54           ` Yang Hongyang
2015-07-01 14:03             ` Andrew Cooper
2015-06-30 10:17   ` Ian Campbell
2015-07-01  2:40     ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 17/26] tools/libx{l, c}: introduce should_checkpoint callback Yang Hongyang
2015-06-30 10:19   ` Ian Campbell
2015-07-01  2:43     ` Yang Hongyang
2015-07-01 10:43       ` Ian Campbell
2015-07-01 13:58         ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 18/26] tools/libx{l, c}: add postcopy/suspend callback to restore side Yang Hongyang
2015-06-30 10:21   ` Ian Campbell
2015-07-01  2:48     ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 19/26] libxc/migration: Specification update for DIRTY_BITMAP records Yang Hongyang
2015-06-30 10:24   ` Ian Campbell
2015-07-01  3:07     ` Yang Hongyang
2015-07-01 10:16       ` Andrew Cooper
2015-07-01 10:27         ` Ian Campbell
2015-07-01 10:39           ` Andrew Cooper
2015-07-01 11:00             ` Ian Campbell
2015-07-03 14:25               ` Andrew Cooper
2015-07-03 14:41                 ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 20/26] libxc/migration: export read_record for common use Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 21/26] tools/libxl: refactor write stream to support back channel Yang Hongyang
2015-06-30 10:28   ` Ian Campbell
2015-07-01  5:33     ` Wen Congyang
2015-07-01 10:45       ` Ian Campbell
2015-07-01 11:09         ` Wen Congyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 22/26] tools/libxl: refactor read " Yang Hongyang
2015-06-30 10:39   ` Ian Campbell
2015-06-25  6:25 ` [PATCH v3 COLOPre 23/26] docs/libxl: Introduce COLO_CONTEXT to support migration v2 colo streams Yang Hongyang
2015-06-30 10:42   ` Ian Campbell
2015-07-01  3:10     ` Yang Hongyang
2015-07-01 10:44       ` Ian Campbell
2015-07-01 14:05         ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 24/26] tools/libxl: rename remus device to checkpoint device Yang Hongyang
2015-06-30 10:43   ` Ian Campbell [this message]
2015-07-01  3:11     ` Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 25/26] tools/libxl: adjust the indentation Yang Hongyang
2015-06-25  6:25 ` [PATCH v3 COLOPre 26/26] tools/libxl: don't touch remus in checkpoint_device Yang Hongyang
2015-06-30 10:50   ` Ian Campbell
2015-07-01  3:11     ` Yang Hongyang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1435661009.21469.86.camel@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=eddie.dong@intel.com \
    --cc=guijianfeng@cn.fujitsu.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=rshriram@cs.ubc.ca \
    --cc=wei.liu2@citrix.com \
    --cc=wency@cn.fujitsu.com \
    --cc=xen-devel@lists.xen.org \
    --cc=yanghy@cn.fujitsu.com \
    --cc=yunhong.jiang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.