[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 14 of 23] libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_remove_xenstore
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1317389248 -3600 # Node ID ec28ee6dace513c3d009d498341f9537a19b2d98 # Parent e5a70a3b61a1acfa7d73db548a591486024d01b7 libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_remove_xenstore Doing this allows us to use the common functions for removing devices. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Fri Sep 30 14:27:28 2011 +0100 +++ b/tools/libxl/libxl_device.c Fri Sep 30 14:27:28 2011 +0100 @@ -49,6 +49,25 @@ char *libxl__device_backend_path(libxl__ device->domid, device->devid); } +int libxl__parse_backend_path(libxl__gc *gc, + const char *path, + libxl__device *dev) +{ + /* /local/domain/<domid>/backend/<kind>/<domid>/<devid> */ + char strkind[16]; /* Longest is actually "console" */ + uint32_t domain; + int rc = sscanf(path, "/local/domain/%d/backend/%15[^/]/%d/%d", + &dev->backend_domid, + strkind, + &domain, + &dev->backend_devid); + + if (rc != 4) + return ERROR_FAIL; + + return libxl__device_kind_from_string(strkind, &dev->backend_kind); +} + int libxl__device_generic_add(libxl__gc *gc, libxl__device *device, char **bents, char **fents) { @@ -348,10 +367,11 @@ int libxl__device_disk_dev_number(const return -1; } -int libxl__device_remove(libxl__gc *gc, char *be_path) +int libxl__device_remove(libxl__gc *gc, libxl__device *dev) { libxl_ctx *ctx = libxl__gc_owner(gc); xs_transaction_t t; + char *be_path = libxl__device_backend_path(gc, dev); char *state_path = libxl__sprintf(gc, "%s/state", be_path); char *state = libxl__xs_read(gc, XBT_NULL, state_path); int rc = 0; @@ -429,10 +449,12 @@ static int wait_for_dev_destroy(libxl__g int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force) { libxl_ctx *ctx = libxl__gc_owner(gc); - char *path, *be_path, *fe_path; + char *path; unsigned int num1, num2; char **l1 = NULL, **l2 = NULL; int i, j, n_watches = 0; + libxl__device dev; + libxl__device_kind kind; path = libxl__sprintf(gc, "/local/domain/%d/device", domid); l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1); @@ -445,22 +467,27 @@ int libxl__devices_destroy(libxl__gc *gc num1 = 0; } for (i = 0; i < num1; i++) { - if (!strcmp("vfs", l1[i])) + if (libxl__device_kind_from_string(l1[i], &kind)) + continue; + if (kind == LIBXL__DEVICE_KIND_VBD) continue; path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]); l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2); if (!l2) continue; for (j = 0; j < num2; j++) { - 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) { + path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend", + domid, l1[i], l2[j]); + path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path)); + if (path && libxl__parse_backend_path(gc, path, &dev) == 0) { + dev.domid = domid; + dev.kind = kind; + dev.devid = atoi(l2[j]); + 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); + libxl__device_force_remove(gc, &dev); } else { - if (libxl__device_remove(gc, be_path) > 0) + if (libxl__device_remove(gc, &dev) > 0) n_watches++; } } @@ -468,14 +495,18 @@ int libxl__devices_destroy(libxl__gc *gc } /* console 0 frontend directory is not under /local/domain/<domid>/device */ - 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, "")) { + path = libxl__sprintf(gc, "/local/domain/%d/console/backend", domid); + path = libxl__xs_read(gc, XBT_NULL, path); + if (path && strcmp(path, "") && + libxl__parse_backend_path(gc, path, &dev) == 0) { + dev.domid = domid; + dev.kind = LIBXL__DEVICE_KIND_CONSOLE; + dev.devid = 0; + if (force) { - xs_rm(ctx->xsh, XBT_NULL, be_path); - xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device_force_remove(gc, &dev); } else { - if (libxl__device_remove(gc, be_path) > 0) + if (libxl__device_remove(gc, &dev) > 0) n_watches++; } } @@ -505,12 +536,9 @@ int libxl__device_del(libxl__gc *gc, lib { libxl_ctx *ctx = libxl__gc_owner(gc); struct timeval tv; - char *backend_path; int rc; - backend_path = libxl__device_backend_path(gc, dev); - - rc = libxl__device_remove(gc, backend_path); + rc = libxl__device_remove(gc, dev); if (rc == -1) { rc = ERROR_FAIL; goto out; diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Fri Sep 30 14:27:28 2011 +0100 +++ b/tools/libxl/libxl_internal.h Fri Sep 30 14:27:28 2011 +0100 @@ -240,8 +240,10 @@ _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__parse_backend_path(libxl__gc *gc, const char *path, + libxl__device *dev); _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_remove(libxl__gc *gc, libxl__device *dev); _hidden int libxl__device_force_remove(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 e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_pci.c --- a/tools/libxl/libxl_pci.c Fri Sep 30 14:27:28 2011 +0100 +++ b/tools/libxl/libxl_pci.c Fri Sep 30 14:27:28 2011 +0100 @@ -410,9 +410,15 @@ retry_transaction2: goto retry_transaction2; if (num == 1) { - char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path)); - xs_rm(ctx->xsh, XBT_NULL, be_path); - xs_rm(ctx->xsh, XBT_NULL, fe_path); + libxl__device dev; + if (libxl__parse_backend_path(gc, be_path, &dev) != 0) + return ERROR_FAIL; + + dev.domid = domid; + dev.kind = LIBXL__DEVICE_KIND_PCI; + dev.devid = 0; + + libxl__device_force_remove(gc, &dev); return 0; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |