2011/9/30 Ian Campbell <ian.campbell@xxxxxxxxxx>:
> # 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;
This should not be there, or hotplug scripts for VBD device types are
not called. I know Linux doesn't need to call hotplug scripts for VBD,
but NetBSD does. Should we add some kind of helper function or ifdef,
or is it safe to remove this and handle VBD devices normally?
> 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
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|