diff options
author | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2011-02-18 15:04:19 +0000 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2011-02-18 15:04:19 +0000 |
commit | b9ef3bf4e1a5724af87097630d71a217cd7de399 (patch) | |
tree | 7f23f0933faec3185b29a4b7c4abbd9ce84c2e5b | |
parent | d721a18a0d4ca9f739ac69e0561f6326ccdd4233 (diff) | |
download | xen-b9ef3bf4e1a5724af87097630d71a217cd7de399.tar.gz xen-b9ef3bf4e1a5724af87097630d71a217cd7de399.tar.bz2 xen-b9ef3bf4e1a5724af87097630d71a217cd7de399.zip |
libxl: fix cd insert/eject
When multiple disks are passed to libxl_wait_for_disk_ejects, watch the
correct disk paths.
Parse the backend type and backend domid from xenstore in
libxl_event_get_disk_eject_info.
libxl_event_get_disk_eject_info must return a valid string in
disk->vdev, while at the moment is free'ed before returning.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
-rw-r--r-- | tools/libxl/libxl.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 0171699a7f..09cf3d948c 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -37,6 +37,9 @@ #include "flexarray.h" #define PAGE_TO_MEMKB(pages) ((pages) * 4) +#define BACKEND_STRING_SIZE 5 +#define STRINGIFY(x) #x +#define TOSTRING(x) STRINGIFY(x) int libxl_ctx_init(libxl_ctx *ctx, int version, xentoollog_logger *lg) { @@ -592,7 +595,7 @@ int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_devic goto out; if (asprintf(&(waiter[i].token), "%d", LIBXL_EVENT_DISK_EJECT) < 0) goto out; - xs_watch(ctx->xsh, waiter->path, waiter->token); + xs_watch(ctx->xsh, waiter[i].path, waiter[i].token); } rc = 0; out: @@ -654,6 +657,7 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event char *path; char *backend; char *value; + char backend_type[BACKEND_STRING_SIZE+1]; value = libxl__xs_read(&gc, XBT_NULL, event->path); @@ -666,12 +670,22 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event path[strlen(path) - 6] = '\0'; backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path)); - disk->backend_domid = 0; + sscanf(backend, + "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d", + &disk->backend_domid, backend_type); + if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) { + disk->backend = DISK_BACKEND_TAP; + } else if (!strcmp(backend_type, "qdisk")) { + disk->backend = DISK_BACKEND_QDISK; + } else { + disk->backend = DISK_BACKEND_UNKNOWN; + } + disk->domid = domid; disk->pdev_path = strdup(""); disk->format = DISK_FORMAT_EMPTY; /* this value is returned to the user: do not free right away */ - disk->vdev = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend)); + disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL); disk->unpluggable = 1; disk->readwrite = 0; disk->is_cdrom = 1; |