[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 06 of 13 RFC] libxl: perform xenstore device cleanup from libxl
# HG changeset patch # User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> # Date 1326728389 -3600 # Node ID f7b6d7cd98202be1ca642949c4722c5e6da75540 # Parent 0b45289e57b9fbeee3780f24a6398f7911a3320c libxl: perform xenstore device cleanup from libxl Perform cleanup of xenstore device entries in libxl, instead of relying on xen-hotplug-cleanup script. Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx> diff -r 0b45289e57b9 -r f7b6d7cd9820 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Sat Jan 14 19:04:48 2012 +0100 +++ b/tools/libxl/libxl_device.c Mon Jan 16 16:39:49 2012 +0100 @@ -414,6 +414,28 @@ start: return rc; } +int libxl__device_cleanup(libxl__gc *gc, libxl__device *dev) { + libxl_ctx *ctx = libxl__gc_owner(gc); + char *path = libxl__device_backend_path(gc, dev); + unsigned int nb = 0; + char *last; + + if (!path) + return 0; + + xs_rm(ctx->xsh, XBT_NULL, path); + + for (last = strrchr(path, '/'); last != NULL; last = strrchr(path, '/')) { + *last = '\0'; + if (!libxl__xs_directory(gc, XBT_NULL, path, &nb)) + continue; + if (nb == 0) { + xs_rm(ctx->xsh, XBT_NULL, path); + } + } + return 0; +} + /* * Handler function for device destruction to be passed to * libxl__wait_for_device_state @@ -421,14 +443,26 @@ start: static int destroy_device(libxl__gc *gc, char **l1, char *state) { libxl_ctx *ctx = libxl__gc_owner(gc); + libxl__device dev; + int rc = -1; xs_unwatch(ctx->xsh, l1[0], l1[1]); - xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]); + + rc = libxl__parse_backend_path(gc, l1[0], &dev); + if (rc < 0) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, + "failed to generate device from backend path %s", + l1[0]); + goto out; + } + + libxl__device_cleanup(gc, &dev); LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at %s", l1[XS_WATCH_TOKEN]); - - return 0; + rc = 0; +out: + return rc; } /* @@ -454,7 +488,7 @@ retry_transaction: if (atoi(state) != 4) { xs_transaction_end(ctx->xsh, t, 0); libxl__device_destroy_tapdisk(gc, be_path); - xs_rm(ctx->xsh, XBT_NULL, be_path); + libxl__device_cleanup(gc, dev); goto out; } @@ -495,7 +529,7 @@ int libxl__device_destroy(libxl__gc *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); + libxl__device_cleanup(gc, dev); xs_rm(ctx->xsh, XBT_NULL, fe_path); libxl__device_destroy_tapdisk(gc, be_path); diff -r 0b45289e57b9 -r f7b6d7cd9820 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Sat Jan 14 19:04:48 2012 +0100 +++ b/tools/libxl/libxl_internal.h Mon Jan 16 16:39:49 2012 +0100 @@ -306,6 +306,11 @@ _hidden int libxl__wait_for_device_state libxl__device_state_handler handler); /* + * libxl__device_cleanup - clean xenstore entries recursively for a given device + */ +_hidden int libxl__device_cleanup(libxl__gc *gc, libxl__device *dev); + +/* * libxl__try_phy_backend - Check if there's support for the passed * type of file using the PHY backend * st_mode: mode_t of the file, as returned by stat function _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |