static void colo_restore_teardown_devices_done(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc) { libxl__colo_restore_state *crs = cds->concrete_data; libxl__colo_restore_checkpoint_state *crcs = crs->crcs; libxl__domain_create_state *dcs = CONTAINER_OF(crs, *dcs, crs); EGC_GC; if (rc) LOGD(ERROR, cds->domid, "COLO: failed to teardown device for guest," " rc %d", rc); if (crcs->teardown_devices) cleanup_device_subkind(cds); colo_proxy_teardown(&crs->cps); rc = crcs->saved_rc; if (!rc) { crcs->callback = do_failover_done; do_failover(egc, crs); return; } libxl__colo_restore_teardown_done(egc, crs, rc); }
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); }
static void colo_teardown_done(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc) { libxl__colo_save_state *css = cds->concrete_data; libxl__domain_save_state *dss = CONTAINER_OF(css, *dss, css); cleanup_device_subkind(cds); colo_proxy_teardown(&css->cps); dss->callback(egc, dss, rc); }
static void colo_save_setup_failed(libxl__egc *egc, libxl__checkpoint_devices_state *cds, int rc) { libxl__colo_save_state *css = cds->concrete_data; libxl__domain_save_state *dss = CONTAINER_OF(css, *dss, css); STATE_AO_GC(cds->ao); if (rc) LOGD(ERROR, cds->domid, "COLO: failed to teardown device after setup failed" " for guest, rc %d", rc); cleanup_device_subkind(cds); dss->callback(egc, dss, rc); }