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
commit2720c32fad97d5f60c7279ce149090d524a3ac30 (patch)
treed8eb61056de23f8b86ec204c6cfc4ef3a549ca55 /tools
parentc918c9d852268f6e4f6edd8ebcc125cf7b7cdb9d (diff)
downloadxen-2720c32fad97d5f60c7279ce149090d524a3ac30.tar.gz
xen-2720c32fad97d5f60c7279ce149090d524a3ac30.tar.bz2
xen-2720c32fad97d5f60c7279ce149090d524a3ac30.zip
libxl: separate forced and non-forced device remove.
The function libxl__device_destroy currently takes a force parameter however: * in the forced case we initiate a graceful shutdown and then immediately nuke the backend directory, quite likely before anyone got a chance to react. * the callers all have a "wait" variable and pass in "!wait" as the force argument which is confusing since not waiting is not really the same thing as forcing the destroy. Therefore split the function into libxl__device_remove and libxl__device_destroy. The former initiates a graceful shutdown which the latter simply nukes the backend directory. This makes some of the callers look a bit odd but that should fall out as I continue to pull this piece of string. 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_device.c32
-rw-r--r--tools/libxl/libxl_internal.h3
-rw-r--r--tools/libxl/libxl_pci.c3
3 files changed, 25 insertions, 13 deletions
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 88cd9904a9..ce8b4b63b8 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -365,7 +365,7 @@ int libxl__device_disk_dev_number(const char *virtpath, int *pdisk,
return -1;
}
-int libxl__device_destroy(libxl__gc *gc, char *be_path, int force)
+int libxl__device_remove(libxl__gc *gc, char *be_path)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
xs_transaction_t t;
@@ -393,17 +393,22 @@ retry_transaction:
goto out;
}
}
- if (!force) {
- xs_watch(ctx->xsh, state_path, be_path);
- rc = 1;
- } else {
- xs_rm(ctx->xsh, XBT_NULL, be_path);
- }
+
+ xs_watch(ctx->xsh, state_path, be_path);
libxl__device_destroy_tapdisk(gc, be_path);
+ rc = 1;
out:
return rc;
}
+int libxl__device_destroy(libxl__gc *gc, char *be_path)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ xs_rm(ctx->xsh, XBT_NULL, be_path);
+ libxl__device_destroy_tapdisk(gc, be_path);
+ return 0;
+}
+
static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -461,7 +466,9 @@ 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) {
- if (libxl__device_destroy(gc, be_path, force) > 0)
+ int rc = force ? libxl__device_destroy(gc, be_path)
+ : libxl__device_remove(gc, be_path);
+ if (rc > 0)
n_watches++;
} else {
xs_rm(ctx->xsh, XBT_NULL, path);
@@ -473,7 +480,9 @@ 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, "")) {
- if (libxl__device_destroy(gc, be_path, force) > 0)
+ int rc = force ? libxl__device_destroy(gc, be_path)
+ : libxl__device_remove(gc, be_path);
+ if (rc > 0)
n_watches++;
}
@@ -506,7 +515,10 @@ int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait)
backend_path = libxl__device_backend_path(gc, dev);
- rc = libxl__device_destroy(gc, backend_path, !wait);
+ if (wait)
+ rc = libxl__device_remove(gc, backend_path);
+ else
+ rc = libxl__device_destroy(gc, backend_path);
if (rc == -1) {
rc = ERROR_FAIL;
goto out;
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 2e26ac69a3..e44d91851d 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -253,7 +253,8 @@ _hidden int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
_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_destroy(libxl__gc *gc, char *be_path, int force);
+_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__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 33dd0606d4..90e1f73ea0 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -411,8 +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, 1);
- xs_rm(ctx->xsh, XBT_NULL, be_path);
+ libxl__device_destroy(gc, be_path);
xs_rm(ctx->xsh, XBT_NULL, fe_path);
return 0;
}