From a97def2ebbb36191e34cd7d19b94011e8a23b189 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Mon, 23 Jul 2012 13:09:43 +0100 Subject: libxl: rename stubdomain when renaming domain. Otherwise after a localhost migrate of an HVM domain with a stubdomain we end up with domains called "FOO" and "FOO--incoming-dm". This because we initially create the domains as "FOO--incoming" and then rename to "FOO" inorder to maintain the uniqueness of domain names on a host. In this state a second attempt to migrate will fail upon attempting to create a new domain named "FOO--incoming-dm" Signed-off-by: Ian Campbell Acked-by: Ian Jackson Committed-by: Ian Campbell --- tools/libxl/libxl.c | 19 +++++++++++++++++++ tools/libxl/libxl_dm.c | 7 ++++++- tools/libxl/libxl_internal.h | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) (limited to 'tools') diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 0600ce43f3..7e8bf45cf5 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -276,6 +276,8 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid, char *got_old_name; unsigned int got_old_len; xs_transaction_t our_trans = 0; + uint32_t stub_dm_domid; + const char *stub_dm_old_name = NULL, *stub_dm_new_name = NULL; int rc; dom_path = libxl__xs_get_dompath(gc, domid); @@ -284,6 +286,12 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid, name_path= libxl__sprintf(gc, "%s/name", dom_path); if (!name_path) goto x_nomem; + stub_dm_domid = libxl_get_stubdom_id(CTX, domid); + if (stub_dm_domid) { + stub_dm_old_name = libxl__stub_dm_name(gc, old_name); + stub_dm_new_name = libxl__stub_dm_name(gc, new_name); + } + retry_transaction: if (!trans) { trans = our_trans = xs_transaction_start(ctx->xsh); @@ -341,6 +349,17 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid, goto x_fail; } + if (stub_dm_domid) { + rc = libxl__domain_rename(gc, stub_dm_domid, + stub_dm_old_name, + stub_dm_new_name, + trans); + if (rc) { + LOGE(ERROR, "unable to rename stub-domain"); + goto x_rc; + } + } + if (our_trans) { if (!xs_transaction_end(ctx->xsh, our_trans, 0)) { trans = our_trans = 0; diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 6a041f96b9..0591c1c909 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -698,6 +698,11 @@ static void spaw_stubdom_pvqemu_destroy_cb(libxl__egc *egc, libxl__destroy_domid_state *dis, int rc); +char *libxl__stub_dm_name(libxl__gc *gc, const char *guest_name) +{ + return libxl__sprintf(gc, "%s-dm", guest_name); +} + void libxl__spawn_stub_dm(libxl__egc *egc, libxl__stub_dm_spawn_state *sdss) { STATE_AO_GC(sdss->dm.spawn.ao); @@ -727,7 +732,7 @@ void libxl__spawn_stub_dm(libxl__egc *egc, libxl__stub_dm_spawn_state *sdss) libxl_domain_create_info_init(&dm_config->c_info); dm_config->c_info.type = LIBXL_DOMAIN_TYPE_PV; - dm_config->c_info.name = libxl__sprintf(gc, "%s-dm", + dm_config->c_info.name = libxl__stub_dm_name(gc, libxl__domid_to_name(gc, guest_domid)); dm_config->c_info.ssidref = guest_config->b_info.device_model_ssidref; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 52d79a95d6..f832fbd9e5 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2247,6 +2247,8 @@ typedef struct { _hidden void libxl__spawn_stub_dm(libxl__egc *egc, libxl__stub_dm_spawn_state*); +_hidden char *libxl__stub_dm_name(libxl__gc *gc, const char * guest_name); + /*----- Domain creation -----*/ typedef struct libxl__domain_create_state libxl__domain_create_state; -- cgit v1.2.3