[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 10 of 23] libxl: separate forced and non-forced device remove
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1317389247 -3600 # Node ID dd195d45be273cf85ef0a614ac69b4498bac6d10 # Parent cefb64e94c5e47858ebe2d76d2448da3d9caa7fb libxl: separate forced and non-forced device remove. The function libxl__device_destroy currently takes a force parameter however: * in the forced case we initiate a graceful shutdown and then immediately nuke the backend directory, quite likely before anyone got a chance to react. * the callers all have a "wait" variable and pass in "!wait" as the force argument which is confusing since not waiting is not really the same thing as forcing the destroy. * the term "destroy" is normally used in libxl for data-type destructors. Therefore split the function into libxl__device_remove and libxl__device_force_remove. The latter simply nukes the backend directory. This makes some of the callers look a bit odd but that should fall out as I continue to pull this piece of string. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Fri Sep 30 14:27:27 2011 +0100 +++ b/tools/libxl/libxl_device.c Fri Sep 30 14:27:27 2011 +0100 @@ -365,7 +365,7 @@ int libxl__device_disk_dev_number(const return -1; } -int libxl__device_destroy(libxl__gc *gc, char *be_path, int force) +int libxl__device_remove(libxl__gc *gc, char *be_path) { libxl_ctx *ctx = libxl__gc_owner(gc); xs_transaction_t t; @@ -393,17 +393,22 @@ retry_transaction: goto out; } } - if (!force) { - xs_watch(ctx->xsh, state_path, be_path); - rc = 1; - } else { - xs_rm(ctx->xsh, XBT_NULL, be_path); - } + + xs_watch(ctx->xsh, state_path, be_path); libxl__device_destroy_tapdisk(gc, be_path); + rc = 1; out: return rc; } +int libxl__device_force_remove(libxl__gc *gc, char *be_path) +{ + libxl_ctx *ctx = libxl__gc_owner(gc); + xs_rm(ctx->xsh, XBT_NULL, be_path); + libxl__device_destroy_tapdisk(gc, be_path); + return 0; +} + static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv) { libxl_ctx *ctx = libxl__gc_owner(gc); @@ -461,7 +466,9 @@ int libxl__devices_destroy(libxl__gc *gc fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]); be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); if (be_path != NULL) { - if (libxl__device_destroy(gc, be_path, force) > 0) + int rc = force ? libxl__device_force_remove(gc, be_path) + : libxl__device_remove(gc, be_path); + if (rc > 0) n_watches++; } else { xs_rm(ctx->xsh, XBT_NULL, path); @@ -473,7 +480,9 @@ int libxl__devices_destroy(libxl__gc *gc fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid); be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path)); if (be_path && strcmp(be_path, "")) { - if (libxl__device_destroy(gc, be_path, force) > 0) + int rc = force ? libxl__device_force_remove(gc, be_path) + : libxl__device_remove(gc, be_path); + if (rc > 0) n_watches++; } @@ -506,7 +515,10 @@ int libxl__device_del(libxl__gc *gc, lib backend_path = libxl__device_backend_path(gc, dev); - rc = libxl__device_destroy(gc, backend_path, !wait); + if (wait) + rc = libxl__device_remove(gc, backend_path); + else + rc = libxl__device_force_remove(gc, backend_path); if (rc == -1) { rc = ERROR_FAIL; goto out; diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Fri Sep 30 14:27:27 2011 +0100 +++ b/tools/libxl/libxl_internal.h Fri Sep 30 14:27:27 2011 +0100 @@ -253,7 +253,8 @@ _hidden int libxl__device_generic_add(li _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device); _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device); _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait); -_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path, int force); +_hidden int libxl__device_remove(libxl__gc *gc, char *be_path); +_hidden int libxl__device_force_remove(libxl__gc *gc, char *be_path); _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force); _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state); diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Fri Sep 30 14:27:27 2011 +0100 +++ b/tools/libxl/libxl_pci.c Fri Sep 30 14:27:27 2011 +0100 @@ -411,8 +411,7 @@ retry_transaction2: if (num == 1) { char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path)); - libxl__device_destroy(gc, be_path, 1); - xs_rm(ctx->xsh, XBT_NULL, be_path); + libxl__device_force_remove(gc, be_path); xs_rm(ctx->xsh, XBT_NULL, fe_path); return 0; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |