# HG changeset patch
# User Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
# Date 1316692512 -7200
# Node ID 9e9c68768676b0e1c9c76599e00d0922c6184602
# Parent a5c9a6083bef9d4789a0194389db234740cd6005
libxl: use hotplug-status to synchronize the destruction of block devices
Use hotplug-status to synchronize the destruction of vbd devices instead of
state, which did not reflect when the hotplug script had been executed.
Signed-off-by: Roger Pau Monne <roger.pau@xxxxxxxxxxxxx>
diff -r a5c9a6083bef -r 9e9c68768676 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c Thu Sep 22 13:55:03 2011 +0200
+++ b/tools/libxl/libxl_device.c Thu Sep 22 13:55:12 2011 +0200
@@ -371,14 +371,26 @@ int libxl__device_destroy(libxl__gc *gc,
libxl_ctx *ctx = libxl__gc_owner(gc);
xs_transaction_t t;
char *state_path = libxl__sprintf(gc, "%s/state", be_path);
+ char *hotplug_path = libxl__sprintf(gc, "%s/hotplug-status", be_path);
char *state = libxl__xs_read(gc, XBT_NULL, state_path);
+ char *hotplug = libxl__xs_read(gc, XBT_NULL, hotplug_path);
int rc = 0;
if (!state)
goto out;
- if (atoi(state) != 4) {
- xs_rm(ctx->xsh, XBT_NULL, be_path);
- goto out;
+
+ if (!strstr(be_path, string_of_kinds[DEVICE_VBD])) {
+ if (atoi(state) != 4) {
+ xs_rm(ctx->xsh, XBT_NULL, be_path);
+ goto out;
+ }
+ } else {
+ if (!hotplug)
+ goto out;
+ if (!strcmp(hotplug, "disconnected")) {
+ xs_rm(ctx->xsh, XBT_NULL, be_path);
+ goto out;
+ }
}
retry_transaction:
@@ -394,8 +406,13 @@ retry_transaction:
}
}
if (!force) {
- xs_watch(ctx->xsh, state_path, be_path);
- rc = 1;
+ if (strstr(be_path, string_of_kinds[DEVICE_VBD])) {
+ xs_watch(ctx->xsh, hotplug_path, be_path);
+ rc = 1;
+ } else {
+ xs_watch(ctx->xsh, state_path, be_path);
+ rc = 1;
+ }
} else {
xs_rm(ctx->xsh, XBT_NULL, be_path);
}
@@ -410,6 +427,7 @@ static int wait_for_dev_destroy(libxl__g
unsigned int n;
fd_set rfds;
char **l1 = NULL;
+ char *state, *hotplug;
rc = 1;
nfds = xs_fileno(ctx->xsh) + 1;
@@ -418,12 +436,26 @@ static int wait_for_dev_destroy(libxl__g
if (select(nfds, &rfds, NULL, NULL, tv) > 0) {
l1 = xs_read_watch(ctx->xsh, &n);
if (l1 != NULL) {
- char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
- if (!state || atoi(state) == 6) {
- xs_unwatch(ctx->xsh, l1[0], l1[1]);
- xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
- LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at
%s", l1[XS_WATCH_TOKEN]);
- rc = 0;
+ if (strstr(l1[XS_WATCH_PATH], "hotplug-status")) {
+ hotplug = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
+ if (!hotplug || !strcmp(hotplug, "disconnected")) {
+ xs_unwatch(ctx->xsh, l1[0], l1[1]);
+ xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
+ LIBXL__LOG(ctx, LIBXL__LOG_DEBUG,
+ "Destroyed device backend at %s hotplug-status: %s",
+ l1[XS_WATCH_TOKEN], hotplug);
+ rc = 0;
+ }
+ } else {
+ state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
+ if (!state || atoi(state) == 6) {
+ xs_unwatch(ctx->xsh, l1[0], l1[1]);
+ xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
+ LIBXL__LOG(ctx, LIBXL__LOG_DEBUG,
+ "Destroyed device backend at %s",
+ l1[XS_WATCH_TOKEN]);
+ rc = 0;
+ }
}
free(l1);
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|