[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 14 of 27 v3] libxl: split forced and non-forced uses of libxl__device_del
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1318941402 -3600 # Node ID 89233ed65eced3ca2ef6cc1cce7abcdd3e5439e9 # Parent 16805eff73bdac4758dc84a3507918e5697df30a libxl: split forced and non-forced uses of libxl__device_del Most forced users can now simply call libxl__device_destroy directly. libxl__devices_destroy is something of a special case, it is really just iterating over an opaque set of xenstore directories and removing them. Until this can be refactored just do the force-remove case manually, doing otherwise led to too much entanglement with the other callers of libxl__device_destroy which do know about specific device types. For the time being do the same in libxl__device_pci_remove_xenstore. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl.c --- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100 @@ -1074,7 +1074,10 @@ int libxl_device_disk_del(libxl_ctx *ctx device.domid = domid; device.devid = devid; device.kind = DEVICE_VBD; - rc = libxl__device_del(&gc, &device, wait); + if (wait) + rc = libxl__device_del(&gc, &device); + else + rc = libxl__device_destroy(&gc, &device); out_free: libxl__free_all(&gc); return rc; @@ -1286,7 +1289,11 @@ int libxl_device_nic_del(libxl_ctx *ctx, device.domid = domid; device.kind = DEVICE_VIF; - rc = libxl__device_del(&gc, &device, wait); + if (wait) + rc = libxl__device_del(&gc, &device); + else + rc = libxl__device_destroy(&gc, &device); + libxl__free_all(&gc); return rc; } diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100 @@ -401,11 +401,17 @@ out: return rc; } -int libxl__device_destroy(libxl__gc *gc, char *be_path) +int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) { libxl_ctx *ctx = libxl__gc_owner(gc); + char *be_path = libxl__device_backend_path(gc, dev); + char *fe_path = libxl__device_frontend_path(gc, dev); + xs_rm(ctx->xsh, XBT_NULL, be_path); + xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device_destroy_tapdisk(gc, be_path); + return 0; } @@ -466,10 +472,14 @@ 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) { - int rc = force ? libxl__device_destroy(gc, be_path) - : libxl__device_remove(gc, be_path); - if (rc > 0) - n_watches++; + if (force) { + xs_rm(ctx->xsh, XBT_NULL, be_path); + xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device_destroy_tapdisk(gc, be_path); + } else { + if (libxl__device_remove(gc, be_path) > 0) + n_watches++; + } } else { xs_rm(ctx->xsh, XBT_NULL, path); } @@ -480,10 +490,13 @@ 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, "")) { - int rc = force ? libxl__device_destroy(gc, be_path) - : libxl__device_remove(gc, be_path); - if (rc > 0) - n_watches++; + if (force) { + xs_rm(ctx->xsh, XBT_NULL, be_path); + xs_rm(ctx->xsh, XBT_NULL, fe_path); + } else { + if (libxl__device_remove(gc, be_path) > 0) + n_watches++; + } } if (!force) { @@ -507,29 +520,24 @@ out: return 0; } -int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait) +int libxl__device_del(libxl__gc *gc, libxl__device *dev) { libxl_ctx *ctx = libxl__gc_owner(gc); + struct timeval tv; char *backend_path; int rc; backend_path = libxl__device_backend_path(gc, dev); - if (wait) - rc = libxl__device_remove(gc, backend_path); - else - rc = libxl__device_destroy(gc, backend_path); + rc = libxl__device_remove(gc, backend_path); if (rc == -1) { rc = ERROR_FAIL; goto out; } - if (wait) { - struct timeval tv; - tv.tv_sec = LIBXL_DESTROY_TIMEOUT; - tv.tv_usec = 0; - (void)wait_for_dev_destroy(gc, &tv); - } + tv.tv_sec = LIBXL_DESTROY_TIMEOUT; + tv.tv_usec = 0; + (void)wait_for_dev_destroy(gc, &tv); xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev)); rc = 0; diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100 @@ -252,9 +252,9 @@ _hidden int libxl__device_generic_add(li char **bents, char **fents); _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_del(libxl__gc *gc, libxl__device *dev); _hidden int libxl__device_remove(libxl__gc *gc, char *be_path); -_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path); +_hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev); _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 16805eff73bd -r 89233ed65ece tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 +++ b/tools/libxl/libxl_pci.c Tue Oct 18 13:36:42 2011 +0100 @@ -411,7 +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); + xs_rm(ctx->xsh, XBT_NULL, 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 |