aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorIan Campbell <ian.campbell@citrix.com>2011-10-18 13:36:42 +0100
committerIan Campbell <ian.campbell@citrix.com>2011-10-18 13:36:42 +0100
commit391419266cb6799d6e2c8174403984ce8e566206 (patch)
treefa84c13c42036bec2c9165acb739bae1f55578b2 /tools
parent2720c32fad97d5f60c7279ce149090d524a3ac30 (diff)
downloadxen-391419266cb6799d6e2c8174403984ce8e566206.tar.gz
xen-391419266cb6799d6e2c8174403984ce8e566206.tar.bz2
xen-391419266cb6799d6e2c8174403984ce8e566206.zip
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@citrix.com> Acked-by: Ian Jackson <ian.jackson.citrix.com> Committed-by: Ian Jackson <ian.jackson.citrix.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/libxl/libxl.c11
-rw-r--r--tools/libxl/libxl_device.c48
-rw-r--r--tools/libxl/libxl_internal.h4
-rw-r--r--tools/libxl/libxl_pci.c2
4 files changed, 40 insertions, 25 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index c9a10b7025..fb74751b9f 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -1074,7 +1074,10 @@ int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid,
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, uint32_t domid,
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 --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index ce8b4b63b8..fbaff86be5 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -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, uint32_t domid, int force)
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, uint32_t domid, int force)
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 --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index e44d91851d..dca143db97 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -252,9 +252,9 @@ _hidden int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
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 --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 90e1f73ea0..4c8f4e0c76 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -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;
}