# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1318941402 -3600
# Node ID 3505f6b5787bfb7b06f961019a1130b1ebe98882
# Parent 3d4e9f0daad6f6c6b5f18672ca6534bc5a56ceda
libxl: merge libxl__device_del into libxl__device_remove
Note that the "wait" parameter added to libxl_device_remove is different to the
wait paramter previously used by similar functions. In the past not-wait meant
forced whereas now in means wait for a graceful shutdown, as opposed to setting
off a graceful shutdown but not waiting.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Acked-by: Ian Jackson <ian.jackson.citrix.com>
Committed-by: Ian Jackson <ian.jackson.citrix.com>
---
diff -r 3d4e9f0daad6 -r 3505f6b5787b tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c Tue Oct 18 13:36:42 2011 +0100
@@ -1075,7 +1075,7 @@
device.devid = devid;
device.kind = LIBXL__DEVICE_KIND_VBD;
if (wait)
- rc = libxl__device_del(&gc, &device);
+ rc = libxl__device_remove(&gc, &device, wait);
else
rc = libxl__device_destroy(&gc, &device);
out_free:
@@ -1290,7 +1290,7 @@
device.kind = LIBXL__DEVICE_KIND_VIF;
if (wait)
- rc = libxl__device_del(&gc, &device);
+ rc = libxl__device_remove(&gc, &device, wait);
else
rc = libxl__device_destroy(&gc, &device);
diff -r 3d4e9f0daad6 -r 3505f6b5787b tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c Tue Oct 18 13:36:42 2011 +0100
@@ -367,57 +367,6 @@
return -1;
}
-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;
-
- if (!state)
- goto out;
- if (atoi(state) != 4) {
- libxl__device_destroy_tapdisk(gc, be_path);
- xs_rm(ctx->xsh, XBT_NULL, be_path);
- goto out;
- }
-
-retry_transaction:
- t = xs_transaction_start(ctx->xsh);
- xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0",
strlen("0"));
- xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
- if (!xs_transaction_end(ctx->xsh, t, 0)) {
- if (errno == EAGAIN)
- goto retry_transaction;
- else {
- rc = -1;
- goto out;
- }
- }
-
- 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, 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;
-}
-
static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -446,6 +395,71 @@
return rc;
}
+/*
+ * Returns 0 (device already destroyed) or 1 (caller must
+ * wait_for_dev_destroy) on success, ERROR_* on fail.
+ */
+int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
+{
+ 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;
+
+ if (!state)
+ goto out;
+ if (atoi(state) != 4) {
+ libxl__device_destroy_tapdisk(gc, be_path);
+ xs_rm(ctx->xsh, XBT_NULL, be_path);
+ goto out;
+ }
+
+retry_transaction:
+ t = xs_transaction_start(ctx->xsh);
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0",
strlen("0"));
+ xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
+ if (!xs_transaction_end(ctx->xsh, t, 0)) {
+ if (errno == EAGAIN)
+ goto retry_transaction;
+ else {
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ }
+
+ xs_watch(ctx->xsh, state_path, be_path);
+ libxl__device_destroy_tapdisk(gc, be_path);
+
+ if (wait) {
+ struct timeval 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));
+ } else {
+ rc = 1; /* Caller must wait_for_dev_destroy */
+ }
+
+out:
+ return rc;
+}
+
+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;
+}
+
int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -485,8 +499,12 @@
if (force) {
libxl__device_destroy(gc, &dev);
} else {
- if (libxl__device_remove(gc, &dev) > 0)
- n_watches++;
+ int rc = libxl__device_remove(gc, &dev, 0);
+ if (rc < 0)
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+ "cannot remove device %s\n", path);
+ else
+ n_watches += rc;
}
}
}
@@ -504,8 +522,12 @@
if (force) {
libxl__device_destroy(gc, &dev);
} else {
- if (libxl__device_remove(gc, &dev) > 0)
- n_watches++;
+ int rc = libxl__device_remove(gc, &dev, 0);
+ if (rc < 0)
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+ "cannot remove device %s\n", path);
+ else
+ n_watches += rc;
}
}
@@ -530,29 +552,6 @@
return 0;
}
-int libxl__device_del(libxl__gc *gc, libxl__device *dev)
-{
- libxl_ctx *ctx = libxl__gc_owner(gc);
- struct timeval tv;
- int rc;
-
- rc = libxl__device_remove(gc, dev);
- if (rc == -1) {
- rc = ERROR_FAIL;
- goto out;
- }
-
- 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;
-
-out:
- return rc;
-}
-
int libxl__wait_for_device_model(libxl__gc *gc,
uint32_t domid, char *state,
libxl__spawn_starting *spawning,
diff -r 3d4e9f0daad6 -r 3505f6b5787b tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_internal.h Tue Oct 18 13:36:42 2011 +0100
@@ -242,8 +242,7 @@
_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, libxl__device *dev);
+_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait);
_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);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|