# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1317389247 -3600
# Node ID dd195d45be273cf85ef0a614ac69b4498bac6d10
# Parent cefb64e94c5e47858ebe2d76d2448da3d9caa7fb
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.
* the term "destroy" is normally used in libxl for data-type destructors.
Therefore split the function into libxl__device_remove and
libxl__device_force_remove. 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@xxxxxxxxxx>
diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_device.c Fri Sep 30 14:27:27 2011 +0100
@@ -365,7 +365,7 @@ int libxl__device_disk_dev_number(const
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_force_remove(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
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_force_remove(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
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_force_remove(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, lib
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_force_remove(gc, backend_path);
if (rc == -1) {
rc = ERROR_FAIL;
goto out;
diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_internal.h Fri Sep 30 14:27:27 2011 +0100
@@ -253,7 +253,8 @@ _hidden int libxl__device_generic_add(li
_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_force_remove(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 -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_pci.c Fri Sep 30 14:27:27 2011 +0100
@@ -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_force_remove(gc, be_path);
xs_rm(ctx->xsh, XBT_NULL, fe_path);
return 0;
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|